/**
 * @file ui_version_info_page.c
 * @brief 版本信息界面层实现文件
 *
 * 本模块实现版本信息页面的UI渲染，属于MVVM架构中的View层。
 *
 * == 功能说明 ==
 * - 创建版本信息显示页面的所有UI控件
 * - 响应页面刷新请求
 * - 管理页面生命周期（创建/销毁）
 *
 * == UI布局 ==
 * 页面采用垂直线性布局，从上到下依次显示：
 * - 路径导航区域（由Draw_pagepath绘制）
 * - 版本信息标签区域（6项标签，每项一行）
 *
 * 标签布局参数：
 * - 起始位置：X=15, Y=45
 * - 行间距：Y方向间隔30像素
 * - 字体：GBhzk22（22像素中文字体）
 * - 颜色：Default_HZ_color（默认黑色）
 *
 * == 控件管理 ==
 * 采用静态变量管理UI控件，好处：
 * - 生命周期明确：页面显示时存在，销毁时释放
 * - 内存可控：固定数量的标签控件，无内存泄漏风险
 * - 调用简单：无需传递控件句柄
 *
 * == 注意事项 ==
 * - 本模块不直接访问Data层数据，仅通过Service层获取配置
 * - 控件创建使用LVGL原生API，遵循LVGL编程规范
 * - 标签文本拼接在UI层完成，符合简单直接的原则
 */

#include "ui_version_info_page.h"
#include "ui_common/ui_cont.h"
#include <string.h>
#include <stdio.h>

/* ============================ 静态变量定义 ============================= */

/**
 * @brief 页面根容器句柄
 */
static lv_obj_t *s_cont = NULL;

/**
 * @brief 版本信息标签控件数组
 *
 * 存储6个版本信息标签的LVGL控件句柄。
 * 每个标签显示一项版本信息（标签名+值）。
 *
 * @note 使用固定大小数组，与VI_MAX_LABEL_COUNT对应
 *       索引顺序与VersionInfoPageConfig.items一致
 */
static lv_obj_t *s_labels[VI_MAX_LABEL_COUNT] = {NULL};

/* ============================ 接口函数实现 ============================= */

/**
 * @brief 创建版本信息页面
 *
 * 根据页面配置创建完整的版本信息显示页面。
 * 该函数是UI层的核心入口，负责：
 * 1. 获取页面根容器
 * 2. 绘制页面背景和路径导航
 * 3. 创建并配置所有标签控件
 *
 * @param[in] config 页面配置结构体指针，由Service层提供
 * @return true-创建成功，false-创建失败
 *
 * @retval true  页面创建成功，所有控件已创建并正确显示
 * @retval false 创建失败，可能原因：
 *              - config参数为NULL
 *              - 获取根容器失败（LVGL未初始化或容器已销毁）
 */
bool version_info_page_create(VersionInfoPageConfig *config)
{
    /* 参数合法性检查，防止空指针解引用 */
    if (config == NULL) {
        return false;
    }

    /* 获取根容器，作为页面所有控件的父对象 */
    s_cont = ui_get_cont();
    if (s_cont == NULL) {
        return false;
    }

    /* 绘制页面背景区域（内容区） */
    Draw_counteara();

    /* 绘制页面顶部路径导航，如"/主菜单/版本信息" */
    Draw_pagepath(NULL, config->path_text);

    /* 循环创建6个版本信息标签 */
    for (uint8_t i = 0; i < config->item_count; i++) {
        /* 创建标签控件 */
        s_labels[i] = lv_label_create(s_cont, NULL);

        /* 设置标签字体为中文字体（22像素） */
        lv_obj_set_style_local_text_font(s_labels[i], LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, &GBhzk22);

        /* 设置标签文字颜色（默认黑色） */
        lv_obj_set_style_local_text_color(s_labels[i], LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, Default_HZ_color);

        /* 拼接标签文本：标签名 + 值
         * 例如："设备名称: " + "CSP6000" = "设备名称: CSP6000"
         * 使用双倍缓冲区确保超长文本不会溢出
         */
        char buf[VI_LABEL_TEXT_MAX_LEN * 2];
        snprintf(buf, sizeof(buf), "%s%s",
                 config->items[i].label_text,
                 config->items[i].value_text);

        /* 设置标签显示文本 */
        lv_label_set_text(s_labels[i], buf);

        /* 设置标签位置
         * X坐标固定为15，保持左对齐
         * Y坐标递增，每项间隔30像素
         * 第0项Y=45, 第1项Y=75, 第2项Y=105, ...
         */
        lv_obj_set_pos(s_labels[i], VI_LABEL_START_X, VI_LABEL_START_Y + i * VI_LABEL_SPACING_Y);
    }

    return true;
}

/**
 * @brief 刷新版本信息页面
 *
 * 当版本信息数据发生变化时，刷新页面显示。
 * 当前采用"销毁-重建"策略实现刷新。
 *
 * @param[in] config 新的页面配置结构体指针
 *
 * @note 刷新策略说明：
 *       - 先调用destroy()清空现有页面
 *       - 再调用create()重新创建页面
 *       - 优点：实现简单，无需追踪变化字段
 *       - 缺点：刷新时有短暂清空过程
 *
 *       未来优化方向：
 *       - 增量刷新：仅更新变化的标签文本
 *       - 动画过渡：添加淡入淡出效果改善用户体验
 */
void version_info_page_refresh(VersionInfoPageConfig *config)
{
    /* 参数检查，config为NULL时直接返回 */
    if (config == NULL) {
        return;
    }

    /* 销毁现有页面 */
    version_info_page_destroy();

    /* 重新创建页面 */
    version_info_page_create(config);
}

/**
 * @brief 销毁版本信息页面
 *
 * 释放页面占用的所有UI资源。
 * 该函数确保页面被完全清理，不留悬挂指针。
 */
void version_info_page_destroy(void)
{
    /* 检查并清空根容器 */
    if (s_cont != NULL) {
        /* lv_obj_clean()会递归销毁所有子控件，包括s_labels[]中的标签 */
        lv_obj_clean(s_cont);
        s_cont = NULL;
    }

    /* 重置标签控件指针数组
     * 虽然lv_obj_clean已销毁控件，但保留指针数组便于调试和状态追踪
     */
    for (uint8_t i = 0; i < VI_MAX_LABEL_COUNT; i++) {
        s_labels[i] = NULL;
    }
}
