#ifndef _DATA_DEBUGSET_H
#define _DATA_DEBUGSET_H

#include "data_config.h"
#include "bsp_type.h"
#include "head.h"
// #include "MmiData.h"
#include "menu/Manu_str.h"

/***** 出厂调试菜单总表 - 兼容层定义 *****/
extern t_datafixval_cfg_total gst_debugset_val[];
extern const uint8_t guc_menu_debugset_num;

/**
 * @brief           获取出厂调试指定菜单的描述名称
 * @param[in]       menu_idx: 菜单索引 (0=状态信息, 1=系统设置)
 * @return          const char*: 菜单描述字符串，错误时返回NULL
 */
const char* data_debugset_get_menu_name(uint8_t menu_idx);

/***** 数据更新接口 *****/
extern void data_debugset_update_from_system(uint8_t _uc_type, const SET_VALUE *_pt_val);

/* ==================== 状态信息数据获取接口 ==================== */

/**
 * @brief           获取状态信息指定项的当前值
 * @param[in]       item_idx: 状态信息项索引 (0-MENU_STUINFO_NUM-1)
 * @return          float: 当前值，错误时返回0
 */
float data_debugset_get_status_value(uint8_t item_idx);

/**
 * @brief           获取状态信息指定项的名称
 * @param[in]       item_idx: 状态信息项索引 (0-MENU_STUINFO_NUM-1)
 * @return          const char*: 名称字符串，错误时返回NULL
 */
const char* data_debugset_get_status_name(uint8_t item_idx);

/**
 * @brief           获取状态信息指定项的单位
 * @param[in]       item_idx: 状态信息项索引 (0-MENU_STUINFO_NUM-1)
 * @return          const char*: 单位字符串，错误时返回空字符串
 */
const char* data_debugset_get_status_unit(uint8_t item_idx);

/**
 * @brief           获取状态信息项数量
 * @return          uint8_t: 状态信息项数量
 */
uint8_t data_debugset_get_status_item_count(void);

/* ==================== 系统设置数据获取接口 ==================== */

/**
 * @brief           获取系统设置指定项的当前值
 * @param[in]       item_idx: 系统设置项索引 (0-MENU_MAINTENSET_NUM-1)
 * @return          float: 当前值，错误时返回0
 */
float data_debugset_get_system_value(uint8_t item_idx);

/**
 * @brief           获取系统设置指定项的名称
 * @param[in]       item_idx: 系统设置项索引 (0-MENU_MAINTENSET_NUM-1)
 * @return          const char*: 名称字符串，错误时返回NULL
 */
const char* data_debugset_get_system_name(uint8_t item_idx);

/**
 * @brief           获取系统设置指定项的单位
 * @param[in]       item_idx: 系统设置项索引 (0-MENU_MAINTENSET_NUM-1)
 * @return          const char*: 单位字符串，错误时返回空字符串
 */
const char* data_debugset_get_system_unit(uint8_t item_idx);

/**
 * @brief           获取系统设置指定项的最小值
 * @param[in]       item_idx: 系统设置项索引 (0-MENU_MAINTENSET_NUM-1)
 * @return          uint32_t: 最小值
 */
uint32_t data_debugset_get_system_min(uint8_t item_idx);

/**
 * @brief           获取系统设置指定项的最大值
 * @param[in]       item_idx: 系统设置项索引 (0-MENU_MAINTENSET_NUM-1)
 * @return          uint32_t: 最大值
 */
uint32_t data_debugset_get_system_max(uint8_t item_idx);

/**
 * @brief           获取系统设置指定项的小数位数
 * @param[in]       item_idx: 系统设置项索引 (0-MENU_MAINTENSET_NUM-1)
 * @return          uint8_t: 小数位数
 */
uint8_t data_debugset_get_system_point(uint8_t item_idx);

/**
 * @brief           获取系统设置指定项的数值选项类型
 * @param[in]       item_idx: 系统设置项索引 (0-MENU_MAINTENSET_NUM-1)
 * @return          uint8_t: 数值选项类型
 */
uint8_t data_debugset_get_system_numeric_opt(uint8_t item_idx);

/**
 * @brief           获取系统设置项数量
 * @return          uint8_t: 系统设置项数量
 */
uint8_t data_debugset_get_system_item_count(void);

/**
 * @brief           检查系统设置项是否为开关类型
 * @param[in]       item_idx: 系统设置项索引 (0-MENU_MAINTENSET_NUM-1)
 * @return          bool: true-是开关类型, false-不是
 */
bool data_debugset_is_system_switch_type(uint8_t item_idx);

/**
 * @brief           检查系统设置项是否为数值类型
 * @param[in]       item_idx: 系统设置项索引 (0-MENU_MAINTENSET_NUM-1)
 * @return          bool: true-是数值类型, false-不是
 */
bool data_debugset_is_system_number_type(uint8_t item_idx);

/* ==================== 菜单和配置数据接口 ==================== */

/**
 * @brief           获取出厂调试菜单数量
 * @return          uint8_t: 菜单数量
 */
uint8_t data_debugset_get_menu_count(void);

/**
 * @brief           获取密码配置（最小值、最大值、默认值）
 * @param[out]      min: 输出密码最小值
 * @param[out]      max: 输出密码最大值
 * @param[out]      default_val: 输出密码默认值
 * @return          bool: true-成功, false-失败
 */
bool data_debugset_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          bool: true-成功, false-失败
 */
bool data_debugset_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          bool: true-成功, false-失败
 */
bool data_debugset_get_datetime_default(uint16_t *year, uint8_t *month, uint8_t *day,
                                         uint8_t *hour, uint8_t *min, uint8_t *sec);

/* ==================== 系统设置功能函数接口 ==================== */

/**
 * @brief           执行恢复出厂设置功能
 * @return          bool: true-成功, false-失败
 */
bool data_debugset_execute_factory_reset(void);

/**
 * @brief           执行清除历史记录功能
 * @return          bool: true-成功, false-失败
 */
bool data_debugset_execute_clear_history(void);

/**
 * @brief           执行电度清除功能
 * @return          bool: true-成功, false-失败
 */
bool data_debugset_execute_clear_energy(void);

/**
 * @brief           设置系统时间
 * @param[in]       year: 年 (2000-2099)
 * @param[in]       month: 月 (1-12)
 * @param[in]       day: 日 (1-31)
 * @param[in]       hour: 时 (0-23)
 * @param[in]       min: 分 (0-59)
 * @param[in]       sec: 秒 (0-59)
 * @return          bool: true-成功, false-失败
 */
bool data_debugset_set_datetime(uint16_t year, uint8_t month, uint8_t day,
                                 uint8_t hour, uint8_t min, uint8_t sec);

/**
 * @brief           设置系统密码
 * @param[in]       password: 密码 (0-9999)
 * @return          bool: true-成功, false-失败
 */
bool data_debugset_set_password(uint16_t password);

/**
 * @brief           执行系数校准
 * @return          bool: true-成功, false-失败
 */
bool data_debugset_execute_calibration(void);

/**
 * @brief           设置背光时间
 * @param[in]       time: 背光时间 (秒)
 * @return          bool: true-成功, false-失败
 */
bool data_debugset_set_backlight_time(uint32_t time);

/* ==================== 数据更新接口 ==================== */

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

/* ==================== 选项数据接口 ==================== */

/**
 * @brief           获取开关类型选项列表
 * @param[out]      options: 输出选项列表指针（指向data层内部静态数据）
 * @param[out]      count: 输出选项数量
 * @return          bool: true-成功, false-失败
 * @note            选项数据包含：退出(0)、投入(1)
 */
bool data_debugset_get_switch_options(const SET_LIST **options, uint8_t *count);

/**
 * @brief           获取运行状态选项列表
 * @param[out]      options: 输出选项列表指针（指向data层内部静态数据）
 * @param[out]      count: 输出选项数量
 * @return          bool: true-成功, false-失败
 * @note            选项数据包含：停止(0)、运行(1)、故障(2)
 */
bool data_debugset_get_run_state_options(const SET_LIST **options, uint8_t *count);

/**
 * @brief           获取错误状态选项列表
 * @param[out]      options: 输出选项列表指针（指向data层内部静态数据）
 * @param[out]      count: 输出选项数量
 * @return          bool: true-成功, false-失败
 * @note            选项数据包含：Error(0)、OK(1)
 */
bool data_debugset_get_err_state_options(const SET_LIST **options, uint8_t *count);

#endif //_DATA_DEBUGSET_H
