#include "bl_main.h"
#include "hal_sys.h"
#include "include/wifi_mgmr_ext.h"
#include "os_hal.h"
#include "wifi_mgmr.h"
#include "wifi_mgmr_api.h"
#include "wifi_mgmr_event.h"
#include "wifi_mgmr_profile.h"
#include "wifi_netif.h"
#include <aos/yloop.h>
#include <bl60x_fw_api.h>
#include <blog.h>
#include <dns_server.h>
#include <lwip/dhcp6.h>
#include <lwip/dns.h>
#include <lwip/netifapi.h>
#include <stdint.h>
#include <string.h>
BLOG_DECLARE(tcal_power)
BLOG_DECLARE(scan)
#define USER_UNUSED(a) ((void) (a))

#define DEBUG_HEADER "[WF][SM] "

int wifi_mgmr_get_bssid(uint8_t * bssid)
{
    int i;

    for (i = 0; i < 8; i++)
    {
        bssid[i] = wifiMgmr.wifi_mgmr_stat_info.bssid[i];
    }

    return;
}

int wifi_mgmr_get_scan_ap_num(void)
{
    int num, count;

    num   = sizeof(wifiMgmr.scan_items) / sizeof(wifiMgmr.scan_items[0]);
    count = 0;

    for (int i = 0; i < num; i++)
    {
        if (wifiMgmr.scan_items[i].is_used && (!wifi_mgmr_scan_item_is_timeout(&wifiMgmr, &wifiMgmr.scan_items[i])))
        {
            count++;
        }
    }

    return count;
}

void wifi_mgmr_get_scan_result(wifi_mgmr_ap_item_t * result, int * num, uint8_t scan_type, char * ssid)
{
    int i, count, iter;

    count = sizeof(wifiMgmr.scan_items) / sizeof(wifiMgmr.scan_items[0]);
    iter  = 0;

    for (i = 0; i < count; i++)
    {
        if (wifiMgmr.scan_items[i].is_used && (!wifi_mgmr_scan_item_is_timeout(&wifiMgmr, &wifiMgmr.scan_items[i])))
        {
            if (scan_type)
            {
                if (memcmp(ssid, wifiMgmr.scan_items[i].ssid, wifiMgmr.scan_items[i].ssid_len) != 0)
                {
                    continue;
                }
            }
            memcpy(result[iter].ssid, wifiMgmr.scan_items[i].ssid, wifiMgmr.scan_items[i].ssid_len);
            result[iter].ssid[wifiMgmr.scan_items[i].ssid_len] = 0;
            result[iter].ssid_tail[0]                          = 0;
            result[iter].ssid_len                              = wifiMgmr.scan_items[i].ssid_len;
            memcpy((&(result[iter]))->bssid, wifiMgmr.scan_items[i].bssid, 6);
            result[iter].channel = wifiMgmr.scan_items[i].channel;
            result[iter].auth    = wifiMgmr.scan_items[i].auth;
            result[iter].rssi    = wifiMgmr.scan_items[i].rssi;
            iter++;
        }
    }

    *num = iter;
}

int wifi_mgmr_get_scan_result_filter(wifi_mgmr_ap_item_t * result, char * ssid)
{
    int i, count;

    count = sizeof(wifiMgmr.scan_items) / sizeof(wifiMgmr.scan_items[0]);
    for (i = 0; i < count; i++)
    {
        if (wifiMgmr.scan_items[i].is_used && (!wifi_mgmr_scan_item_is_timeout(&wifiMgmr, &wifiMgmr.scan_items[i])) &&
            !strncmp(ssid, wifiMgmr.scan_items[i].ssid, wifiMgmr.scan_items[i].ssid_len))
        {
            memcpy(result->ssid, wifiMgmr.scan_items[i].ssid, wifiMgmr.scan_items[i].ssid_len);
            result->ssid[wifiMgmr.scan_items[i].ssid_len] = 0;
            result->ssid_tail[0]                          = 0;
            result->ssid_len                              = wifiMgmr.scan_items[i].ssid_len;
            memcpy(result->bssid, wifiMgmr.scan_items[i].bssid, 6);
            result->channel = wifiMgmr.scan_items[i].channel;
            result->auth    = wifiMgmr.scan_items[i].auth;
            result->rssi    = wifiMgmr.scan_items[i].rssi;
            return 0;
        }
    }

    return -1;
}

int wifi_mgmr_profile_ssid_get(uint8_t * ssid)
{
    wifi_mgmr_profile_msg_t profile_msg;

    wifi_mgmr_profile_get_by_idx(&wifiMgmr, &profile_msg, wifiMgmr.profile_active_index);

    memcpy(ssid, profile_msg.ssid, profile_msg.ssid_len);

    return profile_msg.ssid_len;
}
