#ifndef _DATA_MANAGER_H
#define _DATA_MANAGER_H

#include "data_config.h"
#include "data_sys.h"
#include "data_usr.h"
#include "data_debugset.h"
#include "data_telemet_common.h"
#include "head.h"

extern const TSETTABLE* data_mgr_get_fixvaldes_struct(t_datafixval_cfg* p_cfg); // 获取固定值描述结构体
extern uint16_t data_mgr_get_module_cfg_total(DataModule module, t_datafixval_cfg_total **pp_cfg); // 获取模块配置总数量

extern uint16_t data_mgr_get_menu_len_by_module(DataModule module); // 获取模块菜单数量
extern data_bool_t data_mgr_is_menu_func_enabled(DataModule module, uint8_t menu_id); // 判断菜单功能是否投入
extern uint16_t data_mgr_get_items_len_by_module(DataModule module , u8 menu_sel_idx); // 获取模块菜单下数据项数量

extern void data_mgr_get_data_from_system(uint8_t _uc_type , const SET_VALUE * _pt_val); // 从系统获取数据
extern data_bool_t data_mgr_check_diff(void); // 检查数据是否有差异
extern data_bool_t data_mgr_modify_menu_data(DataModule module, uint8_t menu_id, uint8_t data_id, float value); // 修改菜单数据
extern data_bool_t data_mgr_modify_menu_data_ip(DataModule module, uint8_t menu_id, uint8_t data_id, uint32_t value); // 修改菜单IP数据

extern data_bool_t data_mgr_set_data_to_system(DataModule module); // 设置数据到系统
extern void data_mgr_restore_default_values(DataModule module); // 恢复默认值

// 遥信遥测相关函数
extern void data_mgr_real_time_init(void); // 初始化实时数据模块
extern void data_mgr_get_yx_data(void); // 获取遥信数据
extern void data_mgr_get_yc_data(GET_TYPE type); // 获取遥测数据
extern void data_mgr_get_yk_data(void); // 获取遥控数据

// ===================== DO遥控控制接口 =====================
/**
 * @brief DO遥控操作类型枚举
 */
typedef enum
{
    DO_CTRL_OFF = 0,    // 分闸
    DO_CTRL_ON = 1,     // 合闸
} DoCtrlType;

/**
 * @brief DO遥控操作结果枚举
 */
typedef enum
{
    DO_CTRL_RET_OK = 0,         // 操作成功
    DO_CTRL_RET_PARAM_ERR = -1, // 参数错误
    DO_CTRL_RET_BS_ERR = -2,    // 闭锁错误（如气压低闭锁）
    DO_CTRL_RET_CFG_ERR = -3,   // 通道未配置
    DO_CTRL_RET_EXEC_ERR = -4,  // 执行错误
} DoCtrlRet;

/**
 * @brief           执行DO遥控操作（开出控制）
 * @param[in]       do_index: DO索引（0 ~ do_num-1）
 * @param[in]       type: 操作类型，DO_CTRL_OFF(分闸) 或 DO_CTRL_ON(合闸)
 * @return          DoCtrlRet: 操作结果
 * @date            2026-02-26
 * @note            该接口封装了底层的sw_do函数，用于UI层的开出控制
 *                  目前仅支持单开关（sw=0）的遥控操作
 */
extern DoCtrlRet data_mgr_do_control(uint8_t do_index, DoCtrlType type);

/**
 * @brief           获取DO遥控状态
 * @param[in]       do_index: DO索引（0 ~ do_num-1）
 * @return          int: 当前状态，0=分，1=合，-1=错误
 * @date            2026-02-26
 */
extern int data_mgr_get_do_status(uint8_t do_index);

// ===================== 出厂调试数据接口 =====================
/**
 * @brief           获取出厂调试模块配置
 * @param[in/out]   pp_cfg: 输出配置数组指针
 * @return          菜单数量
 */
extern uint16_t data_mgr_get_debugset_cfg_total(t_datafixval_cfg_total **pp_cfg);

/**
 * @brief           获取出厂调试菜单长度
 * @return          菜单项数量
 */
extern uint16_t data_mgr_get_debugset_menu_len(void);

/**
 * @brief           获取出厂调试指定菜单的名称
 * @param[in]       menu_idx: 菜单索引（0=状态信息，1=系统设置）
 * @return          const char*: 菜单名称字符串
 */
extern const char* data_mgr_get_debugset_menu_name(uint8_t menu_idx);

/**
 * @brief           获取出厂调试指定菜单的数据项长度
 * @param[in]       menu_sel_idx: 菜单索引（0=状态信息，1=系统设置）
 * @return          数据项数量
 */
extern uint16_t data_mgr_get_debugset_items_len(u8 menu_sel_idx);

/**
 * @brief           获取出厂调试状态信息指定项的值
 * @param[in]       item_idx: 状态信息项索引（0-8）
 * @return          float: 当前值
 */
extern float data_mgr_get_debugset_status_value(uint8_t item_idx);

/**
 * @brief           获取出厂调试状态信息指定项的名称
 * @param[in]       item_idx: 状态信息项索引（0-8）
 * @return          const char*: 名称字符串
 */
extern const char* data_mgr_get_debugset_status_name(uint8_t item_idx);

/**
 * @brief           获取出厂调试状态信息指定项的单位
 * @param[in]       item_idx: 状态信息项索引（0-8）
 * @return          const char*: 单位字符串
 */
extern const char* data_mgr_get_debugset_status_unit(uint8_t item_idx);

/**
 * @brief           获取出厂调试系统设置指定项的值
 * @param[in]       item_idx: 系统设置项索引（0-6）
 * @return          float: 当前值
 */
extern float data_mgr_get_debugset_system_value(uint8_t item_idx);

/**
 * @brief           执行系统设置操作（统一接口）
 * @param[in]       item_idx: 系统设置项索引（0-6）
 * @param[in]       param: 操作参数（根据设置项类型不同而不同）
 * @return          data_bool_t: DATA_BOOL_TRUE-成功, DATA_BOOL_FALSE-失败
 * @note            该函数为系统设置提供统一的操作接口
 */
extern data_bool_t data_mgr_execute_sysset_operation(uint8_t item_idx, void *param);

/**
 * @brief           获取出厂调试系统设置指定项的名称
 * @param[in]       item_idx: 系统设置项索引（0-6）
 * @return          const char*: 名称字符串
 */
extern const char* data_mgr_get_debugset_system_name(uint8_t item_idx);

/**
 * @brief           获取出厂调试系统设置指定项的单位
 * @param[in]       item_idx: 系统设置项索引（0-6）
 * @return          const char*: 单位字符串
 */
extern const char* data_mgr_get_debugset_system_unit(uint8_t item_idx);

/**
 * @brief           获取出厂调试系统设置指定项的配置参数
 * @param[in]       item_idx: 系统设置项索引（0-6）
 * @param[out]      min: 输出最小值
 * @param[out]      max: 输出最大值
 * @param[out]      point: 输出小数位数
 * @param[out]      numeric_opt: 输出数值选项类型
 * @return          data_bool_t: DATA_BOOL_TRUE-成功, DATA_BOOL_FALSE-失败
 */
extern data_bool_t data_mgr_get_debugset_system_config(uint8_t item_idx, uint32_t *min, uint32_t *max, 
                                                     uint8_t *point, uint8_t *numeric_opt);

/**
 * @brief           检查出厂调试系统设置项是否为开关类型
 * @param[in]       item_idx: 系统设置项索引（0-6）
 * @return          data_bool_t: DATA_BOOL_TRUE-是开关类型, DATA_BOOL_FALSE-不是
 */
extern data_bool_t data_mgr_is_debugset_system_switch_type(uint8_t item_idx);

/**
 * @brief           检查出厂调试系统设置项是否为数值类型
 * @param[in]       item_idx: 系统设置项索引（0-6）
 * @return          data_bool_t: DATA_BOOL_TRUE-是数值类型, DATA_BOOL_FALSE-不是
 */
extern data_bool_t data_mgr_is_debugset_system_number_type(uint8_t item_idx);

/**
 * @brief           更新出厂调试数据（从系统获取最新数据）
 * @return          void
 */
extern void data_mgr_refresh_debugset_data(void);

/**
 * @brief           获取出厂调试菜单数量
 * @return          uint8_t: 菜单数量
 * @note            数据流向: data_debugset.c -> data_manager.c -> service_debugset.c
 */
extern uint8_t data_mgr_get_debugset_menu_count(void);

/**
 * @brief           获取密码配置（最小值、最大值、默认值）
 * @param[out]      min: 输出密码最小值
 * @param[out]      max: 输出密码最大值
 * @param[out]      default_val: 输出密码默认值
 * @return          data_bool_t: DATA_BOOL_TRUE-成功, DATA_BOOL_FALSE-失败
 * @note            数据流向: data_debugset.c -> data_manager.c -> service_debugset.c
 */
extern data_bool_t data_mgr_get_password_config(uint16_t *min, uint16_t *max, uint16_t *default_val);

/**
 * @brief           获取背光时间配置（最小值、最大值、默认值）
 * @param[out]      min: 输出背光时间最小值
 * @param[out]      max: 输出背光时间最大值
 * @param[out]      default_val: 输出背光时间默认值
 * @return          data_bool_t: DATA_BOOL_TRUE-成功, DATA_BOOL_FALSE-失败
 * @note            数据流向: data_debugset.c -> data_manager.c -> service_debugset.c
 */
extern data_bool_t data_mgr_get_backlight_config(uint32_t *min, uint32_t *max, uint32_t *default_val);

/**
 * @brief           获取系统时间默认值
 * @param[out]      year: 输出默认年
 * @param[out]      month: 输出默认月
 * @param[out]      day: 输出默认日
 * @param[out]      hour: 输出默认时
 * @param[out]      min: 输出默认分
 * @param[out]      sec: 输出默认秒
 * @return          data_bool_t: DATA_BOOL_TRUE-成功, DATA_BOOL_FALSE-失败
 * @note            数据流向: data_debugset.c -> data_manager.c -> service_debugset.c
 */
extern data_bool_t data_mgr_get_datetime_default(uint16_t *year, uint8_t *month, uint8_t *day,
                                                  uint8_t *hour, uint8_t *min, uint8_t *sec);

/**
 * @brief 获取现在运行的模式
 * @return E_FUN_MODE 
 * @date 2026-04-02
 */
extern E_FUN_MODE Get_DTU_Runmode(void);

#endif
