#include "ui_comp_datetime_set.h"
#include "ui_cont.h"
#include "data_config.h"

// 组件变量
static lv_obj_t *win_datetime;
static lv_obj_t *btn_ok;
static lv_obj_t *btn_cancel;
static lv_obj_t *label_ok;
static lv_obj_t *label_cancel;
static lv_obj_t *label_message;
static lv_obj_t *label_error;
static lv_obj_t *label_guide;

// 时间输入框: 0-年, 1-月, 2-日, 3-时, 4-分, 5-秒
static lv_obj_t *input_fields[6];
// 分隔符标签
static lv_obj_t *sep_labels[4]; // 年月日之间的分隔符和时分秒之间的分隔符

static int current_focus = 0; // 0-5: 输入框, 6: 确定按钮, 7: 取消按钮
static datetime_op_t datetime_result = DATETIME_OP_CANCEL;
static datetime_value_t current_datetime;

// 每月的天数表（非闰年）
static const uint8_t days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// 判断是否为闰年
static bool is_leap_year(uint16_t year) {
    return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}

// 获取某月的最大天数
static uint8_t get_max_days(uint16_t year, uint8_t month) {
    if (month == 2 && is_leap_year(year)) {
        return 29;
    }
    return days_in_month[month - 1];
}

// 获取输入框的数字位数
static int get_digit_count(int index) {
    if (index == 0) return 4; // 年份4位
    return 2; // 其他2位
}

// 初始化时间输入
static void init_datetime_sections(datetime_value_t *datetime) {
    if (datetime != NULL) {
        current_datetime = *datetime;
    } else {
        // 默认时间: 2024-01-01 00:00:00
        current_datetime.year = 2024;
        current_datetime.month = 1;
        current_datetime.day = 1;
        current_datetime.hour = 0;
        current_datetime.minute = 0;
        current_datetime.second = 0;
    }

    // 设置到输入框
    if (input_fields[0]) lv_spinbox_set_value(input_fields[0], current_datetime.year);
    if (input_fields[1]) lv_spinbox_set_value(input_fields[1], current_datetime.month);
    if (input_fields[2]) lv_spinbox_set_value(input_fields[2], current_datetime.day);
    if (input_fields[3]) lv_spinbox_set_value(input_fields[3], current_datetime.hour);
    if (input_fields[4]) lv_spinbox_set_value(input_fields[4], current_datetime.minute);
    if (input_fields[5]) lv_spinbox_set_value(input_fields[5], current_datetime.second);
}

// 从输入框更新当前时间结构体
static void update_datetime_from_inputs(void) {
    current_datetime.year = (uint16_t)lv_spinbox_get_value(input_fields[0]);
    current_datetime.month = (uint8_t)lv_spinbox_get_value(input_fields[1]);
    current_datetime.day = (uint8_t)lv_spinbox_get_value(input_fields[2]);
    current_datetime.hour = (uint8_t)lv_spinbox_get_value(input_fields[3]);
    current_datetime.minute = (uint8_t)lv_spinbox_get_value(input_fields[4]);
    current_datetime.second = (uint8_t)lv_spinbox_get_value(input_fields[5]);
}

// 更新输入框显示
static void update_input_fields(void) {
    for (int i = 0; i < 6; i++) {
        if (current_focus == i) {
            // 焦点状态：红色文字，黄色背景
            lv_obj_set_style_local_text_color(input_fields[i], LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
            lv_obj_set_style_local_bg_color(input_fields[i], LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
            lv_textarea_set_cursor_blink_time(input_fields[i], 400);
            lv_textarea_set_cursor_hidden(input_fields[i], false);
        } else {
            // 非焦点状态：黑色文字，白色背景
            lv_obj_set_style_local_text_color(input_fields[i], LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
            lv_obj_set_style_local_bg_color(input_fields[i], LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
            lv_textarea_set_cursor_blink_time(input_fields[i], 0);
            lv_textarea_set_cursor_hidden(input_fields[i], true);
        }
    }
}

// 更新按钮焦点状态
static void update_button_focus(void) {
    if (label_ok) {
        lv_obj_set_style_local_text_color(label_ok, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT,
                                          (current_focus == 6) ? LV_COLOR_RED : LV_COLOR_BLACK);
    }
    if (label_cancel) {
        lv_obj_set_style_local_text_color(label_cancel, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT,
                                          (current_focus == 7) ? LV_COLOR_RED : LV_COLOR_BLACK);
    }
}

// 更新操作指引
static void update_guide(void) {
    if (current_focus < 6) {
        lv_label_set_text(label_guide, "上/下: 增减数字 左/右: 切换输入框");
    } else {
        lv_label_set_text(label_guide, "左/右: 切换按钮 确定: 选择");
    }
}

// 检查时间是否有效
bool ui_comp_datetime_set_is_valid(void) {
    update_datetime_from_inputs();

    if (current_datetime.year < 2000 || current_datetime.year > 2099) return false;
    if (current_datetime.month < 1 || current_datetime.month > 12) return false;
    if (current_datetime.day < 1 || current_datetime.day > get_max_days(current_datetime.year, current_datetime.month)) return false;
    if (current_datetime.hour > 23) return false;
    if (current_datetime.minute > 59) return false;
    if (current_datetime.second > 59) return false;

    return true;
}

// 更新错误提示
static void update_error(void) {
    if (ui_comp_datetime_set_is_valid()) {
        lv_label_set_text(label_error, "");
        lv_obj_set_style_local_text_color(label_error, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN);
    } else {
        lv_label_set_text(label_error, "时间格式错误");
        lv_obj_set_style_local_text_color(label_error, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
    }
}

// 调整日期范围（当月份或年份变化时）
static void adjust_day_range(void) {
    update_datetime_from_inputs();
    uint8_t max_days = get_max_days(current_datetime.year, current_datetime.month);

    // 如果当前日期超出新月份的最大天数，调整为最大天数
    if (current_datetime.day > max_days) {
        current_datetime.day = max_days;
        lv_spinbox_set_value(input_fields[2], current_datetime.day);
    }

    // 更新日的范围限制
    lv_spinbox_set_range(input_fields[2], 1, max_days);
}

// 创建单个时间输入框
static lv_obj_t* create_time_input_field(lv_obj_t *parent, int x, int y, int width, int min_val, int max_val) {
    lv_obj_t *spinbox = lv_spinbox_create(parent, NULL);
    lv_obj_set_size(spinbox, width, 30);
    lv_obj_set_style_local_text_font(spinbox, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(spinbox, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_obj_set_style_local_bg_color(spinbox, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
    lv_obj_set_style_local_border_color(spinbox, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
    lv_obj_set_style_local_border_width(spinbox, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, 2);
    // 减小内边距，确保数字有足够显示空间
    lv_obj_set_style_local_pad_all(spinbox, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, 2);
    // 设置文本对齐方式为居中，确保数字显示完整
    lv_textarea_set_text_align(spinbox, LV_LABEL_ALIGN_CENTER);

    lv_spinbox_set_range(spinbox, min_val, max_val);
    lv_spinbox_set_step(spinbox, 1);

    // 设置数字格式
    int digit_count = (max_val > 999) ? 4 : ((max_val > 99) ? 3 : 2);
    lv_spinbox_set_digit_format(spinbox, digit_count, 0);

    lv_textarea_set_cursor_blink_time(spinbox, 0);
    lv_textarea_set_cursor_hidden(spinbox, true);

    lv_obj_align(spinbox, NULL, LV_ALIGN_IN_TOP_LEFT, x, y);

    return spinbox;
}

// 创建分隔符标签
static lv_obj_t* create_separator_label(lv_obj_t *parent, lv_obj_t *prev_obj, const char *text, int spacing) {
    lv_obj_t *label = lv_label_create(parent, NULL);
    lv_obj_set_style_local_text_font(label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(label, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_label_set_text(label, text);
    lv_obj_align(label, prev_obj, LV_ALIGN_OUT_RIGHT_MID, spacing / 2, 0);
    return label;
}

// 创建时间设置组件
void ui_comp_datetime_set_create(datetime_value_t *datetime) {
    // 创建背景遮罩
    lv_obj_t *bg_mask = lv_obj_create(ui_get_cont(), NULL);
    lv_obj_set_size(bg_mask, LV_HOR_RES_MAX, LV_VER_RES_MAX);
    lv_obj_set_style_local_bg_color(bg_mask, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_obj_set_style_local_bg_opa(bg_mask, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_50);

    // 创建窗体对象
    win_datetime = lv_win_create(bg_mask, NULL);
    lv_obj_set_size(win_datetime, 360, 240);
    lv_obj_set_style_local_text_font(win_datetime, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_bg_opa(win_datetime, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_100);
    lv_obj_set_style_local_border_opa(win_datetime, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_100);
    lv_obj_set_style_local_bg_color(win_datetime, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_CYAN);
    lv_win_set_title(win_datetime, "时间设置");
    lv_win_set_btn_width(win_datetime, 30);
    lv_obj_align(win_datetime, NULL, LV_ALIGN_CENTER, 0, 0);

    // ==================== 优化后的布局参数 ====================
    // 整体向上调整，为底部按钮留出足够空间
    int win_width = 360;
    // 增加年份输入框宽度，确保4位数字能完整显示（从55增加到62）
    int input_width_year = 62;
    int input_width_other = 42;
    int spacing = 8;
    int row_spacing = 20;
    
    // 计算日期行的起始X坐标（居中）
    int date_row_width = input_width_year + spacing + input_width_other + spacing + input_width_other + spacing * 2;
    int start_x_date = (win_width - date_row_width) / 2;
    // 整体向上调整（从70改为55）
    int y_date = 55;
    
    // 计算时间行的起始X坐标（居中）
    int time_row_width = input_width_other + spacing + input_width_other + spacing + input_width_other + spacing * 2;
    int start_x_time = (win_width - time_row_width) / 2;
    int y_time = y_date + 30 + row_spacing;

    // 创建提示信息标签（位置向上调整）
    label_message = lv_label_create(win_datetime, NULL);
    lv_obj_set_style_local_text_font(label_message, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(label_message, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_label_set_text(label_message, "请设置日期和时间：");
    lv_obj_align(label_message, NULL, LV_ALIGN_IN_TOP_LEFT, 20, 20);

    // 创建日期输入框 (年-月-日)
    // 年输入框 (2000-2099)
    input_fields[0] = create_time_input_field(win_datetime, start_x_date, y_date, input_width_year, 2000, 2099);
    sep_labels[0] = create_separator_label(win_datetime, input_fields[0], "-", spacing);

    // 月输入框 (1-12)
    input_fields[1] = create_time_input_field(win_datetime, 0, 0, input_width_other, 1, 12);
    lv_obj_align(input_fields[1], sep_labels[0], LV_ALIGN_OUT_RIGHT_MID, spacing, 0);
    sep_labels[1] = create_separator_label(win_datetime, input_fields[1], "-", spacing);

    // 日输入框 (1-31，动态范围)
    input_fields[2] = create_time_input_field(win_datetime, 0, 0, input_width_other, 1, 31);
    lv_obj_align(input_fields[2], sep_labels[1], LV_ALIGN_OUT_RIGHT_MID, spacing, 0);

    // 创建时间输入框 (时:分:秒)
    // 时输入框 (0-23)
    input_fields[3] = create_time_input_field(win_datetime, start_x_time, y_time, input_width_other, 0, 23);
    sep_labels[2] = create_separator_label(win_datetime, input_fields[3], ":", spacing);

    // 分输入框 (0-59)
    input_fields[4] = create_time_input_field(win_datetime, 0, 0, input_width_other, 0, 59);
    lv_obj_align(input_fields[4], sep_labels[2], LV_ALIGN_OUT_RIGHT_MID, spacing, 0);
    sep_labels[3] = create_separator_label(win_datetime, input_fields[4], ":", spacing);

    // 秒输入框 (0-59)
    input_fields[5] = create_time_input_field(win_datetime, 0, 0, input_width_other, 0, 59);
    lv_obj_align(input_fields[5], sep_labels[3], LV_ALIGN_OUT_RIGHT_MID, spacing, 0);

    // 初始化时间值
    init_datetime_sections(datetime);

    // 根据初始值调整日的范围
    adjust_day_range();

    // 创建错误提示标签（位于输入框下方，位置向上调整）
    label_error = lv_label_create(win_datetime, NULL);
    lv_obj_set_style_local_text_font(label_error, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(label_error, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
    lv_label_set_text(label_error, "");
    lv_obj_align(label_error, NULL, LV_ALIGN_IN_TOP_MID, 0, y_time + 32);

    // ==================== 优化按钮和提示文字布局 ====================
    // 操作指引标签位置（向上调整，避免与按钮重叠）
    int guide_y = 138;
    // 按钮位置（向下调整）
    int btn_bottom_margin = -12;
    
    // 创建操作指引标签（位于按钮上方，避免重叠）
    label_guide = lv_label_create(win_datetime, NULL);
    lv_obj_set_style_local_text_font(label_guide, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_obj_set_style_local_text_color(label_guide, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
    lv_label_set_text(label_guide, "上/下: 增减数字 左/右: 切换输入框");
    lv_obj_align(label_guide, NULL, LV_ALIGN_IN_TOP_MID, 0, guide_y);

    // 创建确定按钮（左侧，向下调整避免与提示文字重叠）
    btn_ok = lv_btn_create(win_datetime, NULL);
    lv_obj_set_size(btn_ok, 80, 32);
    lv_obj_align(btn_ok, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 70, btn_bottom_margin);

    label_ok = lv_label_create(btn_ok, NULL);
    lv_obj_set_style_local_text_font(label_ok, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_label_set_text(label_ok, "确定");

    // 创建取消按钮（右侧）
    btn_cancel = lv_btn_create(win_datetime, NULL);
    lv_obj_set_size(btn_cancel, 80, 32);
    lv_obj_align(btn_cancel, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, -70, btn_bottom_margin);

    label_cancel = lv_label_create(btn_cancel, NULL);
    lv_obj_set_style_local_text_font(label_cancel, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);
    lv_label_set_text(label_cancel, "取消");

    // 初始设置焦点
    current_focus = 0;
    // 设置光标到第一个输入框的首位
    lv_textarea_set_cursor_pos(input_fields[0], 0);
    update_input_fields();
    update_button_focus();
    update_error();
    update_guide();
}

// 处理上方向键操作
void ui_comp_datetime_set_handle_up(void) {
    if (current_focus < 6) {
        // 增加当前时间字段的数值
        lv_spinbox_increment(input_fields[current_focus]);

        // 如果修改了年或月，需要调整日的范围
        if (current_focus == 0 || current_focus == 1) {
            adjust_day_range();
        }

        update_error();
    }
}

// 处理下方向键操作
void ui_comp_datetime_set_handle_down(void) {
    if (current_focus < 6) {
        // 减少当前时间字段的数值
        lv_spinbox_decrement(input_fields[current_focus]);

        // 如果修改了年或月，需要调整日的范围
        if (current_focus == 0 || current_focus == 1) {
            adjust_day_range();
        }

        update_error();
    }
}

// 处理左方向键操作
void ui_comp_datetime_set_handle_left(void) {
    if (current_focus < 6) {
        // 获取当前输入框的光标位置
        uint32_t cursor_pos = lv_textarea_get_cursor_pos(input_fields[current_focus]);

        if (cursor_pos == 0) {
            // 光标在输入框首位
            if (current_focus > 0) {
                // 不是第一个输入框，切换到上一个输入框的最后一位
                current_focus--;
                int digit_count = get_digit_count(current_focus);
                lv_textarea_set_cursor_pos(input_fields[current_focus], digit_count - 1);
                update_input_fields();
                update_button_focus();
                update_guide();
            } else {
                // 是第一个输入框，切换到取消按钮
                current_focus = 7;
                update_input_fields();
                update_button_focus();
                update_guide();
            }
        } else {
            // 光标在输入框内非首位，向左移动光标
            lv_spinbox_step_prev(input_fields[current_focus]);
        }
    } else if (current_focus == 6) {
        // 在确定按钮上，向左切换到最后一个输入框（秒输入框）
        current_focus = 5;
        lv_textarea_set_cursor_pos(input_fields[5], 1);
        update_input_fields();
        update_button_focus();
        update_guide();
    } else if (current_focus == 7) {
        // 在取消按钮上，向左切换到确定按钮
        current_focus = 6;
        update_input_fields();
        update_button_focus();
        update_guide();
    }
}

// 处理右方向键操作
void ui_comp_datetime_set_handle_right(void) {
    if (current_focus < 6) {
        // 获取当前输入框的光标位置
        uint32_t cursor_pos = lv_textarea_get_cursor_pos(input_fields[current_focus]);
        int digit_count = get_digit_count(current_focus);

        if (cursor_pos >= digit_count - 1) {
            // 光标在输入框末位
            if (current_focus < 5) {
                // 不是最后一个输入框，切换到下一个输入框的首位
                current_focus++;
                lv_textarea_set_cursor_pos(input_fields[current_focus], 0);
                update_input_fields();
                update_button_focus();
                update_guide();
            } else {
                // 是最后一个输入框，切换到确定按钮
                current_focus = 6;
                update_input_fields();
                update_button_focus();
                update_guide();
            }
        } else {
            // 光标在输入框内非末位，向右移动光标
            lv_spinbox_step_next(input_fields[current_focus]);
        }
    } else if (current_focus < 7) {
        // 在按钮区域，向右切换按钮
        current_focus++;
        update_input_fields();
        update_button_focus();
        update_guide();
    } else if (current_focus == 7) {
        // 在取消按钮上，向右切换到第一个输入框
        current_focus = 0;
        lv_textarea_set_cursor_pos(input_fields[0], 0);
        update_input_fields();
        update_button_focus();
        update_guide();
    }
}

// 处理确定键操作
void ui_comp_datetime_set_handle_enter(void) {
    datetime_result = DATETIME_OP_OTHER;

    if (current_focus == 6) {
        // 点击确定按钮
        if (ui_comp_datetime_set_is_valid()) {
            // 禁用所有输入框的光标闪烁
            for (int i = 0; i < 6; i++) {
                lv_textarea_set_cursor_blink_time(input_fields[i], 0);
                lv_textarea_set_cursor_hidden(input_fields[i], true);
            }
            datetime_result = DATETIME_OP_OK;
        }
    } else if (current_focus == 7) {
        // 点击取消按钮
        for (int i = 0; i < 6; i++) {
            lv_textarea_set_cursor_blink_time(input_fields[i], 0);
            lv_textarea_set_cursor_hidden(input_fields[i], true);
        }
        datetime_result = DATETIME_OP_CANCEL;
    }
}

// 获取时间设置结果
datetime_op_t ui_comp_datetime_set_get_result(void) {
    return datetime_result;
}

// 获取设置的时间值
datetime_value_t ui_comp_datetime_set_get_value(void) {
    update_datetime_from_inputs();
    return current_datetime;
}
