/**
 * @file data_version_info.c
 * @brief 版本信息数据层实现文件
 *
 * 本模块实现版本信息的底层数据管理，属于MVVM架构中的Data层（Model）。
 *
 * == 功能说明 ==
 * - 存储设备版本信息数据
 * - 提供数据访问接口供上层调用
 * - 从底层接口动态读取版本信息数据
 *
 * == 重要提示 ==
 * - 本模块不直接处理UI逻辑，仅负责数据存储和访问
 * - 数据为只读访问，线程安全
 * - 静态数据存储，避免栈空间问题
 */

#include "data_version_info.h"
#include "head.h"
#include <string.h>

/* ============================ 静态数据存储 ============================= */

/**
 * @brief 版本信息静态数据
 */
static VersionInfoData s_version_data;

/* ============================ 内部辅助函数 ============================= */

/**
 * @brief 从固定定值表读取版本信息
 */
static void read_version_info_from_fixedset(void)
{
    char buf[64];

    // 读取设备名称 (FIXED_SET_MAN)
    if (set_get_fixed_arg(FIXED_SET_MAN, buf, sizeof(buf)) == 0) {
        strncpy(s_version_data.device_name, buf, VERSION_INFO_DEVICE_NAME_MAX_LEN - 1);
        s_version_data.device_name[VERSION_INFO_DEVICE_NAME_MAX_LEN - 1] = '\0';
    } else {
        strncpy(s_version_data.device_name, "智能分布式终端", VERSION_INFO_DEVICE_NAME_MAX_LEN - 1);
        s_version_data.device_name[VERSION_INFO_DEVICE_NAME_MAX_LEN - 1] = '\0';
    }

    // 读取设备型号 (FIXED_SET_TPE)
    if (set_get_fixed_arg(FIXED_SET_TPE, buf, sizeof(buf)) == 0) {
        strncpy(s_version_data.model, buf, VERSION_INFO_MODEL_MAX_LEN - 1);
        s_version_data.model[VERSION_INFO_MODEL_MAX_LEN - 1] = '\0';
    } else {
        strncpy(s_version_data.model, "CSP6000", VERSION_INFO_MODEL_MAX_LEN - 1);
        s_version_data.model[VERSION_INFO_MODEL_MAX_LEN - 1] = '\0';
    }

    // 读取硬件版本 (FIXED_SET_HVR)
    if (set_get_fixed_arg(FIXED_SET_CRC, buf, sizeof(buf)) == 0) {
        strncpy(s_version_data.crc_info, buf, VERSION_INFO_HW_VERSION_MAX_LEN - 1);
        s_version_data.crc_info[VERSION_INFO_HW_VERSION_MAX_LEN - 1] = '\0';
    } else {
        strncpy(s_version_data.crc_info, "AE86", VERSION_INFO_HW_VERSION_MAX_LEN - 1);
        s_version_data.crc_info[VERSION_INFO_HW_VERSION_MAX_LEN - 1] = '\0';
    }

    // 读取软件版本 (FIXED_SET_SVR)
    if (set_get_fixed_arg(FIXED_SET_SVR, buf, sizeof(buf)) == 0) {
        strncpy(s_version_data.software_version, buf, VERSION_INFO_SW_VERSION_MAX_LEN - 1);
        s_version_data.software_version[VERSION_INFO_SW_VERSION_MAX_LEN - 1] = '\0';
    } else {
        strncpy(s_version_data.software_version, "SV01.002", VERSION_INFO_SW_VERSION_MAX_LEN - 1);
        s_version_data.software_version[VERSION_INFO_SW_VERSION_MAX_LEN - 1] = '\0';
    }

    // 读取硬件版本（FIXED_SET_HVR）
    if (set_get_fixed_arg(FIXED_SET_HVR, buf, sizeof(buf)) == 0) {
        strncpy(s_version_data.hardware_version, buf, VERSION_INFO_BOOT_VERSION_MAX_LEN - 1);
        s_version_data.hardware_version[VERSION_INFO_BOOT_VERSION_MAX_LEN - 1] = '\0';
    } else {
        strncpy(s_version_data.hardware_version, "HV01.00", VERSION_INFO_BOOT_VERSION_MAX_LEN - 1);
        s_version_data.hardware_version[VERSION_INFO_BOOT_VERSION_MAX_LEN - 1] = '\0';
    }

    // 读取制造商 (FIXED_SET_MAU)
    if (set_get_fixed_arg(FIXED_SET_MAU, buf, sizeof(buf)) == 0) {
        strncpy(s_version_data.vendor, buf, VERSION_INFO_VENDOR_MAX_LEN - 1);
        s_version_data.vendor[VERSION_INFO_VENDOR_MAX_LEN - 1] = '\0';
    } else {
        strncpy(s_version_data.vendor, "珠海欧力配网自动化股份有限公司", VERSION_INFO_VENDOR_MAX_LEN - 1);
        s_version_data.vendor[VERSION_INFO_VENDOR_MAX_LEN - 1] = '\0';
    }
}

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

/**
 * @brief 获取版本信息数据
 */
bool data_version_info_get(VersionInfoData *data)
{
    /* 参数合法性检查，防止空指针解引用导致崩溃 */
    if (data == NULL) {
        return false;
    }

    /* 从底层接口读取最新版本信息 */
    read_version_info_from_fixedset();

    /* 将静态数据复制到输出缓冲区 */
    /* 使用memcpy确保完整结构体复制，包括所有字符串字段 */
    memcpy(data, &s_version_data, sizeof(VersionInfoData));

    return true;
}

/**
 * @brief 初始化版本信息数据层
 */
void data_version_info_init(void)
{
    /* 初始化时读取一次版本信息 */
    memset(&s_version_data, 0, sizeof(VersionInfoData));
    read_version_info_from_fixedset();
}
