#include "config_manager.h"
#include "fatfs.h"
#include "ff.h"
#include <string.h>
#include <stdio.h>

// 全局配置变量
static SystemConfig_t g_system_config = {0};
static uint8_t g_config_initialized = 0;

// 计算校验和
static uint32_t Calculate_Checksum(const SystemConfig_t *config)
{
    uint32_t checksum = 0;
    checksum += config->uart_output_enabled;
    checksum += config->storage_enabled;
    checksum += config->session_number;
    checksum += config->config_version;
    return checksum;
}

/**
  * @brief 初始化配置管理器
  * @param None
  * @retval None
  */
void Config_Init(void)
{
    if (!g_config_initialized) {
        Config_SetDefaults();
        g_config_initialized = 1;
    }
}

/**
  * @brief 设置默认配置
  * @param None
  * @retval None
  */
void Config_SetDefaults(void)
{
    g_system_config.uart_output_enabled = DEFAULT_UART_OUTPUT_ENABLED;
    g_system_config.storage_enabled = DEFAULT_STORAGE_ENABLED;
    g_system_config.session_number = 0;  // 初始会话序号为0
    g_system_config.config_version = CONFIG_VERSION;
    g_system_config.checksum = Calculate_Checksum(&g_system_config);
}

/**
  * @brief 从SD卡加载配置
  * @param None
  * @retval HAL_OK: 成功, HAL_ERROR: 失败（将使用默认配置）
  */
HAL_StatusTypeDef Config_Load(void)
{
    FIL file;
    FRESULT res;
    UINT bytes_read;
    char buffer[128];
    
    // 尝试打开配置文件
    res = f_open(&file, CONFIG_FILE_PATH, FA_READ);
    if (res != FR_OK) {
        // 文件不存在，使用默认配置并保存
        Config_SetDefaults();
        Config_Save();
        return HAL_ERROR;
    }
    
    // 读取配置文件
    res = f_read(&file, buffer, sizeof(buffer), &bytes_read);
    f_close(&file);
    
    if (res != FR_OK || bytes_read == 0) {
        Config_SetDefaults();
        return HAL_ERROR;
    }
    
    // 解析配置（简单的文本格式）
    SystemConfig_t temp_config;
    int uart_enabled, storage_enabled;
    unsigned int version, session_num;
    
    int parsed = sscanf(buffer,
                       "UART=%d\nSTORAGE=%d\nSESSION=%u\nVERSION=%u\n",
                       &uart_enabled,
                       &storage_enabled,
                       &session_num,
                       &version);
    
    if (parsed == 4 && version == CONFIG_VERSION) {
        temp_config.uart_output_enabled = (uint8_t)uart_enabled;
        temp_config.storage_enabled = (uint8_t)storage_enabled;
        temp_config.session_number = session_num;
        temp_config.config_version = version;
        temp_config.checksum = Calculate_Checksum(&temp_config);
        
        // 验证配置值的合法性
        if (temp_config.uart_output_enabled <= 1 &&
            temp_config.storage_enabled <= 1) {
            memcpy(&g_system_config, &temp_config, sizeof(SystemConfig_t));
            return HAL_OK;
        }
    }
    
    // 解析失败，使用默认配置
    Config_SetDefaults();
    return HAL_ERROR;
}

/**
  * @brief 保存配置到SD卡
  * @param None
  * @retval HAL_OK: 成功, HAL_ERROR: 失败
  */
HAL_StatusTypeDef Config_Save(void)
{
    FIL file;
    FRESULT res;
    UINT bytes_written;
    char buffer[128];
    
    // 更新校验和
    g_system_config.checksum = Calculate_Checksum(&g_system_config);
    
    // 创建或覆盖配置文件
    res = f_open(&file, CONFIG_FILE_PATH, FA_CREATE_ALWAYS | FA_WRITE);
    if (res != FR_OK) {
        return HAL_ERROR;
    }
    
    // 格式化配置数据为文本（精简格式）
    int len = snprintf(buffer, sizeof(buffer),
                      "UART=%d\nSTORAGE=%d\nSESSION=%lu\nVERSION=%lu\n",
                      g_system_config.uart_output_enabled,
                      g_system_config.storage_enabled,
                      g_system_config.session_number,
                      g_system_config.config_version);
    
    // 写入配置数据
    res = f_write(&file, buffer, len, &bytes_written);
    if (res != FR_OK || bytes_written != (UINT)len) {
        f_close(&file);
        return HAL_ERROR;
    }
    
    // 关闭文件
    f_close(&file);
    
    return HAL_OK;
}

/**
  * @brief 获取串口输出使能状态
  * @param None
  * @retval 1: 启用, 0: 禁用
  */
uint8_t Config_IsUartOutputEnabled(void)
{
    return g_system_config.uart_output_enabled;
}

/**
  * @brief 获取存储使能状态
  * @param None
  * @retval 1: 启用, 0: 禁用
  */
uint8_t Config_IsStorageEnabled(void)
{
    return g_system_config.storage_enabled;
}

/**
  * @brief 设置串口输出使能
  * @param enabled: 1=启用, 0=禁用
  * @retval None
  */
void Config_SetUartOutput(uint8_t enabled)
{
    g_system_config.uart_output_enabled = (enabled != 0) ? 1 : 0;
}

/**
  * @brief 设置存储使能
  * @param enabled: 1=启用, 0=禁用
  * @retval None
  */
void Config_SetStorage(uint8_t enabled)
{
    g_system_config.storage_enabled = (enabled != 0) ? 1 : 0;
}

/**
  * @brief 获取完整配置
  * @param config: 配置结构体指针
  * @retval None
  */
void Config_GetConfig(SystemConfig_t *config)
{
    if (config != NULL) {
        memcpy(config, &g_system_config, sizeof(SystemConfig_t));
    }
}

/**
  * @brief 获取会话序号
  * @param None
  * @retval 当前会话序号
  */
uint32_t Config_GetSessionNumber(void)
{
    return g_system_config.session_number;
}

/**
  * @brief 设置会话序号
  * @param session_number: 会话序号
  * @retval None
  */
void Config_SetSessionNumber(uint32_t session_number)
{
    g_system_config.session_number = session_number;
}

/**
  * @brief 递增会话序号并返回新值
  * @param None
  * @retval 递增后的会话序号
  */
uint32_t Config_IncrementSessionNumber(void)
{
    g_system_config.session_number++;
    return g_system_config.session_number;
}
