#include "service_dev_set.h"
#include "format_utils.h"
#include "data_manager.h"

#define DS_SHOW_RIGHT_VALUE_X       340  // 可根据页面调整，内部兼容
#define DS_SHOW_RIGHT_UNIT_X        440


void ds_create_show_ui_data(PageCtx *ctx ,u8 menu_sel_idx , u8 item_sel_idx , GeneralListPageConfig_t *config)
{
    u8 i = 0;
    const t_datafixval_cfg_total *p_cfg = NULL;
    const TSETTABLE *fix_val = NULL;
    t_datafixval_cfg *fix_val_cfg = NULL;
    char ca_buf[20] = {0};
    uint16_t menu_size = 0;
    uint16_t menulen = 0;
    PageInfo info;  // 计算页数  定义存储结果的结构体
    DataModule module;

    if (config == NULL)
    {
        GeneralListPageConfig_t default_config = {0};
        config = &default_config;
    }
    

    //标题栏
    strcpy(config->path_text, Disp_path_opt[0]);

    //不同页面不同等级展示不同数据
    if (ctx->cur_page == PAGE_DEV_SET)
    {
        strcat(config->path_text, MainManu_dis[0]);
        if (ctx->pwd_type == UI_PWD_TYPE_SUPER)
        {
            module = MODULE_DEV_SET;
        }
        else if (ctx->pwd_type == UI_PWD_TYPE_NORMAL)
        {
            module = MODULE_DEV_SET_SHOW;
        }
    }
    else if (ctx->cur_page == PAGE_DEV_SET_SHOW)
    {
        module = MODULE_DEV_SET_SHOW;
        strcat(config->path_text, MainManu_dis[2]);
    }

    //左侧菜单栏
    //uint16_t menu_size = data_set_get_module_cfg_total(MODULE_DEV_FIX_SHOW, &p_cfg);
    menu_size = data_mgr_get_module_cfg_total(module, &p_cfg);

    calculate_page_info_default(menu_sel_idx , menu_size, &info);
    config->left_menu_count = info.current_page_items;

    for ( i = 0; i < config->left_menu_count; i++)
    {
        int leftidx = i + DEFAULT_LEFT_MENU_INDEX * (info.current_page - 1);
        strcpy(config->left_menu[i].text , p_cfg[leftidx].des);
        if (leftidx == menu_sel_idx)
        {
            config->left_menu[i].color = LV_COLOR_RED;
        }
        else
            config->left_menu[i].color = Default_HZ_color;
    }

    menulen =  p_cfg[menu_sel_idx].us_val;   //
    //printf("%s menu idx = %d , menu len = %d \n", __FUNCTION__ , menu_sel_idx , menulen);

    config->slider_size = menulen;          //设置进度条
    config->slider_value = item_sel_idx;

    //PageInfo info;  // 计算页数  定义存储结果的结构体
    calculate_page_info_default(item_sel_idx , menulen , &info);
    config->total_page = info.total_pages;
    config->current_page = info.current_page;
    config->right_data_count = info.current_page_items; //此页有多少数据

    for ( i = 0; i < config->right_data_count; i++)
    {
        
        //  注释掉 使用默认位置即可
        config->right_data[i].value_posx = DS_SHOW_RIGHT_VALUE_X;
        config->right_data[i].unit_posx = DS_SHOW_RIGHT_UNIT_X;
        
        //  计算数据索引
        int dataidx = i + DEFAULT_RIGHT_DATA_ITEM_COUNT * (info.current_page - 1) ;
        fix_val_cfg = &p_cfg[menu_sel_idx].fs[dataidx];         
        fix_val =  data_mgr_get_fixvaldes_struct(fix_val_cfg);

        strcpy(config->right_data[i].name, fix_val->szName);
        config->right_data[i].name_color = Default_HZ_color;        //设置名称颜色

        if (item_sel_idx == dataidx && ctx->cursor_state.cursor_pos == CURSOR_RIGHT_DATA)    //如果是选中的则设置红色
        {
            config->right_data[i].value_color = LV_COLOR_RED;
        }
        else
        {
            config->right_data[i].value_color = Default_HZ_color;
        }

        formate_set_value_to_str(fix_val , fix_val_cfg , ca_buf);
        strncpy(config->right_data[i].value , ca_buf , strlen(ca_buf));   //赋值数值
        // format_float_to_string(menu_opt[dataidx].point, menu_opt[dataidx].value, buf, sizeof(buf)); //浮点型转字符串

        strncpy(config->right_data[i].unit , SetUints[fix_val->wUnit] , strlen(SetUints[fix_val->wUnit]));    //赋值单位
        
    }
}

void ds_service_get_show_ui_data(PageCtx *ctx ,u8 menu_sel_idx , u8 item_sel_idx , GeneralListPageConfig_t *config)
{
    // if (ctx->cur_page == PAGE_DEV_SET_SHOW)
    // {
    //     ds_create_show_ui_data(ctx , menu_sel_idx , item_sel_idx,config);
    // }
    // else if (ctx->cur_page == PAGE_DEV_SET)
    // {
    //     if (ctx->pwd_type == UI_PWD_TYPE_NORMAL)
    //     {
    //         ds_create_show_ui_data(ctx , menu_sel_idx , item_sel_idx,config);
    //     }
    //     else if (ctx->pwd_type == UI_PWD_TYPE_SUPER)
    //     {
    //         ds_create_set_ui_data(ctx , menu_sel_idx , item_sel_idx , config);
    //     }
        
    // }
    ds_create_show_ui_data(ctx ,menu_sel_idx , item_sel_idx , config);
}


uint16_t ds_service_get_menu_len_by_page(PageType cur_page)
{
    DataModule module = MODULE_END;
    if (cur_page == PAGE_DEV_SET)
    {
        module = MODULE_DEV_SET;
    }
    else if (cur_page == PAGE_DEV_SET_SHOW)
    {
        module = MODULE_DEV_SET_SHOW;
    }
    
    return data_mgr_get_menu_len_by_module(module);
}


uint16_t ds_service_get_items_len_by_page(PageType cur_page , u8 menu_sel_idx)
{
    DataModule module = MODULE_END;
    if (cur_page == PAGE_DEV_SET)
    {
        module = MODULE_DEV_SET;
    }
    else if (cur_page == PAGE_DEV_SET_SHOW)
    {
        module = MODULE_DEV_SET_SHOW;
    }
    
    return data_mgr_get_items_len_by_module(module , menu_sel_idx);
}

/**
 * @brief  恢复界面定值到默认值
 * @param  module           数据类型
 * @date 2026-02-03
 */
void ds_service_restore_default_values(DataModule module)
{
    data_mgr_restore_default_values(module);
}

void ds_service_get_sel_setval_data(PageCtx *ctx ,UiSetValueOptDef *ui_opt)
{
    const t_datafixval_cfg_total *p_cfg = NULL;
    const TSETTABLE *fix_val = NULL;
    t_datafixval_cfg *fix_val_cfg = NULL;
    DataModule module = MODULE_END;
    if (ui_opt == NULL)
    {
        UiSetValueOptDef tempopt = {0};
        ui_opt = &tempopt;
    }

    u8 menu_sel = ctx->cursor_state.left_menu_idx;
    u8 item_sel = ctx->cursor_state.right_data_idx;
    
    if (ctx->cur_page == PAGE_DEV_SET_SHOW)
    {
        module = MODULE_DEV_SET_SHOW;
    }
    else if (ctx->cur_page == PAGE_DEV_SET)
    {
        if (ctx->pwd_type == UI_PWD_TYPE_SUPER)
        {
            module = MODULE_DEV_SET;
        }
        else if (ctx->pwd_type == UI_PWD_TYPE_NORMAL)
        {
            module = MODULE_DEV_SET_SHOW;
        } 
    }

    data_mgr_get_module_cfg_total(module, &p_cfg);
    fix_val_cfg = &p_cfg[menu_sel].fs[item_sel];         
    fix_val =  data_mgr_get_fixvaldes_struct(fix_val_cfg);    

    // 填充结构体
    ui_opt->title = fix_val->szName;
    // 处理IP地址特殊情况
    if (is_special_ip_addr(fix_val_cfg->us_addr))
    {
        ui_opt->curr_ip = fix_val_cfg->ul_val_set; // 赋值IP地址
    }
    else
    {
        ui_opt->curr_value = fix_val_cfg->f_val_set; // 赋值
    }
    ui_opt->max_value = fix_val->fMax;
    ui_opt->min_value = fix_val->fMin;
    ui_opt->step = fix_val->fStep;
    // ui_opt->decimal_digit = get_decimal_digit(fix_val->fStep);
    if (fix_val->fStep == 1.0f)
    {
        ui_opt->decimal_digit = 0;
    }
    else if (fix_val->fStep == 0.01f)
    {
        ui_opt->decimal_digit = 2;
    }
    
    // 转换选项列表：从底层SET_LIST转换为UI层UiSetOption
    ui_opt->opt_list_num = fix_val->listnum;
    if (fix_val->listnum > 0 && fix_val->list != NULL)
    {
        // 由于UI层只需要读取数据，直接使用底层数据的指针（类型转换）
        ui_opt->opt_list = (const UiSetOption *)fix_val->list;
    }
    else
    {
        ui_opt->opt_list = NULL;
    }
    
    ui_opt->unit = SetUints[fix_val->wUnit];

    printf("%s fix_val->wType = %d \n", __FUNCTION__,fix_val->wType );
    if (fix_val->wType == SETTYPE_LIST)
    {
        ui_opt->type = UISETOPT_TYPE_LIST;
        ui_opt->set_str = SetVale_dis[1][0];
    }
    else //if (fix_val->wType == SETTYPE_F || fix_val->wType == SETTYPE_UINT)
    {
        if (is_special_ip_addr(fix_val_cfg->us_addr)){
            ui_opt->type = UISETOPT_TYPE_IP;
            printf("%s is ip addr!!\n", __FUNCTION__);
        }
        else
            ui_opt->type = UISETOPT_TYPE_NUMBER;

        ui_opt->set_str = SetVale_dis[0][0];
    }
    

}


/**
 * @brief           修改菜单数据
 * @param[in]       module: 模块类型，如MODULE_DEV_SET、MODULE_DEV_FIX等
 * @param[in]       menu_id: 菜单ID，对应具体的菜单索引
 * @param[in]       data_id: 数据ID，对应菜单中的具体数据项索引
 * @param[in]       value: 要设置的新值，根据type类型不同而不同
 * @return          bool: 修改成功返回true，失败返回false
 * @date            2026-02-02
 */
bool ds_service_modify_menu_data(DataModule module, uint8_t menu_id, uint8_t data_id, float value)
{
    // 直接调用data_manager层的函数进行处理
    return data_mgr_modify_menu_data(module, menu_id, data_id, value);
}

/**
 * @brief           修改菜单IP数据
 * @param[in]       module: 模块类型，如MODULE_DEV_SET、MODULE_DEV_FIX等
 * @param[in]       menu_id: 菜单ID，对应具体的菜单索引
 * @param[in]       data_id: 数据ID，对应菜单中的具体数据项索引
 * @param[in]       value: 要设置的新IP地址值
 * @return          bool: 修改成功返回true，失败返回false
 * @date            2026-02-05
 */
bool ds_service_modify_menu_data_ip(DataModule module, uint8_t menu_id, uint8_t data_id, uint32_t value)
{
    return data_mgr_modify_menu_data_ip(module, menu_id, data_id, value);
}


/**
 * @brief  保存界面数值到系统之中
 * @param  module           数据类型
 * @return true 
 * @return false 
 * @date 2026-02-03
 */
bool ds_set_data_to_system(DataModule module)
{
    return data_mgr_set_data_to_system(module);
}

/**
 * @brief           检查系统数据差异
 * @return          bool: 有差异返回true，无差异返回false
 * @date            2026-02-02
 */
bool ds_service_check_diff(void)
{
    return data_mgr_check_diff();
}
