#ifndef SERVICE_DEBUGSET_H
#define SERVICE_DEBUGSET_H

#include "data_config.h"
#include "ui_config.h"
#include "comm.h"
#include "ui/ui_components/ui_comp_datetime_set.h"

/* ==================================================================================================================== */
/* 文件说明：service_debugset.h - 出厂调试模块service层头文件
/* ==================================================================================================================== */
/* 架构分层说明：
 * 本文件属于service层，负责出厂调试模块的业务逻辑处理
 *
 * 数据流向：
 * 1. 菜单/项名称数据：data_debugset.c -> data_manager.c -> service_debugset.c
 * 2. 选项列表数据：   data_debugset.c -> data_manager.c -> service_debugset.c
 * 3. 实时数值数据：   系统底层 -> data_debugset.c -> data_manager.c -> service_debugset.c
 *
 * 设计原则：
 * 1. service层不包含任何静态数据定义（选项列表、菜单名称等）
 * 2. 所有数据通过data_manager接口从data层动态获取
 * 3. 如需修改数据内容，只需修改data层，无需调整service层
 * 4. 字符串常量仅用于UI显示格式，业务数据均来自data层
 */
/* ==================================================================================================================== */

// ==================== 菜单索引定义 ====================
// 菜单索引通过data层动态获取，此处仅保留菜单索引枚举用于代码可读性
// 实际菜单数量通过 debugset_service_get_menu_len() 从data层获取

typedef enum {
    DEBUGSET_MENU_STATUS_INFO = 0,      // 状态信息
    DEBUGSET_MENU_SYSTEM_SET,           // 系统设置
    DEBUGSET_MENU_MAX                   // 菜单总数（占位符，实际值从data层获取）
} debugset_menu_index_t;

// ==================== 字符串常量定义 ====================
// 注意：以下字符串仅用于UI显示格式，业务数据均通过data_manager从data层获取

// UI显示字符串 - 密码验证界面
#define DEBUGSET_STR_SYS_PARAM_SET      "系统参数设置"  // 系统参数设置标题
#define DEBUGSET_STR_EMPTY              ""              // 空字符串

// 错误状态字符串
#define DEBUGSET_STR_ERRSTATE_OK        "1:OK "         // 错误状态-正常
#define DEBUGSET_STR_ERRSTATE_ERROR     "0:Error "      // 错误状态-错误

// 运行状态字符串
#define DEBUGSET_STR_RUNSTATE_STOP      "0:停止 "       // 运行状态-停止
#define DEBUGSET_STR_RUNSTATE_RUN       "1:运行 "       // 运行状态-运行
#define DEBUGSET_STR_RUNSTATE_FAULT     "2:故障 "       // 运行状态-故障

// 开关状态字符串
#define DEBUGSET_STR_SWITCH_OFF         "0:退出 "       // 开关状态-退出
#define DEBUGSET_STR_SWITCH_ON          "1:投入 "       // 开关状态-投入

// 设置界面字符串
#define DEBUGSET_STR_SET_SELECT         "设置选择:"     // 设置选择提示
#define DEBUGSET_STR_SET_VALUE          "设置数值:"     // 设置数值提示

// 系统设置项索引定义 - 从data层data_debugset.h中的debugset_system_item_t同步
// 注意：这些索引必须与data_debugset.c中的s_system_items数组顺序一致
typedef enum {
    SYSSET_ITEM_FACTORY_RESET = 0,      // 恢复出厂设置
    SYSSET_ITEM_CLEAR_HISTORY,          // 清除历史记录
    SYSSET_ITEM_CLEAR_ENERGY,           // 电度清除
    SYSSET_ITEM_DATETIME,               // 系统时间设置
    SYSSET_ITEM_PASSWORD,               // 密码设置
    SYSSET_ITEM_CALIBRATION,            // 系数校准
    SYSSET_ITEM_BACKLIGHT,              // 背光时间设置
    SYSSET_ITEM_MAX                     // 系统设置项总数（占位符，实际值从data层获取）
} sysset_item_index_t;

// 系统设置操作结果
typedef enum {
    SYSSET_OP_SUCCESS = 0,
    SYSSET_OP_FAILED,
    SYSSET_OP_CANCELLED,
    SYSSET_OP_INVALID_PARAM
} sysset_op_result_t;

/**
 * @brief 获取出厂调试页面UI显示数据
 * @param ctx           页面上下文
 * @param menu_sel_idx  选中菜单索引 (0=状态信息, 1=系统设置)
 * @param item_sel_idx  菜单内选中项索引
 * @param config        输出配置结构体
 * @param is_verified   是否通过密码验证
 */
extern void debugset_service_get_show_ui_data(PageCtx *ctx, u8 menu_sel_idx, u8 item_sel_idx, GeneralListPageConfig_t *config, bool is_verified);

/**
 * @brief 获取出厂调试页面菜单总数
 * @return 菜单数量 (2)
 */
extern uint16_t debugset_service_get_menu_len(void);

/**
 * @brief 获取指定菜单的项数
 * @param menu_sel_idx  菜单索引
 * @return 指定菜单的项数
 */
extern uint16_t debugset_service_get_items_len(u8 menu_sel_idx);

// ==================== 系统设置数据处理接口 ====================

/**
 * @brief 执行恢复出厂设置
 * @return 操作结果
 */
sysset_op_result_t debugset_service_factory_reset(void);

/**
 * @brief 执行清除历史记录
 * @return 操作结果
 */
sysset_op_result_t debugset_service_clear_history(void);

/**
 * @brief 执行电度清除
 * @return 操作结果
 */
sysset_op_result_t debugset_service_clear_energy(void);

/**
 * @brief 获取当前系统时间
 * @param datetime 输出时间结构体
 * @return 操作结果
 */
sysset_op_result_t debugset_service_get_datetime(datetime_value_t *datetime);

/**
 * @brief 设置系统时间
 * @param datetime 时间结构体
 * @return 操作结果
 */
sysset_op_result_t debugset_service_set_datetime(const datetime_value_t *datetime);

/**
 * @brief 获取当前系统密码
 * @return 当前密码值 (0-9999)
 */
uint16_t debugset_service_get_password(void);

/**
 * @brief 设置系统密码
 * @param password 新密码 (0-9999)
 * @return 操作结果
 */
sysset_op_result_t debugset_service_set_password(uint16_t password);

/**
 * @brief 执行系数校准
 * @return 操作结果
 */
sysset_op_result_t debugset_service_calibrate(void);

/**
 * @brief 获取背光时间
 * @return 背光时间值 (0-65536)
 */
uint32_t debugset_service_get_backlight_time(void);

/**
 * @brief 设置背光时间
 * @param time 背光时间值 (0-65536)
 * @return 操作结果
 */
sysset_op_result_t debugset_service_set_backlight_time(uint32_t time);

/**
 * @brief 获取系统设置项的当前值
 * @param item_idx 设置项索引 (0-6)
 * @param value 输出值
 * @return 操作结果
 */
sysset_op_result_t debugset_service_get_item_value(u8 item_idx, uint32_t *value);

/**
 * @brief 设置系统设置项的值
 * @param item_idx 设置项索引 (0-6)
 * @param value 设置值
 * @return 操作结果
 */
sysset_op_result_t debugset_service_set_item_value(u8 item_idx, uint32_t value);

/**
 * @brief 检查设置项是否为开关类型（退出/投入）
 * @param item_idx 设置项索引
 * @return true-开关类型, false-非开关类型
 */
bool debugset_service_is_switch_type(u8 item_idx);

/**
 * @brief 检查设置项是否为数值类型
 * @param item_idx 设置项索引
 * @return true-数值类型, false-非数值类型
 */
bool debugset_service_is_number_type(u8 item_idx);

/**
 * @brief 获取设置项的配置信息
 * @param item_idx 设置项索引
 * @param title 输出标题
 * @param min 输出最小值
 * @param max 输出最大值
 * @return 操作结果
 */
sysset_op_result_t debugset_service_get_item_config(u8 item_idx, const char **title, uint32_t *min, uint32_t *max);

// ==================== UI数据组装接口 ====================
// 注意：以下接口均从data层获取数据，service层不包含静态数据定义

/**
 * @brief 创建设置项的UI配置
 * @param item_idx 设置项索引
 * @param set_opt 输出配置结构体
 * @return 操作结果
 * @note 此函数将UI数据组装逻辑从app层迁移到service层，符合分层架构设计
 *       选项列表数据通过data_debugset_get_switch_options()从data层动态获取
 */
sysset_op_result_t debugset_service_create_ui_config(u8 item_idx, UiSetValueOptDef *set_opt);

/**
 * @brief 获取开关类型选项列表
 * @param options 输出选项列表指针（指向data层内部静态数据）
 * @param count 输出选项数量
 * @return 操作结果
 * @note 数据流向: data_debugset.c -> service_debugset.c
 *       返回的指针指向data层内部静态数据，请勿释放
 */
sysset_op_result_t debugset_service_get_switch_options(const UiSetOption **options, uint8_t *count);

#endif // SERVICE_DEBUGSET_H
