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

// 静态变量
static SystemMonitorStats_t g_system_stats = {0};
static uint32_t g_last_update_tick = 0;

/**
  * @brief 初始化系统监控模块
  * @param None
  * @retval None
  */
void SystemMonitor_Init(void)
{
    memset(&g_system_stats, 0, sizeof(SystemMonitorStats_t));
    g_system_stats.current_state = SYSTEM_STATE_INIT;
    g_last_update_tick = HAL_GetTick();
}

/**
  * @brief 更新系统监控状态
  * @param None
  * @retval None
  */
void SystemMonitor_Update(void)
{
    uint32_t current_tick = HAL_GetTick();
    
    // 更新运行时间
    if (current_tick >= g_last_update_tick) {
        g_system_stats.uptime_seconds = current_tick / 1000;
    }
    
    // 获取LTC2508统计信息
    LTC2508_StatsTypeDef ltc_stats;
    LTC2508_GetStats(&ltc_stats);
    g_system_stats.total_samples = ltc_stats.total_samples;
    
    // 检查ADC错误
    if (ltc_stats.error_count > 0) {
        SystemMonitor_ReportError(SYSTEM_ERROR_ADC);
    }
    
    g_last_update_tick = current_tick;
}

/**
  * @brief 获取当前系统状态
  * @param None
  * @retval SystemState_t
  */
SystemState_t SystemMonitor_GetState(void)
{
    return g_system_stats.current_state;
}

/**
  * @brief 设置系统状态
  * @param new_state: 新的系统状态
  * @retval None
  */
void SystemMonitor_SetState(SystemState_t new_state)
{
    g_system_stats.current_state = new_state;
}

/**
  * @brief 报告系统错误
  * @param error: 错误类型
  * @retval None
  */
void SystemMonitor_ReportError(SystemError_t error)
{
    g_system_stats.last_error = error;
    g_system_stats.error_count++;
    
    // 根据错误类型设置系统状态
    if (error == SYSTEM_ERROR_CRITICAL) {
        g_system_stats.current_state = SYSTEM_STATE_ERROR;
    }
}

/**
  * @brief 获取系统统计信息
  * @param stats: 统计信息结构体指针
  * @retval None
  */
void SystemMonitor_GetStats(SystemMonitorStats_t *stats)
{
    if (stats != NULL) {
        memcpy(stats, &g_system_stats, sizeof(SystemMonitorStats_t));
    }
}

/**
  * @brief 检查系统健康状态
  * @param None
  * @retval uint8_t: 1-健康, 0-异常
  */
uint8_t SystemMonitor_IsHealthy(void)
{
    // 检查系统状态
    if (g_system_stats.current_state == SYSTEM_STATE_ERROR) {
        return 0;
    }
    
    // 检查错误计数
    if (g_system_stats.error_count > 10) {
        return 0;
    }
    
    return 1; // 系统健康
}