
#include "ui_manager.h"
#include "ui_common/ui_cont.h"
#include "ui_pages/ui_main_menu.h"
#include "ui_pages/ui_home_page.h"
#include "ui_pages/ui_version_info_page.h"
#include "service/service_version_info.h"
#include "ui_pages/ui_history_report_page.h"
#include "../app/app_main_menu.h"
#include "../app/app_home_page.h"
#include "ui_components/ui_comp_input_pwd.h"
#include "ui_components/ui_comp_set_vale_list.h"
#include "ui_components/ui_comp_confirm_dialog.h"
#include "ui_components/ui_comp_ip_address.h"
#include "ui_components/ui_comp_datetime_set.h"
#include "core/lvgl/lvgl.h"
#include "core/lvgl_driver/fbdev.h"
#include "core/lvgl_driver/evdev.h"
#include "core/lvgl_driver/lv_port_indev.h"
#include "core/lvgl_driver/lv_fsdrv.h"
#include "updata_hzk.h"
#include "ui_general_list_page.h"

#define DISP_BUF_SIZE (480 * 320)
lv_obj_t *ui_scr;
lv_obj_t *ui_cont;

// PageType g_curPage;          //当前主页面
// UICursorState cursor_state;  //数据下标记录

PageCtx g_page_ctx;

// 定义页面对象
static GeneralListPage_t list_page;
// 定值设置页面全局变量
static SetValueListPage_t set_value_page;
// 历史报告页面配置
static HistoryReportPageConfig s_history_report_config;
static UIMainMenuConfig s_main_menu_config;
/**
 * @brief 初始化UI manager
 * @date 2026-01-12
 */
void ui_manager_init()
{
    printf("ui_manager_init\n");
    lv_init();
    lv_fs_posix_init();
    fbdev_init();

    static lv_color_t buf[DISP_BUF_SIZE];
    static lv_disp_buf_t disp_buf;
    lv_disp_buf_init(&disp_buf, buf, NULL, LV_HOR_RES_MAX * LV_VER_RES_MAX);
    static lv_disp_drv_t disp_drv;
    lv_disp_drv_init(&disp_drv);
    disp_drv.buffer = &disp_buf;
    disp_drv.flush_cb = fbdev_flush;
    disp_drv.hor_res = LV_HOR_RES_MAX;
    disp_drv.ver_res = LV_VER_RES_MAX;
    lv_disp_drv_register(&disp_drv);


    evdev_init();
    lv_indev_drv_t indev_drv;
    lv_indev_drv_init(&indev_drv);
    indev_drv.type = LV_INDEV_TYPE_KEYPAD;
    indev_drv.read_cb = evdev_read;
    lv_indev_drv_register(&indev_drv);


    init_displayfile();

    ui_scr = lv_scr_act(); // 获取当前活跃的屏幕对象
    ui_cont = ui_cont_creat(ui_scr ,Dev_Back_color);

    ui_manager_init_page_ctx();
}

/**
 * @brief 初始化page上下文
 * @date 2026-01-12
 */
void ui_manager_init_page_ctx()
{
    PageCtx default_ctx;
    default_ctx.cur_page = PAGE_HOME_PAGE;
    default_ctx.cursor_state.cursor_pos = CURSOR_LEFT_MENU;
    default_ctx.cursor_state.left_menu_idx = 0;
    default_ctx.cursor_state.right_data_idx = 0;
    default_ctx.pwd_type = UI_PWD_TYPE_NONE;
    ui_manager_set_page_ctx(&default_ctx);
}

/**
 * @brief 获取page上下文参数
 * @return page上下文参数 （只读）
 * @date 2026-01-12
 */
const PageCtx* ui_manager_get_page_ctx(void)
{
    return &g_page_ctx;
}

/**
 * @brief 设置page上下文参数
 * @param  ctx              上下文信息
 * @date 2026-01-12
 */
void ui_manager_set_page_ctx(const PageCtx* ctx)
{
    // 1. 判空：避免空指针访问崩溃
    if (ctx == NULL) {
        printf("%s: ctx is NULL!\n", __FUNCTION__);
        return;
    }
    // 2. 可选：校验参数合法性（防止非法页面/状态）
    if (ctx->cur_page < PAGE_HOME_PAGE || ctx->cur_page >= PAGE_NUM) {
        printf("%s: invalid cur_page: %d\n", __FUNCTION__, ctx->cur_page);
        return;
    }
    // 3. 深拷贝到全局上下文（指针指向的内容拷贝到全局变量）
    g_page_ctx = *ctx;
}

/**
 * @brief 获取当前列表光标数据
 * @return UICursorState 
 * @date 2026-01-12
 */
UICursorState ui_manager_get_cursor()
{
    return g_page_ctx.cursor_state;
}

/**
 * @brief 设置当前列表光标数据
 * @param  curState         参数
 * @date 2026-01-12
 */
void ui_manager_cursor_set_value(UICursorState curState)
{
    g_page_ctx.cursor_state = curState;
}

/**
 * @brief 获取当前页面密码等级（普通/超级密码）
 * @return PwdType 
 * @date 2026-01-12
 */
PwdType ui_manager_get_cur_pwdtype()
{
    return g_page_ctx.pwd_type;
}

/**
 * @brief 切换界面（旧函数，近首页，版本信息页还在使用）
 * @param  ctx              参数
 * @date 2026-01-12
 */
void ui_manager_switch_page(PageCtx *ctx)
{
    // 1. 健壮性：ctx为空时，生成默认上下文（兼容无参数的页面切换）
    PageCtx default_ctx = {0};
    if (ctx == NULL) {
        // 默认上下文：当前页面设为首页，光标无，密码类型无
        default_ctx.cur_page = PAGE_HOME_PAGE;
        ctx = &default_ctx;
    }

    // 2. 页面合法性校验
    PageType page = ctx->cur_page;
    if (page < PAGE_HOME_PAGE || page >= PAGE_NUM)
    {
        printf("%s page num is not valid . value = %d\n", __FUNCTION__, page);
        return ; 
    }
    ui_cont_clean(); //清除cont

    // 4. 更新全局状态：同步g_curPage + 全局PageCtx
    ui_manager_set_page_ctx(ctx);  // 自动更新全局上下文
    //g_curPage = page;
    switch (page)
    {
    case PAGE_MAIN_MENU:
        app_main_menu_create_page(ctx, ctx->cursor_state.left_menu_idx);
        break;
    case PAGE_HOME_PAGE:
        /**
         * 首页采用MVVM三层架构：
         * 1. App层协调Service和UI，管理页面生命周期
         * 2. Service层处理业务逻辑和数据格式化
         * 3. UI层纯渲染，无业务逻辑
         * 4. Data层封装原始数据获取
         */
        app_home_page_create();
        break;
    case PAGE_DEV_INFO:
    {
        /**
         * 版本信息页面采用MVVM三层架构：
         * 1. Service层获取页面配置数据（包含格式化后的标签和值）
         * 2. UI层根据配置创建页面控件（纯展示，无业务逻辑）
         *
         * 相比旧设计（UI层直接访问数据）：
         * - 职责分离：UI只负责渲染，数据处理下沉到Service层
         * - 便于维护：数据格式变化只需修改Service层
         * - 可测试性：Service层逻辑可独立单元测试
         */
        VersionInfoPageConfig config;
        if (version_info_service_get_page_config(&config)) {
            version_info_page_create(&config);
        }
        break;
    }
    default:
        break;
    }
}

/**
 * @brief 切换界面数据（旧函数，仅首页和菜单页使用）
 * @param  selIdex      光标ID
 * @date 2026-01-12
 */
void ui_manager_select_index(u8 selIdex)
{
    
    switch (ui_manager_get_curpage())
    {
    case PAGE_HOME_PAGE:
        
        ui_home_page_select(selIdex);
        break;
    case PAGE_MAIN_MENU:
        ui_manager_main_menu_refresh(selIdex);
        break;

    default:
        break;
    }
    //ui_main_menu_set_selected(index);
}

/**
 * @brief 获取当前页
 * @return PageType 
 * @date 2026-01-12
 */
PageType ui_manager_get_curpage()
{
    return g_page_ctx.cur_page;
}

/**
 * @brief 创建密码输入框
 * @date 2026-01-12
 */
void ui_manager_comp_create_input_pwd()
{
    ui_comp_input_pwd_create();
}
/**
 * @brief 获取密码输入框内容
 * 
 * @return int 
 */
int  ui_manager_comp_get_pwd()
{
    return ui_comp_input_pwd_get_value();
}

/**
 * @brief 设置密码输入框
 * @param  type             参数
 * @date 2026-01-12
 */
void ui_manager_comp_set_pwd(SpinboxSetOperate type)
{
    ui_comp_input_set_spinbox(type);
}



/**
 * @brief 创建数值设置框
 * @param  manu_opt         参数
 * @date 2026-01-12
 */
void ui_manager_comp_create_set_valist(const UiSetValueOptDef *ui_opt)
{
    // 清理容器
    // ui_cont_clean();
    
    // 构建配置
    SetValueListPageConfig_t config;
    memset(&config, 0, sizeof(SetValueListPageConfig_t));
    config.page_id = 0;
    strncpy(config.path_text, "设置", sizeof(config.path_text) - 1);
    config.ui_opt = *ui_opt;
    config.bg_color = LV_COLOR_CYAN;
    
    // 创建定值设置页面
    ui_comp_set_vale_list_create(&set_value_page, &config);
}

/**
 * @brief 操作数值设置框
 * @param  type             操作类型
 * @date 2026-01-12
 */
void ui_manager_comp_opera_set_valist(SpinboxSetOperate type)
{
    ui_comp_set_vale_list_spinbox(&set_value_page, type);
}

/**
 * @brief 获取数值设置框内容
 * @return int 
 * @date 2026-01-12
 */
float  ui_manager_comp_get_valist_spinbox_value()
{
    return ui_comp_set_vale_list_get_value(&set_value_page);
}


/**
 * @brief 切换列表数据
 * @param  curState         光标数据
 * @param  config           列表数据
 * @date 2026-01-12
 */
void ui_manager_select_list_data(UICursorState curState,GeneralListPageConfig_t *config)
{
    ui_manager_cursor_set_value(curState);  //更新状态
    ui_cont_clean();
    general_list_page_create(&list_page, config);
}

/**
 * @brief 生成列表数据
 * @param  ctx              page上下文
 * @param  config           列表数据
 * @date 2026-01-12
 */
void ui_manager_gerneral_list(PageCtx *ctx,GeneralListPageConfig_t *config)
{
    ui_cont_clean(); //清除cont
    ui_manager_set_page_ctx(ctx);
    //general_list_page_destroy(&list_page);
    // 一键创建页面
    general_list_page_create(&list_page, config);
}


/**
 * @brief 刷新列表数据
 * @param  curstate         光标状态
 * @param  config           列表数据
 * @date 2026-01-12
 */
void ui_manager_refresh_list(UICursorState curstate , GeneralListPageConfig_t *config)
{
    ui_manager_cursor_set_value(curstate);

    general_list_page_refresh(&list_page , config);
}

/**
 * @brief 创建历史报告页面
 * @param  ctx              page上下文
 * @param  config           历史报告页面配置
 * @date 2026-03-12
 */
void ui_manager_history_report_create(PageCtx *ctx, HistoryReportPageConfig *config)
{
    ui_cont_clean(); //清除cont
    ui_manager_set_page_ctx(ctx);
    
    // 保存配置
    if (config != NULL) {
        memcpy(&s_history_report_config, config, sizeof(HistoryReportPageConfig));
    }
    
    // 创建历史报告页面
    history_report_page_create(&s_history_report_config);
}

/**
 * @brief 刷新历史报告页面
 * @param  curstate         光标状态
 * @param  config           历史报告页面配置
 * @date 2026-03-12
 */
void ui_manager_history_report_refresh(UICursorState curstate, HistoryReportPageConfig *config)
{
    ui_manager_cursor_set_value(curstate);

    // 更新配置
    if (config != NULL) {
        memcpy(&s_history_report_config, config, sizeof(HistoryReportPageConfig));
    }

    // 刷新历史报告页面
    history_report_page_refresh(&s_history_report_config);
}

/**
 * @brief 创建保存确认对话框
 * @date 2026-02-02
 */
void ui_manager_comp_create_confirm_save()
{
    ui_comp_confirm_dialog_create();
}

/**
 * @brief 创建保存确认对话框（使用自定义配置）
 * @param config 对话框配置（标题和内容）
 * @date 2026-03-05
 */
void ui_manager_comp_create_confirm_save_with_config(const confirm_dialog_config_t *config)
{
    ui_comp_confirm_dialog_create_with_config(config);
}


/**
 * @brief 切换保存确认对话框焦点
 * @date 2026-02-02
 */
void ui_manager_comp_switch_confirm_save_focus()
{
    ui_comp_confirm_dialog_switch_focus();
}

/**
 * @brief 获取保存确认对话框结果
 * @return bool             true:确认，false:取消
 * @date 2026-02-02
 */
bool ui_manager_comp_get_confirm_save_result()
{
    confirm_dialog_op_t result = ui_comp_confirm_dialog_get_result();
    if (result == CONFIRM_DIALOG_OP_OK)
    {
        return true;
    }
    else if (result == CONFIRM_DIALOG_OP_CANCEL)
    {
        return false;
    }
    return false;
}

/**
 * @brief 创建IP地址设置框
 * @date 2026-02-03
 */
void ui_manager_comp_create_ip_address(uint32_t ip_address)
{
    ui_comp_ip_address_create(ip_address); //
}

/**
 * @brief 处理上方向键操作
 * @date 2026-02-03
 */
void ui_manager_comp_ip_address_handle_up()
{
    ui_comp_ip_address_handle_up();
}

/**
 * @brief 处理下方向键操作
 * @date 2026-02-03
 */
void ui_manager_comp_ip_address_handle_down()
{
    ui_comp_ip_address_handle_down();
}

/**
 * @brief 处理左方向键操作
 * @date 2026-02-03
 */
void ui_manager_comp_ip_address_handle_left()
{
    ui_comp_ip_address_handle_left();
}

/**
 * @brief 处理右方向键操作
 * @date 2026-02-03
 */
void ui_manager_comp_ip_address_handle_right()
{
    ui_comp_ip_address_handle_right();
}

/**
 * @brief 处理确定键操作
 * @date 2026-02-03
 */
void ui_manager_comp_ip_address_handle_enter()
{
    ui_comp_ip_address_handle_enter();
}

/**
 * @brief 获取IP地址设置结果
 * @return ip_address_op_t   IP_ADDRESS_OP_OK:确认，IP_ADDRESS_OP_CANCEL:取消
 * @date 2026-02-03
 */
ip_address_op_t ui_manager_comp_get_ip_address_result()
{
    return ui_comp_ip_address_get_result();
}

/**
 * @brief 获取输入的IP地址
 * @param  ip_address        存储IP地址的缓冲区
 * @date 2026-02-03
 */
uint32_t ui_manager_comp_get_ip_address_value()
{
    uint32_t ip_value = ui_comp_ip_address_get_value();
    // 将32位IP地址转换回字符串格式
    // uint8_t octet1 = (ip_value >> 24) & 0xFF;
    // uint8_t octet2 = (ip_value >> 16) & 0xFF;
    // uint8_t octet3 = (ip_value >> 8) & 0xFF;
    // uint8_t octet4 = ip_value & 0xFF;
    // sprintf(ip_address, "%d.%d.%d.%d", octet1, octet2, octet3, octet4);
    return ip_value;
}

/**
 * @brief 创建时间设置框
 * @param  datetime          初始时间值（可为NULL，使用默认值）
 * @date 2026-03-04
 */
void ui_manager_comp_create_datetime_set(datetime_value_t *datetime)
{
    ui_comp_datetime_set_create(datetime);
}

/**
 * @brief 处理上方向键操作
 * @date 2026-03-04
 */
void ui_manager_comp_datetime_set_handle_up()
{
    ui_comp_datetime_set_handle_up();
}

/**
 * @brief 处理下方向键操作
 * @date 2026-03-04
 */
void ui_manager_comp_datetime_set_handle_down()
{
    ui_comp_datetime_set_handle_down();
}

/**
 * @brief 处理左方向键操作
 * @date 2026-03-04
 */
void ui_manager_comp_datetime_set_handle_left()
{
    ui_comp_datetime_set_handle_left();
}

/**
 * @brief 处理右方向键操作
 * @date 2026-03-04
 */
void ui_manager_comp_datetime_set_handle_right()
{
    ui_comp_datetime_set_handle_right();
}

/**
 * @brief 处理确定键操作
 * @date 2026-03-04
 */
void ui_manager_comp_datetime_set_handle_enter()
{
    ui_comp_datetime_set_handle_enter();
}

/**
 * @brief 获取时间设置结果
 * @return datetime_op_t   DATETIME_OP_OK:确认，DATETIME_OP_CANCEL:取消
 * @date 2026-03-04
 */
datetime_op_t ui_manager_comp_get_datetime_set_result()
{
    return ui_comp_datetime_set_get_result();
}

/**
 * @brief 获取设置的时间值
 * @return datetime_value_t  时间值结构体
 * @date 2026-03-04
 */
datetime_value_t ui_manager_comp_get_datetime_set_value()
{
    return ui_comp_datetime_set_get_value();
}

/**
 * @brief 检查时间是否有效
 * @return bool  true:有效，false:无效
 * @date 2026-03-04
 */
bool ui_manager_comp_datetime_set_is_valid()
{
    return ui_comp_datetime_set_is_valid();
}

/**
 * @brief 创建主菜单页面
 * @param  ctx              page上下文
 * @param  config           主菜单页面配置
 * @date 2026-03-16
 */
void ui_manager_main_menu_create(PageCtx *ctx, const UIMainMenuConfig *config)
{
    ui_cont_clean();
    ui_manager_set_page_ctx(ctx);

    if (config != NULL) {
        memcpy(&s_main_menu_config, config, sizeof(UIMainMenuConfig));
    }

    ui_main_menu_create(&s_main_menu_config);
}

/**
 * @brief 刷新主菜单页面
 * @param  selected_idx     选中索引
 * @date 2026-03-16
 */
void ui_manager_main_menu_refresh(uint8_t selected_idx)
{
    ui_main_menu_refresh(selected_idx);
}

/**
 * @brief 切换到主菜单页面
 * @param selected_idx 主菜单选中索引 (0-7)
 */
void ui_manager_switch_to_main_menu(uint8_t selected_idx)
{
    PageCtx ctx = {0};
    ctx.cur_page = PAGE_MAIN_MENU;
    ctx.cursor_state.cursor_pos = CURSOR_LEFT_MENU;
    ctx.cursor_state.left_menu_idx = selected_idx;
    ctx.cursor_state.right_data_idx = 0;
    
    ui_cont_clean();
    ui_manager_set_page_ctx(&ctx);
    app_main_menu_create_page(&ctx, selected_idx);
}
