/*
 *
 *    Copyright (c) 2022 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
#pragma once

#include <event_groups.h>
#include <wfx_host_events.h>

#ifndef RSI_BLE_ENABLE
#define RSI_BLE_ENABLE (1)
#endif

/*
 * Interface to RSI Sapis
 */

#define WFX_RSI_WLAN_TASK_SZ (1024 + 512 + 256) /* Stack for the WLAN task	 	*/
#define WFX_RSI_TASK_SZ (1024 + 1024)           /* Stack for the WFX/RSI task		*/
#define WFX_RSI_BUF_SZ (1024 * 10)              /* May need tweak 			*/
#define WFX_RSI_CONFIG_MAX_JOIN (5)             /* Max join retries			*/
// TODO: Default values are usually in minutes, but this is in ms. Confirm if this is correct
#define WFX_RSI_DHCP_POLL_INTERVAL (250) /* Poll interval in ms for DHCP		*/
#define WFX_RSI_NUM_TIMERS (2)           /* Number of RSI timers to alloc	*/

typedef enum
{
    WFX_EVT_STA_CONN,
    WFX_EVT_STA_DISCONN,
    WFX_EVT_AP_START,
    WFX_EVT_AP_STOP,
    WFX_EVT_SCAN, /* This is used as scan result and start */
    WFX_EVT_STA_START_JOIN,
    WFX_EVT_STA_DO_DHCP,
    WFX_EVT_STA_DHCP_DONE,
    WFX_EVT_DHCP_POLL
} WfxEventType_e;

typedef enum
{
    WFX_RSI_ST_DEV_READY       = (1 << 0),
    WFX_RSI_ST_AP_READY        = (1 << 1),
    WFX_RSI_ST_STA_PROVISIONED = (1 << 2),
    WFX_RSI_ST_STA_CONNECTING  = (1 << 3),
    WFX_RSI_ST_STA_CONNECTED   = (1 << 4),
    WFX_RSI_ST_STA_DHCP_DONE   = (1 << 6), /* Requested to do DHCP after conn	*/
    WFX_RSI_ST_STA_MODE        = (1 << 7), /* Enable Station Mode			*/
    WFX_RSI_ST_AP_MODE         = (1 << 8), /* Enable AP Mode			*/
    WFX_RSI_ST_STA_READY       = (WFX_RSI_ST_STA_CONNECTED | WFX_RSI_ST_STA_DHCP_DONE),
    WFX_RSI_ST_STARTED         = (1 << 9),  /* RSI task started			*/
    WFX_RSI_ST_SCANSTARTED     = (1 << 10), /* Scan Started				*/
    WFX_RSI_ST_SLEEP_READY     = (1 << 11)  /* Notify the M4 to go to sleep*/
} WfxStateType_e;

typedef struct WfxEvent_s
{
    WfxEventType_e eventType;
    void * eventData; // event data TODO: confirm needed
} WfxEvent_t;

typedef struct wfx_rsi_s
{
    // TODO: Change tp WfxEventType_e once the event queue is implemented
    EventGroupHandle_t events;
    TaskHandle_t drv_task;
    TaskHandle_t wlan_task;
    TaskHandle_t init_task;
#ifdef RSI_BLE_ENABLE
    TaskHandle_t ble_task;
#endif
    uint16_t dev_state;
    uint16_t ap_chan; /* The chan our STA is using	*/
    wfx_wifi_provision_t sec;
#ifdef SL_WFX_CONFIG_SCAN
    void (*scan_cb)(wfx_wifi_scan_result_t *);
    char * scan_ssid; /* Which one are we scanning for */
#endif
#ifdef SL_WFX_CONFIG_SOFTAP
    sl_wfx_mac_address_t softap_mac;
#endif
    sl_wfx_mac_address_t sta_mac;
    sl_wfx_mac_address_t ap_mac;   /* To which our STA is connected */
    sl_wfx_mac_address_t ap_bssid; /* To which our STA is connected */
    uint16_t join_retries;
    uint8_t ip4_addr[4]; /* Not sure if this is enough */
} WfxRsi_t;

extern WfxRsi_t wfx_rsi;

#ifdef __cplusplus
extern "C" {
#endif
void wfx_rsidev_init(void);
void wfx_rsi_task(void * arg);
#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
void wfx_ip_changed_notify(int got_ip);
#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
int32_t wfx_rsi_get_ap_info(wfx_wifi_scan_result_t * ap);
int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info);
int32_t wfx_rsi_reset_count();
int32_t wfx_rsi_disconnect();
int32_t wfx_wifi_rsi_init(void);
#if SL_ICD_ENABLED
void sl_wfx_host_si91x_sleep_wakeup();
#if SLI_SI917
int32_t wfx_rsi_power_save(rsi_power_save_profile_mode_t sl_si91x_ble_state, sl_si91x_performance_profile_t sl_si91x_wifi_state);
#else
int32_t wfx_rsi_power_save();
#endif /* SLI_SI917 */
#endif /* SL_ICD_ENABLED */

/// WfxPostEvent
/// @brief Allows to allocate an event to the WFX task event queue from outside of sl_wifi_if.c
/// @param event The event that will be allocated to the event queue
void WfxPostEvent(WfxEvent_t * event);
#ifdef __cplusplus
}
#endif
