/*
 *
 *    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.
 */

/* Includes */

#include "em_gpio.h"

#include "sl_wfx.h"
#include "sl_wfx_board.h"

// File specific to each platform, it must be created for custom boards
#include "sl_wfx_pds.h"

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Firmware include */
#include "sl_wfx_wf200_C0.h"

#include "FreeRTOS.h"
#include "event_groups.h"
#include "task.h"

#include "AppConfig.h"
#include "sl_wfx_host.h"
#include "sl_wfx_task.h"
#include "wfx_host_events.h"

#include "sl_spidrv_instances.h"
#include "spidrv.h"

#define SL_WFX_EVENT_MAX_SIZE 512
#define SL_WFX_EVENT_LIST_SIZE 1

StaticSemaphore_t xWfxWakeupSemaBuffer;
uint8_t sWfxEventQueueBuffer[SL_WFX_EVENT_LIST_SIZE * sizeof(uint8_t)];
StaticQueue_t sWfxEventQueueStruct;
QueueHandle_t wfx_event_Q        = NULL;
SemaphoreHandle_t wfx_wakeup_sem = NULL;
SemaphoreHandle_t wfx_mutex      = NULL;

StaticSemaphore_t xWfxMutexBuffer;

struct
{
    uint32_t wf200_firmware_download_progress;
    int wf200_initialized;
    uint8_t waited_event_id;
    uint8_t posted_event_id;
} host_context;

#ifdef SL_WFX_USE_SDIO
#ifdef SLEEP_ENABLED
sl_status_t sl_wfx_host_enable_sdio(void);
sl_status_t sl_wfx_host_disable_sdio(void);
#endif
#endif

#ifdef SL_WFX_USE_SPI
#ifdef SLEEP_ENABLED
sl_status_t sl_wfx_host_enable_spi(void);
sl_status_t sl_wfx_host_disable_spi(void);
#endif
#endif

/****************************************************************************
 * @fn  sl_status_t wfx_soft_init(void)
 * @brief
 * WFX FMAC driver host interface initialization
 * @param[in] None
 * @returns Returns SL_STATUS_OK if successful,
 *          SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t wfx_soft_init(void)
{
    EFR32_LOG("WF200:Soft Init");
    if ((wfx_event_Q = xQueueCreateStatic(SL_WFX_EVENT_LIST_SIZE, sizeof(uint8_t), sWfxEventQueueBuffer, &sWfxEventQueueStruct)) ==
        NULL)
    {
        return SL_STATUS_FAIL;
    }

    if ((wfx_wakeup_sem = xSemaphoreCreateBinaryStatic(&xWfxWakeupSemaBuffer)) == NULL)
    {
        return SL_STATUS_FAIL;
    }

    if ((wfx_mutex = xSemaphoreCreateMutexStatic(&xWfxMutexBuffer)) == NULL)
    {
        return SL_STATUS_FAIL;
    }

    return SL_STATUS_OK;
}
/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_init(void)
 * @brief
 * Notify driver init function
 * @param[in] None
 * @returns Returns SL_STATUS_OK if successful,
 *          SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_init(void)
{
    EFR32_LOG("WFX: Host Init");
    host_context.wf200_firmware_download_progress = 0;
    host_context.wf200_initialized                = 0;
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn   sl_status_t sl_wfx_host_get_firmware_data(const uint8_t **data, uint32_t data_size)
 * @brief
 * Get firmware data
 * @param[in] data:
 * @param[in] data_size:
 * @returns Returns SL_STATUS_OK if successful,
 *          SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_get_firmware_data(const uint8_t ** data, uint32_t data_size)
{
    *data = &sl_wfx_firmware[host_context.wf200_firmware_download_progress];
    host_context.wf200_firmware_download_progress += data_size;
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn   sl_status_t sl_wfx_host_get_firmware_size(uint32_t *firmware_size)
 * @brief
 * Get firmware size
 * @param[in] firmware_size:
 * @returns Returns SL_STATUS_OK if successful,
 *         SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_get_firmware_size(uint32_t * firmware_size)
{
    *firmware_size = sizeof(sl_wfx_firmware);
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn   sl_status_t sl_wfx_host_get_pds_data(const char **pds_data, uint16_t index)
 * @brief
 * Get PDS data
 * @param[in] pds_data:
 * @param[in] index:
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_get_pds_data(const char ** pds_data, uint16_t index)
{
    *pds_data = sl_wfx_pds[index];
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_get_pds_size(uint16_t *pds_size)
 * @brief
 * Get PDS size
 * @param[in] pds_size:
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_get_pds_size(uint16_t * pds_size)
{
    *pds_size = SL_WFX_ARRAY_COUNT(sl_wfx_pds);
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_deinit(void)
 * @brief
 * Deinit host interface
 * @param[in] None
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_deinit(void)
{
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_allocate_buffer(void **buffer, sl_wfx_buffer_type_t type, uint32_t buffer_size)
 * @brief
 * Allocate buffer (Should allocate either Ethernet - from LWIP or Control) - TODO
 * @param[in] buffer:
 * @param[in] type:
 * @param[in] buffer_size:
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_allocate_buffer(void ** buffer, sl_wfx_buffer_type_t type, uint32_t buffer_size)
{
    if ((*buffer = pvPortMalloc(buffer_size)) == (void *) 0)
    {
        return SL_STATUS_FAIL;
    }
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_free_buffer(void *buffer, sl_wfx_buffer_type_t type)
 * @brief
 * Free host buffer (CHECK LWIP buffer)
 * @param[in] buffer:
 * @param[in] type:
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_free_buffer(void * buffer, sl_wfx_buffer_type_t type)
{
    vPortFree(buffer);
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_hold_in_reset(void)
 * @brief
 * Set reset pin low
 * @param[in] None
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_hold_in_reset(void)
{
    GPIO_PinOutClear(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN);
    host_context.wf200_initialized = 0;
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_set_wake_up_pin(uint8_t state)
 * @brief
 * Set wakeup pin status
 * @param[in] state:
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_set_wake_up_pin(uint8_t state)
{
    CORE_DECLARE_IRQ_STATE;

    CORE_ENTER_ATOMIC();
    if (state > PINOUT_CLEAR_STATUS)
    {
#ifdef SLEEP_ENABLED
#ifdef SL_WFX_USE_SDIO
        sl_wfx_host_enable_sdio();
#endif
#ifdef SL_WFX_USE_SPI
        sl_wfx_host_enable_spi();
#endif
#endif
        GPIO_PinOutSet(SL_WFX_HOST_PINOUT_WUP_PORT, SL_WFX_HOST_PINOUT_WUP_PIN);
    }
    else
    {
        GPIO_PinOutClear(SL_WFX_HOST_PINOUT_WUP_PORT, SL_WFX_HOST_PINOUT_WUP_PIN);
#ifdef SLEEP_ENABLED
#ifdef SL_WFX_USE_SDIO
        sl_wfx_host_disable_sdio();
#endif
#ifdef SL_WFX_USE_SPI
        sl_wfx_host_disable_spi();
#endif
#endif
    }
    CORE_EXIT_ATOMIC();
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_reset_chip(void)
 * @brief
 * reset the host chip
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_reset_chip(void)
{
    // Pull it low for at least 1 ms to issue a reset sequence
    GPIO_PinOutClear(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN);

    // Delay for 10ms
    vTaskDelay(pdMS_TO_TICKS(10));

    // Hold pin high to get chip out of reset
    GPIO_PinOutSet(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN);

    // Delay for 3ms
    vTaskDelay(pdMS_TO_TICKS(3));

    host_context.wf200_initialized = 0;
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_wait_for_wake_up(void)
 * @brief
 * wait for the host wake up
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_wait_for_wake_up(void)
{
    xSemaphoreTake(wfx_wakeup_sem, TICKS_TO_WAIT_0);
    xSemaphoreTake(wfx_wakeup_sem, TICKS_TO_WAIT_3 / portTICK_PERIOD_MS);

    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_wait(uint32_t wait_time)
 * @brief
 * wait for the host
 * @param[in]  wait_time:
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/

sl_status_t sl_wfx_host_wait(uint32_t wait_time)
{
    uint32_t ticks = pdMS_TO_TICKS(wait_time);
    vTaskDelay(ticks ? ticks : 10);
    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn   sl_status_t sl_wfx_host_setup_waited_event(uint8_t event_id)
 * @brief
 * Called when the driver needs to setup the waited event
 * @param[in] event_id:
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_FAIL otherwise
 *****************************************************************************/

sl_status_t sl_wfx_host_setup_waited_event(uint8_t event_id)
{
    host_context.waited_event_id = event_id;
    host_context.posted_event_id = 0;

    return SL_STATUS_OK;
}

/****************************************************************************
 * @fn  uint8_t sl_wfx_host_get_waited_event(void)
 * @brief
 * Called when the driver get waited event
 * @returns returns host_context.waited_event_id
 *****************************************************************************/

uint8_t sl_wfx_host_get_waited_event(void)
{
    return host_context.waited_event_id;
}

/******************************************************************************
 * @fn  sl_status_t sl_wfx_host_wait_for_confirmation(uint8_t confirmation_id, uint32_t timeout, void **event_payload_out)
 * @brief
 * wait for the host confirmation
 * @param[in] confirmation_id:
 * @param[in] timeout:
 * @param[in] event_payload_out:
 * @returns Returns SL_STATUS_OK if successful,
 * Timeout, SL_STATUS_TIMEOUT otherwise
 *****************************************************************************/

sl_status_t sl_wfx_host_wait_for_confirmation(uint8_t confirmation_id, uint32_t timeout, void ** event_payload_out)
{
    uint8_t posted_event_id;
    for (uint32_t i = 0; i < timeout; i++)
    {
        /* Wait for an event posted by the function sl_wfx_host_post_event() */
        if (xQueueReceive(wfx_event_Q, &posted_event_id, TICKS_TO_WAIT_1) == pdTRUE)
        {
            /* Once a message is received, check if it is the expected ID */
            if (confirmation_id == posted_event_id)
            {
                /* Pass the confirmation reply and return*/
                if (event_payload_out != NULL)
                {
                    *event_payload_out = sl_wfx_context->event_payload_buffer;
                }
                return SL_STATUS_OK;
            }
        }
    }
    /* The wait for the confirmation timed out, return */
    return SL_STATUS_TIMEOUT;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_lock(void)
 * @brief
 * Called when the driver needs to lock its access
 * @returns Returns SL_STATUS_OK if successful,
 *SL_STATUS_TIMEOUT otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_lock(void)
{

    sl_status_t status = SL_STATUS_OK;

    if (xSemaphoreTake(wfx_mutex, TICKS_TO_WAIT_500) != pdTRUE)
    {
        EFR32_LOG("*ERR*Wi-Fi driver mutex timo");
        status = SL_STATUS_TIMEOUT;
    }

    return status;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_unlock(void)
 * @brief
 * Called when the driver needs to unlock its access
 * @returns Returns SL_STATUS_OK
 *****************************************************************************/
sl_status_t sl_wfx_host_unlock(void)
{
    xSemaphoreGive(wfx_mutex);

    return SL_STATUS_OK;
}

/******************************************************************************
 * @fn  sl_status_t sl_wfx_host_post_event(sl_wfx_generic_message_t *event_payload)
 * @brief
 * Called when the driver needs to post an event
 * @param[in]  event_payload:
 * @returns Returns status
 *****************************************************************************/
sl_status_t sl_wfx_host_post_event(sl_wfx_generic_message_t * event_payload)
{
    sl_status_t status;

    /* Forward the message to the application */
    status = sl_wfx_host_process_event(event_payload);

    if (host_context.waited_event_id == event_payload->header.id)
    {
        if (event_payload->header.length < SL_WFX_EVENT_MAX_SIZE)
        {
            /* Post the event in the queue */
            memcpy(sl_wfx_context->event_payload_buffer, (void *) event_payload, event_payload->header.length);
            host_context.posted_event_id = event_payload->header.id;
            xQueueOverwrite(wfx_event_Q, (void *) &event_payload->header.id);
        }
    }

    return status;
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_transmit_frame(void *frame, uint32_t frame_len)
 * @brief
 * Called when the driver needs to transmit a frame
 * @param[in] frame:
 * @param[in] frame_len:
 * @returns returns sl_wfx_data_write(frame, frame_len)
 *****************************************************************************/
sl_status_t sl_wfx_host_transmit_frame(void * frame, uint32_t frame_len)
{
    return sl_wfx_data_write(frame, frame_len);
}

/****************************************************************************
 * @fn  sl_status_t sl_wfx_host_sleep_grant(sl_wfx_host_bus_transfer_type_t type,
                                    sl_wfx_register_address_t address,
                                    uint32_t length)
 * @brief
 * Called when the driver is considering putting the
 * WFx in sleep mode
 * @param[in] type:
 * @param[in] address:
 * @param[in] length:
 * @returns SL_WIFI_SLEEP_GRANTED to let the WFx go to
 *sleep, SL_WIFI_SLEEP_NOT_GRANTED otherwise
 *****************************************************************************/
sl_status_t sl_wfx_host_sleep_grant(sl_wfx_host_bus_transfer_type_t type, sl_wfx_register_address_t address, uint32_t length)
{
    (void) (type);
    (void) (address);
    (void) (length);

    return SL_STATUS_WIFI_SLEEP_GRANTED;
}

#if SL_WFX_DEBUG_MASK
/****************************************************************************
 * @fn  void sl_wfx_host_log(const char *str, ...)
 * @brief
 * Host debug output
 * @param[in] str: string
 * @return None
 *****************************************************************************/
void sl_wfx_host_log(const char * str, ...)
{
    va_list args;
    va_start(args, str);
    vprintf(str, args);
    va_end(args);
}
#endif
#ifndef PW_RPC_ENABLED
/* Place holder - This is just to handle UART interrupts
 * The "otThread tasks handles it. WiFi does not need it yet
 * I don't care for it. I should really have the thread
 * shut it off
 */
#if !CHIP_ENABLE_OPENTHREAD
/****************************************************************************
 * @fn  void otSysEventSignalPending(void)
 * @brief
 * system event signal pending
 * @param[in] None
 * @return None
 *****************************************************************************/
void otSysEventSignalPending(void)
{
    // BaseType_t yieldRequired = ThreadStackMgrImpl().SignalThreadActivityPendingFromISR();
    EFR32_LOG("*ERR*UART intr - NOT Handled");
    portYIELD_FROM_ISR(pdFALSE);
}
#endif /* !CHIP_ENABLE_OPENTHREAD */
#endif /* PW_RPC_ENABLED */
