#ifndef SYSTEM_CONTROL_H
#define SYSTEM_CONTROL_H

#include "esp_err.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

// 系统事件ID定义
typedef enum {
    SYS_EVENT_BEEP_REQUEST = 1,     // 蜂鸣器请求事件
    SYS_EVENT_BACKLIGHT_UPDATE,     // 背光更新事件
    SYS_EVENT_BACKLIGHT_ONOFF,      // 背光开关事件
    SYS_EVENT_RTC_SYNC,            // RTC同步事件
    SYS_EVENT_RTC_SET_TIME,        // RTC时间设置事件
    SYS_EVENT_TEMP_READ,           // 温度读取事件
    SYS_EVENT_TEMP_CONTROL,        // 温控处理事件（新增）
    SYS_EVENT_ROOMCARD_DETECT,     // 房卡检测事件（新增）
    SYS_EVENT_PERIODIC_CHECK,      // 周期性检查事件
    SYS_EVENT_ERROR_HANDLE,        // 错误处理事件
    SYS_EVENT_FLASH_WRITE,         //存flash事件
    /*puxin add 20250717*/
    SYS_EVENT_WIFI_ENABLE,          //WIFI使能脚IIC事件
    SYS_EVENT_AIP8563_INIT,         //时钟芯片时间初始化
    SYS_EVENT_MAX
} system_event_id_t;

// RTC时间缓存结构体
typedef struct {
    uint16_t year;   // 年
    uint8_t month;   // 月
    uint8_t day;     // 日
    uint8_t hour;    // 时
    uint8_t min;     // 分
    uint8_t sec;     // 秒
    uint8_t week;    // 星期
    bool valid;      // 数据有效标志
} rtc_time_cache_t;

// 系统事件结构体
typedef struct {
    system_event_id_t event_id;    // 事件ID
    uint8_t enabled;               // 事件使能标志
    uint32_t param1;               // 参数1
    uint32_t param2;               // 参数2
    uint8_t rtc_data[16];          // RTC时间数据缓冲区（用于传递时间参数）
} system_event_t;

// 任务配置参数
#define SYSTEM_CONTROL_TASK_PRIORITY    (5)  // 降低优先级，避免抢占Modbus任务
#define SYSTEM_CONTROL_QUEUE_SIZE       20
#define SYSTEM_CONTROL_STACK_SIZE       4096

// 定时器周期定义（毫秒）
#define SYSTEM_RTC_SYNC_TIMER_MS        600   // RTC同步周期：600ms
#define SYSTEM_TEMP_READ_TIMER_MS       6000  // 温度读取周期：6s
#define SYSTEM_TEMP_CONTROL_TIMER_MS    1500  // 温控处理周期：1.5s

// 温控状态变化标志位定义
#define TEMP_CTRL_FLAG_ONOFF_CHANGED    (1 << 0)  // 开关机状态变化
#define TEMP_CTRL_FLAG_MODE_CHANGED     (1 << 1)  // 工作模式变化
#define TEMP_CTRL_FLAG_TEMP_CHANGED     (1 << 2)  // 温度变化（超过阈值）
#define TEMP_CTRL_FLAG_SETPOINT_CHANGED (1 << 3)  // 设定温度变化
#define TEMP_CTRL_FLAG_PERIODIC_CHECK   (1 << 4)  // 周期性检查
#define TEMP_CTRL_FLAG_FORCE_UPDATE     (1 << 5)  // 强制更新输出

// 温控状态监控结构体
typedef struct {
    uint16_t last_onoff_state;      // 上次开关机状态
    uint16_t last_work_mode;        // 上次工作模式
    float last_setpoint;            // 上次设定温度
    float last_room_temp;           // 上次房间温度
    uint32_t last_update_time;      // 上次更新时间戳
    uint8_t change_flags;           // 变化标志位
    bool temp_control_enabled;      // 温控功能使能
    uint8_t last_ao1_output;        // 上次AO1（风机）输出
    uint8_t last_ao2_output;        // 上次AO2（热阀）输出
    uint8_t last_ao3_output;        // 上次AO3（冷阀）输出
} temp_control_monitor_t;

/**
 * @brief 初始化系统控制模块
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_control_init(void);

/**
 * @brief 启动系统控制任务
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_control_start(void);

/**
 * @brief 发送系统事件
 * @param event_id 事件ID
 * @param enabled 事件使能标志
 * @param param1 参数1
 * @param param2 参数2
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_control_send_event(system_event_id_t event_id, uint8_t enabled, uint32_t param1, uint32_t param2);

/**
 * @brief 请求蜂鸣器响一声（LVGL调用接口）
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_request_beep(void);

/**
 * @brief 更新背光亮度（LVGL调用接口）
 * @param level 背光级别（0-100）
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_update_backlight(uint8_t level);

/**
 * @brief 背光开关控制（LVGL调用接口）
 * @param onoff 0=关闭背光（灭屏），1=开启背光（亮屏）
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_backlight_onoff(uint8_t onoff);

/**
 * @brief 设置RTC时间（LVGL调用接口，自动计算星期几）
 * @param year 年 (2000-2099)
 * @param month 月 (1-12)
 * @param day 日 (1-31)
 * @param hour 时 (0-23)
 * @param min 分 (0-59)
 * @param sec 秒 (0-59)
 * @return esp_err_t ESP_OK成功，其他失败
 * @note 星期几会根据年月日自动计算，无需手动传入
 */
esp_err_t system_set_rtc_time(uint16_t year, uint8_t month, uint8_t day, 
                             uint8_t hour, uint8_t min, uint8_t sec);

/**
 * @brief 获取RTC时间缓存（LVGL调用接口）
 * @param rtc_time 输出的RTC时间结构体指针
 * @return esp_err_t ESP_OK成功，ESP_ERR_INVALID_STATE数据无效
 */
esp_err_t system_get_rtc_time(rtc_time_cache_t *rtc_time);

/**
 * @brief 停止系统控制任务（用于系统关闭）
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_control_stop(void);

/**
 * @brief 启动温控事件管理（LVGL调用接口）
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_start_temp_control(void);

/**
 * @brief 停止温控事件管理
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_stop_temp_control(void);

/**
 * @brief 强制触发温控处理（参数变化时调用）
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_trigger_temp_control(void);

/**
 * @brief 启动房卡检测事件管理
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_start_roomcard_detect(void);

/**
 * @brief 停止房卡检测事件管理
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_stop_roomcard_detect(void);

/**
 * @brief 强制触发房卡检测
 * @return esp_err_t ESP_OK成功，其他失败
 */
esp_err_t system_trigger_roomcard_detect(void);

#ifdef __cplusplus
}
#endif

#endif // SYSTEM_CONTROL_H 