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

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

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

/**
  * @brief 增加采样样点计数
  * @param None
  * @retval None
  */
void SystemMonitor_IncrementSampleCount(void)
{
    g_system_stats.total_samples++;
}

/**
  * @brief 报告数据处理溢出（数据来不及处理）
  * @param None
  * @retval None
  */
void SystemMonitor_ReportDataOverflow(void)
{
    g_system_stats.data_overflow_count++;
}

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

/**
  * @brief 报告SD卡写入操作
  * @param bytes_written: 写入的字节数
  * @retval None
  */
void SystemMonitor_ReportSDWrite(uint32_t bytes_written)
{
    g_system_stats.sd_write_count++;
    g_system_stats.sd_total_bytes_written += bytes_written;
}

/**
  * @brief 报告SD卡写入错误
  * @param None
  * @retval None
  */
void SystemMonitor_ReportSDWriteError(void)
{
    g_system_stats.sd_write_error_count++;
}

/**
  * @brief 报告SD卡缓冲区满
  * @param None
  * @retval None
  */
void SystemMonitor_ReportSDBufferFull(void)
{
    g_system_stats.sd_buffer_full_count++;
}

/**
  * @brief 报告SD卡文件创建
  * @param None
  * @retval None
  */
void SystemMonitor_ReportSDFileCreated(void)
{
    g_system_stats.sd_file_count++;
}

/**
  * @brief 报告数据丢弃（缓冲区满时未存储）
  * @param None
  * @retval None
  */
void SystemMonitor_ReportDataDropped(void)
{
    g_system_stats.sd_data_dropped_count++;
}

/**
  * @brief 报告串口发送操作
  * @param bytes_sent: 发送的字节数
  * @retval None
  */
void SystemMonitor_ReportUARTTx(uint32_t bytes_sent)
{
    g_system_stats.uart_tx_count++;
    g_system_stats.uart_tx_bytes += bytes_sent;
}

/**
  * @brief 报告串口发送错误
  * @param None
  * @retval None
  */
void SystemMonitor_ReportUARTTxError(void)
{
    g_system_stats.uart_tx_error_count++;
}

/**
  * @brief 保存监控状态到文件
  * @param None
  * @retval HAL_StatusTypeDef
  */
HAL_StatusTypeDef SystemMonitor_SaveStatus(void)
{
    FIL file;
    FRESULT res;
    UINT bytes_written;
    char buffer[512];
    
    // 创建或覆盖MONITOR.TXT文件
    res = f_open(&file, MONITOR_STATUS_FILE, FA_CREATE_ALWAYS | FA_WRITE);
    if (res != FR_OK) {
        return HAL_ERROR;
    }
    
    // 格式化监控数据为文本（精简格式，减少阻塞时间）
    int len = snprintf(buffer, sizeof(buffer),
        "Samples:%lu Ovf:%lu\r\n"
        "SD:Wr=%lu Err=%lu Full=%lu Bytes=%lu Files=%lu Drop=%lu\r\n"
        "UART:Tx=%lu Bytes=%lu Err=%lu\r\n",
        g_system_stats.total_samples,
        g_system_stats.data_overflow_count,
        g_system_stats.sd_write_count,
        g_system_stats.sd_write_error_count,
        g_system_stats.sd_buffer_full_count,
        g_system_stats.sd_total_bytes_written,
        g_system_stats.sd_file_count,
        g_system_stats.sd_data_dropped_count,
        g_system_stats.uart_tx_count,
        g_system_stats.uart_tx_bytes,
        g_system_stats.uart_tx_error_count
    );
    
    // 写入监控数据
    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 HAL_StatusTypeDef
  * @note 当前实现仅用于记录，不恢复状态（避免累积错误）
  */
HAL_StatusTypeDef SystemMonitor_LoadStatus(void)
{
    // 当前实现：不从文件恢复状态
    // 每次上电重新开始统计，避免累积错误
    // MONITOR.TXT仅用于记录上次运行的状态
    return HAL_OK;
}
