#include "service_fix_set.h"
#include "data_manager.h"
#include "comm.h"
#include "format_utils.h"

#define FS_SET_RIGHT_VALUE_X       370  // 可根据页面调整，内部兼容
#define FS_SET_RIGHT_UNIT_X        440



static void fs_fill_softswitch_disabled_tip(GeneralListPageConfig_t *config)
{
    if (config == NULL)
    {
        return;
    }

    config->right_data_count = 1;
    config->total_page = 1;
    config->current_page = 1;
    config->slider_size = 0;
    config->slider_value = 0;

    strcpy(config->right_data[0].name, "功能软压板未投入");
    strcpy(config->right_data[0].value, "");
    strcpy(config->right_data[0].unit, "");
    config->right_data[0].value_posx = FS_SET_RIGHT_VALUE_X;
    config->right_data[0].unit_posx = FS_SET_RIGHT_UNIT_X;
    config->right_data[0].name_color = Default_HZ_color;
    config->right_data[0].value_color = Default_HZ_color;
    config->right_data[0].unit_color = Default_HZ_color;
}


void fs_formate_value_to_str(const TSETTABLE *fix_val , t_datafixval_cfg *fix_val_cfg , char* buf)
{
    
    WORD type = fix_val->wType;
    uint8_t uc_des_index;
    uint32_t ul_val;
    int32_t l_val;
    int64_t ll_val;
    const SET_LIST *pt_des_list = NULL;
    switch (type) {
        case SETTYPE_LIST: /* 列表选择 */
            pt_des_list = fix_val->list;
            uc_des_index = (uint8_t)fix_val_cfg->f_val_set;
            
            sprintf(buf , "%d:%s" , uc_des_index , pt_des_list[uc_des_index].str);
            break;

        case SETTYPE_F: /* 浮点数 */
            sprintf(buf, "%.02f", fix_val_cfg->f_val_set);

            break;

        case SETTYPE_UINT: /* 无符号整型 */
        case SETTYPE_4INT: /* 4字节整型 */
            ul_val = (uint32_t)fix_val_cfg->f_val_set;
            sprintf(buf, "%d", ul_val);
            break;

        case SETTYPE_5INT: /* 有符号整型 */
            l_val = (int32_t)fix_val_cfg->f_val_set;
            sprintf(buf, "%d", l_val);
            break;

        case SETTYPE_LINT: /* 长整型 */
            ll_val = (int64_t)fix_val_cfg->f_val_set;
            sprintf(buf, "%d", ll_val);
            break;

        case SETTYPE_IP: /* IP地址 */
            sprintf(buf, "%03d.%03d.%03d.%03d",
                    BYTE0(fix_val_cfg->ul_val_set),
                    BYTE1(fix_val_cfg->ul_val_set),
                    BYTE2(fix_val_cfg->ul_val_set),
                    BYTE3(fix_val_cfg->ul_val_set));
            break;

        case SETTYPE_YMD: /* 年月日 */
            sprintf(buf, "%f", fix_val_cfg->f_val_set);
            break;

        case SETTYPE_HMS: /* 时分秒 */
            sprintf(buf, "%f", fix_val_cfg->f_val_set);
            break;

        case SETTYPE_KG:    /* 控制字 没有后续，直接显示即可 */
        case SETTYPE_LABEL: /* 标签类 实际没有用处 */
        default:
            break;
    }
}

void fs_create_fix_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;  // 计算页数  定义存储结果的结构体

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

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

    
    //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_DEV_FIX_SHOW, &p_cfg);
    // printf("%s menu_size = %d \n", __FUNCTION__ , menu_size);
    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);
        // printf("%s des = %s \n", __FUNCTION__ , 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;
    }

    if (!data_mgr_is_menu_func_enabled(MODULE_DEV_FIX_SHOW, menu_sel_idx))
    {
        fs_fill_softswitch_disabled_tip(config);
        return;
    }

    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 = FS_SET_RIGHT_VALUE_X;
        config->right_data[i].unit_posx = FS_SET_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;
        }

        // fs_formate_value_to_str(fix_val , fix_val_cfg , ca_buf);
        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 fs_create_set_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};
    PageInfo info;  // 计算页数  定义存储结果的结构体
    uint16_t menu_size = 0;
    uint16_t menulen = 0;

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

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

    
    // uint16_t menu_size = data_set_get_module_cfg_total(MODULE_DEV_FIX, &p_cfg);
    menu_size = data_mgr_get_module_cfg_total(MODULE_DEV_FIX, &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;
    }

    if (!data_mgr_is_menu_func_enabled(MODULE_DEV_FIX, menu_sel_idx))
    {
        fs_fill_softswitch_disabled_tip(config);
        return;
    }

    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 = FS_SET_RIGHT_VALUE_X;
        config->right_data[i].unit_posx = FS_SET_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;
        }

        // fs_formate_value_to_str(fix_val , fix_val_cfg , ca_buf);
        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 fs_service_get_show_ui_data(PageCtx *ctx ,u8 menu_sel_idx , u8 item_sel_idx , GeneralListPageConfig_t *config)
{
    if (ctx->cur_page == PAGE_DEV_FIX)
    {
        if (ctx->pwd_type == UI_PWD_TYPE_NORMAL)
        {
            fs_create_fix_show_ui_data(ctx , menu_sel_idx , item_sel_idx , config);
        }
        else if (ctx->pwd_type == UI_PWD_TYPE_SUPER)
        {
            fs_create_set_ui_data(ctx , menu_sel_idx , item_sel_idx , config);
        }
    }
    else if (ctx->cur_page == PAGE_DEV_FIX_SHOW)
    {
        fs_create_fix_show_ui_data(ctx , menu_sel_idx , item_sel_idx , config);
    }
    
}




uint16_t fs_service_get_menu_len_by_page(PageType cur_page)
{
    DataModule module = MODULE_END;
    if (cur_page == PAGE_DEV_FIX)
    {
        module = MODULE_DEV_FIX;
    }
    else if (cur_page == PAGE_DEV_FIX_SHOW)
    {
        module = MODULE_DEV_FIX_SHOW;
    }
    
    return data_mgr_get_menu_len_by_module(module);
}


uint16_t fs_service_get_items_len_by_page(PageType cur_page , u8 menu_sel_idx)
{
    DataModule module = MODULE_END;
    if (cur_page == PAGE_DEV_FIX)
    {
        module = MODULE_DEV_FIX;
    }
    else if (cur_page == PAGE_DEV_FIX_SHOW)
    {
        module = MODULE_DEV_FIX_SHOW;
    }

    if (module != MODULE_END && !data_mgr_is_menu_func_enabled(module, menu_sel_idx))
    {
        return 1;
    }
    
    return data_mgr_get_items_len_by_module(module , menu_sel_idx);
}
/**
 * @brief  判断菜单功能是否投入
 * @param  ctx              上下文
 * @param  menu_sel_idx     菜单索引
 * @return true            功能可用
 * @return false           功能不可用
 * @date 2026-02-06
 */
bool fs_service_is_menu_enabled(PageCtx *ctx, u8 menu_sel_idx)
{
    DataModule module = MODULE_END;

    if (ctx == NULL)
    {
        return false;
    }

    if (ctx->cur_page == PAGE_DEV_FIX_SHOW)
    {
        module = MODULE_DEV_FIX_SHOW;
    }
    else if (ctx->cur_page == PAGE_DEV_FIX)
    {
        if (ctx->pwd_type == UI_PWD_TYPE_SUPER)
        {
            module = MODULE_DEV_FIX;
        }
        else
        {
            module = MODULE_DEV_FIX_SHOW;
        }
    }

    if (module == MODULE_END)
    {
        return false;
    }

    return data_mgr_is_menu_func_enabled(module, menu_sel_idx);
}


void fs_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_FIX_SHOW)
    {
        module = MODULE_DEV_FIX_SHOW;
    }
    else if (ctx->cur_page == PAGE_DEV_FIX)
    {
        if (ctx->pwd_type == UI_PWD_TYPE_SUPER)
        {
            module = MODULE_DEV_FIX;
        }
        else if (ctx->pwd_type == UI_PWD_TYPE_NORMAL)
        {
            module = MODULE_DEV_FIX_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;
    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];
    
    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)
    {
        ui_opt->type = UISETOPT_TYPE_NUMBER;
        ui_opt->set_str = SetVale_dis[0][0];
    }
    

#if(0)
    // ===================== 新增：ui_opt 填充值调试打印 =====================
    printf("===================== UI结构体 UiSetValueOptDef 填充值 =====================\r\n");
    // 字符串字段（判空，避免野指针打印崩溃）
    printf("定值名称(title)：%s\r\n", ui_opt->title ? ui_opt->title : "NULL");
    printf("单位(unit)：%s\r\n", ui_opt->unit ? ui_opt->unit : "NULL");
    // 浮点数字段（适配小数位，和UI展示一致）
    printf("当前值(curr_value)：%.*f\r\n", ui_opt->decimal_digit, ui_opt->curr_value);
    printf("最小值(min_value)：%.*f\r\n", ui_opt->decimal_digit, ui_opt->min_value);
    printf("最大值(max_value)：%.*f\r\n", ui_opt->decimal_digit, ui_opt->max_value);
    printf("步长(step)：%f\r\n", ui_opt->step);
    // 整数字段
    printf("小数位数(decimal_digit)：%d\r\n", ui_opt->decimal_digit);
    printf("选项数量(opt_list_num)：%d\r\n", ui_opt->opt_list_num);
    printf("定值类型(type)：%d (SETTYPE_LIST=%d/SETTYPE_F=%d)\r\n", 
           ui_opt->type, SETTYPE_LIST, SETTYPE_F);
    // 指针字段（打印地址，判断是否为空）
    printf("选项列表指针(opt_list)：%p\r\n", (void*)ui_opt->opt_list);
    printf("==========================================================================\r\n\r\n");
#endif
}

/**
 * @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
 */
extern bool fs_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           检查系统数据差异
 * @return          bool: 有差异返回true，无差异返回false
 * @date            2026-02-02
 */
bool fs_service_check_diff(void)
{
    return data_mgr_check_diff();
}


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


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

/**
 * @brief  判断当前选中的是否为"不停电传动投入"软压板
 * @param  ctx           页面上下文
 * @return true          是"不停电传动投入"软压板
 * @return false         不是"不停电传动投入"软压板
 * @date 2026-02-06
 */
bool fs_service_is_trasw_yb_selected(PageCtx *ctx)
{
    const t_datafixval_cfg_total *p_cfg = NULL;
    t_datafixval_cfg *fix_val_cfg = NULL;
    DataModule module = MODULE_END;

    if (ctx == NULL)
    {
        return false;
    }

    u8 menu_sel = ctx->cursor_state.left_menu_idx;
    u8 item_sel = ctx->cursor_state.right_data_idx;
    
    if (ctx->cur_page == PAGE_DEV_FIX_SHOW)
    {
        module = MODULE_DEV_FIX_SHOW;
    }
    else if (ctx->cur_page == PAGE_DEV_FIX)
    {
        if (ctx->pwd_type == UI_PWD_TYPE_SUPER)
        {
            module = MODULE_DEV_FIX;
        }
        else if (ctx->pwd_type == UI_PWD_TYPE_NORMAL)
        {
            module = MODULE_DEV_FIX_SHOW;
        } 
    }

    data_mgr_get_module_cfg_total(module, &p_cfg);
    if (p_cfg == NULL)
    {
        return false;
    }

    fix_val_cfg = &p_cfg[menu_sel].fs[item_sel];
    if (fix_val_cfg == NULL)
    {
        return false;
    }

    return (fix_val_cfg->us_addr == SET_TRASW_YB);
}