#include "ui_comp_set_vale_list.h"
#include "ui_config.h"
#include "ui_cont.h"
#include "ui_slider.h"
#include <string.h>
#include <math.h>
#include "ui_spinbox.h"

// 单位枚举转字符串（需根据实际SET_A/SET_S等定义补充）
 const char *unit_to_str(WORD wUnit) {
    switch (wUnit) {
        case SET_A: return "A";     // 安培
        case SET_S: return "s";     // 秒
        case SET_NULL: return "";   // 无单位
        // 补充其他单位类型
        default: return "";
    }
}

// 推导小数位数（step=1→0位，step=0.01→2位，其他可扩展）
 int get_decimal_digit(float step) {
    if (fabs(step - 1.0f) < 1e-6) {
        return 0;
    } else if (fabs(step - 0.01f) < 1e-6) {
        return 2;
    }
    // 可扩展其他步长（如0.1→1位）
    return 0;
}

// 底层TSETTABLE转UI专属结构体（核心解耦函数）
void tsettable_to_ui_opt(const TSETTABLE *tset, UiSetValueOptDef *ui_opt) {
    if (tset == NULL || ui_opt == NULL) return;

    // 映射UI所需字段
    ui_opt->title = tset->szName;
    ui_opt->curr_value = tset->fDef;
    ui_opt->max_value = tset->fMax;
    ui_opt->min_value = tset->fMin;
    ui_opt->step = tset->fStep;
    ui_opt->decimal_digit = get_decimal_digit(tset->fStep);
    ui_opt->opt_list = tset->list;
    ui_opt->opt_list_num = tset->listnum;
    ui_opt->unit = unit_to_str(tset->wUnit);
    ui_opt->type = tset->wType;
}

// 格式化浮点数为字符串（适配小数位）
 void format_float_str(char *buf, int buf_len, float val, int decimal_digit) {
 // 1. 先做合法性检查
    if (buf == NULL || buf_len <= 0) return;
    
    // 2. 清空缓冲区（用buf_len而非sizeof(buf)）
    memset(buf, 0, buf_len);
    
    // 3. 打印调试信息（保留）
    // printf("%s val = %f , decimal_digit = %d \n", __FUNCTION__ , val ,decimal_digit);
    
    // 4. 格式化浮点数
    switch (decimal_digit) {
        case 0:
            snprintf(buf, buf_len, "%.0f", val);
            break;
        case 2:
            snprintf(buf, buf_len, "%.2f", val);
            break;
        default:
            snprintf(buf, buf_len, "%.0f", val);
            break;
    }
}

// 创建主窗口
static void create_window(SetValueListPage_t *page) {
    if (page == NULL) return;
    
    // 创建主窗口
    page->win = lv_win_create(page->cont, NULL);
    lv_obj_set_size(page->win, 310, 160);
    lv_obj_set_style_local_text_font(page->win, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_bg_opa(page->win, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_100);
    lv_obj_set_style_local_border_opa(page->win, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_100);
    lv_obj_set_style_local_bg_color(page->win, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, page->config.bg_color);
    lv_win_set_title(page->win, page->config.ui_opt.title); // 设置窗口标题
    lv_win_set_btn_width(page->win, 30);
    lv_obj_align(page->win, NULL, LV_ALIGN_CENTER, 0, 0);
}

// 创建基础标签
static void create_base_labels(SetValueListPage_t *page) {
    if (page == NULL || page->win == NULL) return;
    
    // 创建基础标签（定值名称）
    lv_obj_t *label_name = lv_label_create(page->win, NULL);
    lv_obj_set_style_local_text_font(label_name, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(label_name, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_label_set_text(label_name, page->config.ui_opt.set_str); // 显示定值名称
    lv_obj_align(label_name, NULL, LV_ALIGN_IN_TOP_LEFT, 25, 25);
}

// 创建非数值型选项（SETTYPE_LIST）
static void create_list_option(SetValueListPage_t *page) {
    if (page == NULL || page->win == NULL) return;
    
    // 创建非数值选项标签
    page->list_label = lv_label_create(page->win, NULL);
    lv_obj_set_style_local_text_font(page->list_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(page->list_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
    
    // 显示当前选项（示例：取缺省值对应索引）
    char val_buf[20] = {0};
    int curr_idx = (int)page->config.ui_opt.curr_value;
    if (curr_idx >= 0 && curr_idx < page->config.ui_opt.opt_list_num && page->config.ui_opt.opt_list != NULL) {
        snprintf(val_buf, sizeof(val_buf), "%d:%s", curr_idx, page->config.ui_opt.opt_list[curr_idx].str);
    } else {
        snprintf(val_buf, sizeof(val_buf), "%d:未知选项", curr_idx);
    }
    lv_label_set_text(page->list_label, val_buf);
    lv_obj_align(page->list_label, NULL, LV_ALIGN_IN_TOP_LEFT, 140, 25);

    // 显示当前值标签
    page->curr_label = lv_label_create(page->win, NULL);
    lv_obj_set_style_local_text_font(page->curr_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(page->curr_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    snprintf(val_buf, sizeof(val_buf), "当前值: %d", (int)page->config.ui_opt.curr_value);
    lv_label_set_text(page->curr_label, val_buf);
    lv_obj_align(page->curr_label, NULL, LV_ALIGN_IN_TOP_LEFT, 25, 60);
}

// 创建数值型选项（SETTYPE_F）
static void create_float_option(SetValueListPage_t *page) {
    if (page == NULL || page->win == NULL) return;
    
    // 创建基础标签（数值型标识）
    lv_obj_t *label_name = lv_label_create(page->win, NULL);
    lv_obj_set_style_local_text_font(label_name, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(label_name, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_label_set_text(label_name, page->config.ui_opt.set_str);
    lv_obj_align(label_name, NULL, LV_ALIGN_IN_TOP_LEFT, 25, 25);

    // 创建spinbox数值控件
    page->spinbox = lv_spinbox_create(page->win, NULL);
    lv_obj_set_size(page->spinbox, 100, 40);
    lv_obj_align(page->spinbox, NULL, LV_ALIGN_IN_TOP_LEFT, 120, 14);
    
    // 设置spinbox步长、范围
    lv_spinbox_set_step(page->spinbox, 1); // 适配新步长
    lv_spinbox_set_range(page->spinbox, page->config.ui_opt.min_value * pow(10, page->g_decimal_digit), page->config.ui_opt.max_value * pow(10, page->g_decimal_digit));
    lv_spinbox_set_padding_left(page->spinbox, 6);

    // 计算spinbox显示位数（适配小数位）
    uint8_t datlen = 5;
    float max_val = page->config.ui_opt.max_value;
    if (page->g_decimal_digit == 0) { // 无小数
        if (max_val < 10) datlen = 1;
        else if (max_val < 100) datlen = 2;
        else if (max_val < 1000) datlen = 3;
        else if (max_val < 10000) datlen = 4;
        else if (max_val < 100000) datlen = 5;
        else datlen = 6;
    } else if (page->g_decimal_digit == 2) { // 两位小数
        if (max_val < 100) datlen = 4;  // 如99.99 → 4位（含小数点）
        else if (max_val < 1000) datlen = 5;
        else datlen = 6;
    }
    lv_spinbox_set_digit_format(page->spinbox, datlen, datlen - page->g_decimal_digit);
    // 设为缺省值，需要根据小数位数进行缩放
    lv_spinbox_set_value(page->spinbox, (int32_t)(page->config.ui_opt.curr_value * pow(10, page->g_decimal_digit)));

    // 显示单位标签
    page->unit_label = lv_label_create(page->win, NULL);
    lv_obj_set_style_local_text_font(page->unit_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(page->unit_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_label_set_text(page->unit_label, page->config.ui_opt.unit);
    lv_obj_align(page->unit_label, NULL, LV_ALIGN_IN_TOP_LEFT, 220, 25);

    // 显示最小值标签
    page->min_label = lv_label_create(page->win, NULL);
    lv_obj_set_style_local_text_font(page->min_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(page->min_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    char tmp_buf[20] = {0}; // 临时缓冲区，避免源/目标复用
    char val_buf[20] = {0};
    format_float_str(tmp_buf, sizeof(tmp_buf), page->config.ui_opt.min_value, page->g_decimal_digit);
    snprintf(val_buf, sizeof(val_buf), "最小值: %s", tmp_buf); // 用tmp_buf作为源
    // printf("%s val_buf = %s\n", __FUNCTION__, val_buf);
    lv_label_set_text(page->min_label, val_buf);
    lv_obj_align(page->min_label, NULL, LV_ALIGN_IN_TOP_LEFT, 25, 60);

    // 显示最大值标签
    page->max_label = lv_label_create(page->win, NULL);
    lv_obj_set_style_local_text_font(page->max_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(page->max_label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    memset(tmp_buf, 0, sizeof(tmp_buf)); // 清空临时缓冲区
    format_float_str(tmp_buf, sizeof(tmp_buf), page->config.ui_opt.max_value, page->g_decimal_digit);
    snprintf(val_buf, sizeof(val_buf), "最大值: %s", tmp_buf); // 用tmp_buf作为源
    // printf("%s val_buf = %s\n", __FUNCTION__, val_buf);
    lv_label_set_text(page->max_label, val_buf);
    lv_obj_align(page->max_label, NULL, LV_ALIGN_IN_TOP_LEFT, 25, 95);
}

// UI创建核心函数
bool ui_comp_set_vale_list_create(SetValueListPage_t *page, const SetValueListPageConfig_t *config) {
    if (page == NULL || config == NULL) return false;

    // 1. 初始化页面
    memset(page, 0, sizeof(SetValueListPage_t));
    page->config = *config;
    page->g_step = config->ui_opt.step;
    page->g_decimal_digit = config->ui_opt.decimal_digit;

    // 2. 获取容器
    page->cont = ui_get_cont(); // 获取UI容器
    if (page->cont == NULL) return false;

    // 3. 创建窗口
    create_window(page);
    if (page->win == NULL) return false;

    // 4. 创建基础标签
    create_base_labels(page);

    // 5. 根据类型创建不同的选项

    if (config->ui_opt.type == UISETOPT_TYPE_LIST) {
        create_list_option(page);
    } else if (config->ui_opt.type == UISETOPT_TYPE_NUMBER) {
        create_float_option(page);
    }

    return true;
}


// 销毁定值设置页面
void ui_comp_set_vale_list_destroy(SetValueListPage_t *page) {
    if (page == NULL) return;

    // 清理窗口
    if (page->win != NULL) {
        lv_obj_del(page->win);
        page->win = NULL;
    }
    
    // 清空结构体
    memset(page, 0, sizeof(SetValueListPage_t));
}

// 获取当前值（适配小数位或列表索引）
float ui_comp_set_vale_list_get_value(SetValueListPage_t *page) {
    if (page == NULL) return 0.0f;
    
    // 处理非数值型选项（SETTYPE_LIST）
    if (page->config.ui_opt.type == UISETOPT_TYPE_LIST) {
        return page->config.ui_opt.curr_value;
    }
    // 处理数值型选项（SETTYPE_F）
    else if (page->config.ui_opt.type == UISETOPT_TYPE_NUMBER) {
        if (page->spinbox == NULL) return 0.0f;
        // 需要根据小数位数进行缩放
        return (float)lv_spinbox_get_value(page->spinbox) / pow(10, page->g_decimal_digit);
    }
    
    return 0.0f;
}

// 操作spinbox或列表选项
int ui_comp_set_vale_list_spinbox(SetValueListPage_t *page, SpinboxSetOperate type) {
    if (page == NULL) return -1; // 空指针返回错误
    
    // 处理非数值型选项（SETTYPE_LIST）
    if (page->config.ui_opt.type == UISETOPT_TYPE_LIST ) {
        // 仅响应上下按钮操作
        if (type == SPINBOX_SET_UP || type == SPINBOX_SET_DOWN) {
            int curr_idx = (int)page->config.ui_opt.curr_value;
            int list_num = page->config.ui_opt.opt_list_num;
            
            // 处理空列表或单元素列表的边界情况
            if (list_num <= 0) return -1; // 空列表返回错误
            if (list_num == 1) return 0; // 单元素列表无需操作
            
            // 实现循环遍历
            if (type == SPINBOX_SET_UP) {
                // 向上：索引减1，到达0时回到末尾
                curr_idx = (curr_idx - 1 + list_num) % list_num;
            } else if (type == SPINBOX_SET_DOWN) {
                // 向下：索引加1，到达末尾时回到0
                curr_idx = (curr_idx + 1) % list_num;
            }
            
            // 更新当前值
            page->config.ui_opt.curr_value = (float)curr_idx;
            
            // 更新显示标签
            char val_buf[20] = {0};
            if (curr_idx >= 0 && curr_idx < list_num && page->config.ui_opt.opt_list != NULL) {
                snprintf(val_buf, sizeof(val_buf), "%d:%s", curr_idx, page->config.ui_opt.opt_list[curr_idx].str);
            } else {
                snprintf(val_buf, sizeof(val_buf), "%d:未知选项", curr_idx);
            }
            
            // 更新列表标签
            if (page->list_label != NULL) {
                lv_label_set_text(page->list_label, val_buf);
            }
            
            // 不再更新当前值标签，保持显示实时监测数据
            // curr_label 应显示实时数据，而非选中的选项索引
            
            return 0; // 成功返回0
        } else {
            // 左右按钮不触发任何响应
            return 0; // 无操作但返回成功
        }
    }
    // 处理数值型选项（SETTYPE_F）
    else if (page->config.ui_opt.type == UISETOPT_TYPE_NUMBER) {
        if (page->spinbox == NULL) return -1; // 空指针返回错误
        ui_spinbox_set_operate(page->spinbox, type);
        
        return 0; // 成功返回0
    }
    
    return -1; // 未知类型返回错误
}