/**
 * @file service_version_info.c
 * @brief 版本信息服务层实现文件
 *
 * 本模块实现版本信息的业务逻辑处理，属于MVVM架构中的Service层（ViewModel）。
 *
 * == 功能说明 ==
 * - 从Data层获取原始版本信息数据
 * - 格式化数据，拼接标签和值
 * - 组装页面配置结构体供UI层渲染
 *
 * == 业务逻辑 ==
 * 1. 调用Data层接口获取原始数据
 * 2. 将原始数据与静态定义的标签名称进行拼接
 * 3. 组装完整页面配置并返回
 *
 * == 设计优点 ==
 * - UI层无需关心数据来源和格式化细节
 * - 数据格式统一管理，便于维护和修改
 * - 便于后续扩展（如支持多语言、动态数据等）
 */

#include "service_version_info.h"
#include <string.h>

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

/**
 * @brief 版本信息标签名称数组
 *
 * 定义版本信息页面中每项显示的标签名称。
 * 共有6项信息，与VersionInfoData结构体字段一一对应。
 *
 * @note 标签名称后带冒号，便于与值区分显示
 *       如"设备名称: " + "CSP6000" = "设备名称: CSP6000"
 */
static const char *s_label_names[VI_MAX_LABEL_COUNT] = {
    "设备名称:  ",   /**< 第0项：设备名称 */
    "设备型号:  ",   /**< 第1项：设备型号 */
    "校验码:     ",   /**< 第2项：校验码 */
    "软件版本:  ",   /**< 第3项：软件版本 */
    "硬件版本:  ",   /**< 第4项：硬件版本 */
    "终端厂家:  "      /**< 第5项：制造商 */
};

/* ============================ 模块内部状态 ============================= */

/**
 * @brief Service层初始化标志
 *
 * 标记Service层是否已完成初始化。
 * 确保在正确初始化后才对外提供服务，避免未初始化状态访问。
 *
 * @note 双重检查模式：初始化函数检查标志，接口函数也检查标志
 */
static bool s_initialized = false;

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

/**
 * @brief 初始化版本信息服务层
 *
 * 在系统启动时调用，用于初始化Service层内部状态。
 * 当前实现主要设置初始化标志，表示模块已就绪。
 *
 */
void version_info_service_init(void)
{
    s_initialized = true;
}

/**
 * @brief 获取版本信息页面配置
 *
 * Service层的核心接口函数，实现业务流程：
 * 1. 参数合法性检查
 * 2. 从Data层获取原始版本信息
 * 3. 组装页面配置结构体
 *
 * @param[out] config 输出参数，用于存储页面配置的结构体指针
 * @return true-成功，false-失败
 *
 * @retval true  成功获取页面配置
 * @retval false 失败，可能原因：
 *               - config参数为NULL
 *               - Data层获取数据失败
 *
 * 数据流向：
 * @code
 * Service层调用Data层获取原始数据
 *     ↓
 * 原始数据 + 标签名称 → 格式化处理
 *     ↓
 * 组装VersionInfoPageConfig
 *     ↓
 * 返回给UI层
 * @endcode
 */
bool version_info_service_get_page_config(VersionInfoPageConfig *config)
{
    /* 参数合法性检查，防止空指针解引用 */
    if (config == NULL) {
        return false;
    }

    /* 从Data层获取原始版本信息 */
    VersionInfoData data;
    if (!data_version_info_get(&data)) {
        /* Data层获取失败，记录日志或进行错误处理 */
        return false;
    }

    /* 清空配置结构体，确保无残留数据 */
    /* 使用memset将整个结构体初始化为0，避免字段遗漏 */
    memset(config, 0, sizeof(VersionInfoPageConfig));

    /* 设置页面路径文本，用于显示当前位置 */
    strcpy(config->path_text, "/主菜单/版本信息");

    /* 组装第0项：设备名称 */
    strcpy(config->items[0].label_text, s_label_names[0]);
    strcpy(config->items[0].value_text, data.device_name);

    /* 组装第1项：设备型号 */
    strcpy(config->items[1].label_text, s_label_names[1]);
    strcpy(config->items[1].value_text, data.model);

    /* 组装第2项：CRC信息 */
    strcpy(config->items[2].label_text, s_label_names[2]);
    strcpy(config->items[2].value_text, data.crc_info);

    /* 组装第3项：软件版本 */
    strcpy(config->items[3].label_text, s_label_names[3]);
    strcpy(config->items[3].value_text, data.software_version);

    /* 组装第4项：硬件版本 */
    strcpy(config->items[4].label_text, s_label_names[4]);
    strcpy(config->items[4].value_text, data.hardware_version);

    /* 组装第5项：制造商 */
    strcpy(config->items[5].label_text, s_label_names[5]);
    strcpy(config->items[5].value_text, data.vendor);

    /* 设置实际标签数量，通知UI层有多少项需要显示 */
    config->item_count = VI_MAX_LABEL_COUNT;

    return true;
}
