#ifndef WIFI_BOARD_H
#define WIFI_BOARD_H

/**
 * @file wifi_board.h
 * @brief WiFi板级管理模块头文件
 * 
 * 本文件定义了WiFi板级管理的相关接口，包括WiFi连接管理、
 * BluFi蓝牙配网流程控制、网络状态监控等功能。
 * 集成了蓝牙配网功能，提供完整的网络连接解决方案。
 */

#include "board.h"
#include "bluetooth_provisioning.h"
#include <string>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>

// 前向声明
class Application;

/**
 * @class WifiBoard
 * @brief WiFi板级管理类
 * 
 * 继承自Board基类，负责管理ESP32的WiFi连接、BluFi蓝牙配网流程和网络状态监控。
 * 提供完整的网络连接解决方案，包括自动连接、配网模式切换、网络状态监控等功能。
 */
class WifiBoard : public Board {
protected:
    bool wifi_config_mode_ = false;                    ///< WiFi配置模式标志，true表示进入配网模式
    bool blufi_provisioning_active_ = false;           ///< BluFi配网激活状态标志
    bool blufi_provisioning_success_ = false;          ///< BluFi配网成功状态标志
    TickType_t blufi_start_time_ = 0;                   ///< BluFi配网开始时间戳
    static const TickType_t BLUFI_TIMEOUT_MS = 300000; ///< BluFi配网超时时间（5分钟），避免过快重新进入配网
    BluetoothProvisioning bluetooth_provisioning_;     ///< BluFi蓝牙配网实例对象

    /**
     * @brief 构造函数
     * 初始化WiFi板级管理对象，读取配置参数
     */
    WifiBoard();

    /**
     * @brief 进入WiFi配置模式
     * 启动BluFi蓝牙配网流程，等待用户通过手机APP配置WiFi信息
     */
    void EnterWifiConfigMode();

    /**
     * @brief 广播验证码
     * @param code 验证码字符串
     * @param application 应用程序实例引用
     * 用于在配网过程中向用户显示验证码信息
     */
    void BroadcastVerificationCode(const std::string& code, Application& application);

    /**
     * @brief 启动BluFi蓝牙配网
     * @return true 启动成功
     * @return false 启动失败
     * 初始化并启动BluFi蓝牙配网服务，等待手机连接
     */
    bool StartBluFiProvisioning();

    /**
     * @brief 监控BluFi配网进程
     * 监控配网状态变化，处理超时和异常情况
     */
    void MonitorBluFiProvisioning();

    /**
     * @brief BluFi配网事件处理函数
     * @param event 配网事件类型
     * @param data 事件数据指针
     * 处理BluFi配网过程中的各种事件
     */
    void OnBluFiProvisioningEvent(BluetoothProvisioningEvent event, void* data);

    /**
     * @brief BluFi配网静态回调函数
     * @param event 配网事件类型
     * @param data 事件数据指针
     * @param user_data 用户数据指针
     * 静态回调函数，用于处理BluFi配网事件
     */
    static void BluFiProvisioningCallback(BluetoothProvisioningEvent event, void* data, void* user_data);

    /**
     * @brief 清理现有蓝牙服务
     * 在进入配网模式前，清理application.cc中启动的蓝牙服务，避免重复初始化
     */
    void CleanupExistingBluetoothService();

    /**
     * @brief 清理现有WiFi服务
     * 在进入配网模式前，清理现有的WiFi服务，为BluFi重新初始化做准备
     */
    void CleanupExistingWiFiService();

    /**
     * @brief 获取板级配置JSON字符串
     * @return std::string 板级配置的JSON格式字符串
     * 重写基类方法，返回WiFi板级的配置信息
     */
    virtual std::string GetBoardJson() override;

public:
    /**
     * @brief 获取板级类型
     * @return std::string 返回"wifi"字符串
     * 重写基类方法，标识当前板级为WiFi类型
     */
    virtual std::string GetBoardType() override;

    /**
     * @brief 启动网络连接
     * 根据配置启动WiFi连接或BluFi配网流程
     * 重写基类方法，实现WiFi网络的启动逻辑
     */
    virtual void StartNetwork() override;

    /**
     * @brief 创建HTTP客户端对象
     * @return Http* HTTP客户端对象指针
     * 重写基类方法，创建适用于WiFi网络的HTTP客户端
     */
    virtual Http* CreateHttp() override;

    /**
     * @brief 创建WebSocket客户端对象
     * @return WebSocket* WebSocket客户端对象指针
     * 重写基类方法，创建适用于WiFi网络的WebSocket客户端
     */
    virtual WebSocket* CreateWebSocket() override;

    /**
     * @brief 创建MQTT客户端对象
     * @return Mqtt* MQTT客户端对象指针
     * 重写基类方法，创建适用于WiFi网络的MQTT客户端
     */
    virtual Mqtt* CreateMqtt() override;

    /**
     * @brief 创建UDP客户端对象
     * @return Udp* UDP客户端对象指针
     * 重写基类方法，创建适用于WiFi网络的UDP客户端
     */
    virtual Udp* CreateUdp() override;

    /**
     * @brief 获取网络状态图标
     * @return const char* 网络状态图标字符串
     * 重写基类方法，返回当前WiFi网络状态对应的图标
     */
    virtual const char* GetNetworkStateIcon() override;

    /**
     * @brief 设置省电模式
     * @param enabled true启用省电模式，false禁用省电模式
     * 重写基类方法，控制WiFi模块的省电模式
     */
    virtual void SetPowerSaveMode(bool enabled) override;

    /**
     * @brief 重置WiFi配置
     * 清除已保存的WiFi凭据，重新进入配网模式
     */
    virtual void ResetWifiConfiguration();

    /**
     * @brief 检查BluFi配网是否激活
     * @return true BluFi配网正在进行中
     * @return false BluFi配网未激活
     * BluFi配网状态检查方法，用于外部查询配网状态
     */
    bool IsBluFiProvisioningActive() const { return blufi_provisioning_active_; }
};

#endif // WIFI_BOARD_H
