#ifndef OUTPUT_CONTROL_H
#define OUTPUT_CONTROL_H

#include <stdint.h>
#include <stdbool.h>
#include "esp_err.h"
#include "parameter.h"

#ifdef __cplusplus
extern "C" {
#endif

// 工作模式常量定义（对应parameter.c中的Work_mode值）
#define WORK_MODE_AUTO  0   // 自动模式
#define WORK_MODE_COOL  1   // 制冷模式
#define WORK_MODE_HEAT  2   // 制热模式
#define WORK_MODE_FAN   3   // 通风模式

// 风速档位常量定义（对应parameter.c中的Fan_speed值）
#define FAN_SPEED_AUTO  0   // 自动风（根据温差自动调节）
#define FAN_SPEED_LOW   1   // 低风
#define FAN_SPEED_MID   2   // 中风
#define FAN_SPEED_HIGH  3   // 高风

// 温度控制常量定义
#define T_HOLD          0.5f    // 死区温度（°C），用于滞回控制避免频繁开关
                                // 修改此值可全局调整制冷/制热切换和阀门开关的死区大小

// 温控系统状态结构体
typedef struct {
    float troom;            // 当前房间温度
    float tset;             // 设定温度
    float delta_t1;         // ΔT1 = Troom - Tset
    float delta_t2;         // ΔT2 = Tset - Troom
    uint16_t work_mode;     // 当前工作模式（0-3对应自动/制冷/制热/通风）
    uint16_t fan_speed;     // 当前风速档位（0-3对应关闭/低风/中风/高风）
    //uint8_t ao1_output;     // 风机输出百分比
    uint8_t ao2_output;     // 热阀输出百分比
    uint8_t ao3_output;     // 冷阀输出百分比
    bool cooling_active;    // 制冷激活状态
    bool heating_active;    // 制热激活状态
    bool heat_valve_opened; // 热阀上次开启状态（用于状态保持区间）
    bool cool_valve_opened; // 冷阀上次开启状态（用于状态保持区间）
    
    // 阀门延迟和间隔控制相关时间记录
    uint32_t heat_valve_close_time;     // 热阀关闭时间戳（秒）
    uint32_t cool_valve_close_time;     // 冷阀关闭时间戳（秒）
    uint32_t heat_valve_last_change_time; // 热阀上次输出变化时间戳（秒）
    uint32_t cool_valve_last_change_time; // 冷阀上次输出变化时间戳（秒）
    uint8_t heat_valve_last_output;     // 热阀上次输出值
    uint8_t cool_valve_last_output;     // 冷阀上次输出值
    
    // 风机延迟关闭控制
    uint32_t fan_should_stop_time;      // 风机应该停止的时间戳（当阀门都关闭时记录）
    bool fan_delay_stopping;            // 风机是否处于延迟关闭状态
    
    // 风机状态保持控制（用于0≤△T≤0.2区间的滞回控制）
    bool fan_was_on;                    // 风机上次是否开启状态（用于状态保持区间）
    
    // 开关机控制相关
    uint16_t onoff_state;               // 开关机状态（0=关机，1=开机）
    uint32_t power_on_time;             // 开机时间戳（秒），用于延迟3秒避免频繁开关机
    bool power_on_delay_active;         // 开机延迟状态标志
    
    // 日志优化 - 避免重复打印相同的输出值
    uint8_t last_printed_ao1;           // 上次打印的AO1值
    uint8_t last_printed_ao2;           // 上次打印的AO2值
    uint8_t last_printed_ao3;           // 上次打印的AO3值
} temp_control_state_t;

/**
 * @brief 初始化温控输出模块
 * @return ESP_OK成功，其他失败
 */
esp_err_t output_control_init(void);

/**
 * @brief 温控系统主循环处理函数
 * @return ESP_OK成功，其他失败
 */
esp_err_t output_control_process(void);

/**
 * @brief 获取当前温控状态
 * @param state 输出温控状态结构体指针
 * @return ESP_OK成功，其他失败
 */
esp_err_t output_control_get_state(temp_control_state_t *state);

/**
 * @brief 强制设置输出值（调试用）
 * @param ao1 风机输出（0-100）
 * @param ao2 热阀输出（0-100）
 * @param ao3 冷阀输出（0-100）
 * @return ESP_OK成功，其他失败
 */
esp_err_t output_control_force_output(uint8_t ao1, uint8_t ao2, uint8_t ao3);

/**
 * @brief 停止所有输出
 * @return ESP_OK成功，其他失败
 */
esp_err_t output_control_stop_all(void);

/**
 * @brief 开关机控制函数
 * @details 获取OnOffState参数控制系统开关机
 *          OFF(0)：关风机，关闭所有阀门输出
 *          ON(1)：2s后恢复风机、阀门AO输出的开启条件
 * @return ESP_OK成功，其他失败
 */
esp_err_t output_control_onoff(void);

/**
 * @brief 获取风机状态和阀门开度
 * @param fan_state 输出风机状态指针，1=运行，0=停止
 * @param valve_opening 输出阀门开度指针，制热时返回热阀开度，制冷时返回冷阀开度
 * @return ESP_OK成功，其他失败
 */
esp_err_t get_oc_fan_valve_state(uint8_t *fan_state, uint8_t *valve_opening);

#ifdef __cplusplus
}
#endif

#endif // OUTPUT_CONTROL_H 