#ifndef _DATA_HISTORY_REPORT_H_
#define _DATA_HISTORY_REPORT_H_

#include "data_config.h"
#include "bsp_type.h"

/* ============================ 常量定义 ============================= */
#define HISTORY_REPORT_MENU_NUM         5       // 菜单项数量
#define HISTORY_REPORT_MAX_LINES        8       // 最大显示行数
#define HISTORY_REPORT_MAX_LINE_LEN     64      // 每行最大字符数
#define HISTORY_REPORT_DESC_LEN         128     // 描述信息长度

// 测试数据记录数
#define HISTORY_REPORT_TEST_SOE_NUM     5       // SOE事件测试记录数
#define HISTORY_REPORT_TEST_FAULT_NUM   3       // 故障事件测试记录数
#define HISTORY_REPORT_TEST_REMOTE_NUM  4       // 遥控记录测试记录数
#define HISTORY_REPORT_TEST_SETTING_NUM 3       // 定值记录测试记录数

// 定值记录配置
#define HISTORY_SETTING_RECORD_MAX      1024    // 最大记录数限制
#define HISTORY_SETTING_FILE_PATH       "/app/data/log_fixset.txt"
#define HISTORY_SETTING_LINE_MAX_LEN    512     // 每行最大长度

/* ============================ 数据类型定义 ============================= */

/**
 * @brief 历史报告类型枚举
 */
typedef enum {
    HISTORY_REPORT_SOE = 0,         // SOE事件
    HISTORY_REPORT_FAULT,           // 故障事件
    HISTORY_REPORT_REMOTE,          // 遥控记录
    HISTORY_REPORT_SETTING,         // 定值记录
    HISTORY_REPORT_ACTION_COUNT,    // 动作次数
    HISTORY_REPORT_TYPE_NUM
} HistoryReportType;

/**
 * @brief SOE事件记录结构体
 */
typedef struct {
    uint32_t record_id;             // 记录序号
    uint16_t year;                  // 年
    uint8_t  month;                 // 月
    uint8_t  day;                   // 日
    uint8_t  hour;                  // 时
    uint8_t  minute;                // 分
    uint8_t  second;                // 秒
    uint16_t millisecond;           // 毫秒
    uint8_t  event_type;            // 事件类型
    uint16_t point_id;              // 点号ID（通讯点号cp）
    uint8_t  point_owner;           // 所属开关（0=公共，1-12=开关号）
    uint8_t  point_index;           // 点号索引
    uint8_t  value;                 // 变位值（0/1/2）
    char     point_name[32];        // 点号名称（由data层填充）
    char     device_name[32];       // 设备名称
    char     event_desc[64];        // 事件描述
} HistorySOERecord;

/**
 * @brief 故障事件记录结构体
 */
typedef struct {
    uint32_t record_id;             // 记录序号
    uint16_t year;                  // 年
    uint8_t  month;                 // 月
    uint8_t  day;                   // 日
    uint8_t  hour;                  // 时
    uint8_t  minute;                // 分
    uint8_t  second;                // 秒
    uint16_t millisecond;           // 毫秒
    char     fault_name[32];        // 故障名称
    uint16_t fault_addr;            // 故障地址
    char     fault_type[16];        // 故障类型
    float    ia;                    // A相电流
    float    ib;                    // B相电流
    float    ic;                    // C相电流
    float    i0;                    // 零序电流
    float    uab;                   // Uab电压
    float    ubc;                   // Ubc电压
    float    uca;                   // Uca电压
    float    freq_a;                // A侧频率
    float    freq_b;                // B侧频率
} HistoryFaultRecord;

/**
 * @brief 遥控记录结构体
 */
typedef struct {
    uint32_t record_id;             // 记录序号
    uint16_t year;                  // 年
    uint8_t  month;                 // 月
    uint8_t  day;                   // 日
    uint8_t  hour;                  // 时
    uint8_t  minute;                // 分
    uint8_t  second;                // 秒
    uint16_t millisecond;           // 毫秒
    uint16_t point_id;              // 点号ID（通讯点号cp）
    uint8_t  point_owner;           // 所属开关（0=公共，1-12=开关号）
    uint8_t  point_index;           // 点号索引
    char     control_type[16];      // 遥控类型（合闸/分闸）
    char     exec_result[16];       // 执行结果
    char     point_name[32];        // 点号名称（由data层填充）
} HistoryRemoteRecord;

/**
 * @brief 定值记录结构体
 */
typedef struct {
    uint32_t record_id;             // 记录序号
    uint16_t year;                  // 年
    uint8_t  month;                 // 月
    uint8_t  day;                   // 日
    uint8_t  hour;                  // 时
    uint8_t  minute;                // 分
    uint8_t  second;                // 秒
    uint16_t millisecond;           // 毫秒
    char     setting_name[32];      // 定值名称
    char     setting_category[32];  // 定值类别（括号内内容）
    char     old_value[32];         // 修改前值（字符串形式）
    char     new_value[32];         // 修改后值（字符串形式）
    char     unit[8];               // 单位
} HistorySettingRecord;

/**
 * @brief 动作次数统计结构体
 */
typedef struct {
    uint32_t reclose_count;         // 开关重合次数
    uint32_t trip_count;            // 开关跳闸次数
} HistoryActionCount;

/* ============================ 接口函数声明 ============================= */

/**
 * @brief 获取指定类型的记录总数
 * @param type 历史报告类型
 * @return 记录总数
 */
uint32_t data_history_report_get_count(HistoryReportType type);

/**
 * @brief 获取SOE事件记录
 * @param index 记录索引（从0开始）
 * @param record 输出参数，记录数据
 * @return true-成功，false-失败
 */
bool data_history_report_get_soe_record(uint32_t index, HistorySOERecord *record);

/**
 * @brief 获取故障事件记录
 * @param index 记录索引（从0开始）
 * @param record 输出参数，记录数据
 * @return true-成功，false-失败
 */
bool data_history_report_get_fault_record(uint32_t index, HistoryFaultRecord *record);

/**
 * @brief 获取遥控记录
 * @param index 记录索引（从0开始）
 * @param record 输出参数，记录数据
 * @return true-成功，false-失败
 */
bool data_history_report_get_remote_record(uint32_t index, HistoryRemoteRecord *record);

/**
 * @brief 获取定值记录
 * @param index 记录索引（从0开始）
 * @param record 输出参数，记录数据
 * @return true-成功，false-失败
 */
bool data_history_report_get_setting_record(uint32_t index, HistorySettingRecord *record);

/**
 * @brief 获取动作次数统计
 * @param count 输出参数，动作次数统计
 * @return true-成功，false-失败
 */
bool data_history_report_get_action_count(HistoryActionCount *count);

/**
 * @brief 从实时数据更新动作次数统计
 * @note 调用后会更新内部静态数组
 */
void data_history_report_update_action_count(void);

/**
 * @brief 初始化历史报告测试数据
 * @note 该函数在系统启动时调用，创建测试数据集
 */
void data_history_report_init(void);

#endif /* _DATA_HISTORY_REPORT_H_ */
