/*
 * error_handler.c
 *
 *  Created on: 2026-03-04
 *      Author: RT-Thread
 *
 *  功能: 错误处理与恢复模块实现
 *  依赖: RT-Thread Nano, osal, transaction, state_manager
 *  跨平台适配: 基于RT-Thread Nano，使用标准API
 */

#include <rtthread.h>
#include "osal.h"
#include "transaction.h"
#include "state_manager.h"
#include "error_handler.h"
#include "sht40.h"
#include "lwip/netif.h"
#include "lwip/dhcp.h"
#include "drv_eth.h"

/**
 * @brief 处理网络错误
 * @param error 错误代码
 * @param user_data 用户数据
 * @return 0 成功，非0 失败
 */
static int handle_network_error(error_code_t error, void *user_data)
{
    osal_log_e("Network error: %d", error);
    
    /* 设置网络状态为错误 */
    state_manager_set_network_state(NETWORK_STATE_ERROR);
    
    /* 尝试恢复网络连接 */
    osal_log_i("Attempting to recover network connection...");
    
    /* 具体的网络恢复逻辑 */
    if (user_data != NULL)
    {
        struct netif *netif = (struct netif *)user_data;
        
        /* 检查网络连接状态 */
        ethernet_link_check_state(netif);
        
        /* 如果网络连接已断开，尝试重新启动DHCP */
        if (!netif_is_link_up(netif))
        {
            osal_log_i("Network link down, waiting for link up...");
            int wait_count = 0;
            while (!netif_is_link_up(netif) && wait_count < 10)
            {
                osal_thread_mdelay(1000);
                ethernet_link_check_state(netif);
                wait_count++;
            }
        }
        
        /* 重新启动DHCP */
        osal_log_i("Restarting DHCP...");
        dhcp_stop(netif);
        osal_thread_mdelay(100);
        dhcp_start(netif);
    }
    
    return 0;
}

/**
 * @brief 处理传感器错误
 * @param error 错误代码
 * @param user_data 用户数据
 * @return 0 成功，非0 失败
 */
static int handle_sensor_error(error_code_t error, void *user_data)
{
    osal_log_e("Sensor error: %d", error);
    
    /* 设置传感器状态为错误 */
    state_manager_set_sensor_state(SENSOR_STATE_ERROR);
    
    /* 尝试恢复传感器 */
    osal_log_i("Attempting to recover sensor...");
    
    /* 具体的传感器恢复逻辑 */
    int retry_count = 0;
    while (retry_count < 3)
    {
        osal_log_i("Attempt %d: Reinitializing SHT40 sensor...", retry_count + 1);
        if (sht40_init() == 0)
        {
            osal_log_i("SHT40 sensor recovered successfully");
            state_manager_set_sensor_state(SENSOR_STATE_READY);
            return 0;
        }
        osal_thread_mdelay(1000);
        retry_count++;
    }
    
    osal_log_e("Failed to recover SHT40 sensor after %d attempts", retry_count);
    return -1;
}

/**
 * @brief 处理TCP错误
 * @param error 错误代码
 * @param user_data 用户数据
 * @return 0 成功，非0 失败
 */
static int handle_tcp_error(error_code_t error, void *user_data)
{
    osal_log_e("TCP error: %d", error);
    
    /* 设置TCP状态为错误 */
    state_manager_set_tcp_state(TCP_STATE_ERROR);
    
    /* 尝试恢复TCP连接 */
    osal_log_i("Attempting to recover TCP connection...");
    
    /* 具体的TCP恢复逻辑 */
    /* 这里可以添加重新建立TCP连接的代码 */
    
    return 0;
}

/**
 * @brief 处理未知错误
 * @param error 错误代码
 * @param user_data 用户数据
 * @return 0 成功，非0 失败
 */
static int handle_unknown_error(error_code_t error, void *user_data)
{
    osal_log_e("Unknown error: %d", error);
    
    return 0;
}

/**
 * @brief 初始化错误处理器
 * @return 0 成功，非0 失败
 */
int error_handler_init(void)
{
    osal_log_i("Error handler initialized");
    return 0;
}

/**
 * @brief 处理错误
 * @param error 错误代码
 * @param user_data 用户数据
 * @return 0 成功，非0 失败
 */
int error_handler_process(error_code_t error, void *user_data)
{
    switch (error)
    {
        case ERROR_NETWORK:
            return handle_network_error(error, user_data);
        case ERROR_SENSOR:
            return handle_sensor_error(error, user_data);
        case ERROR_TCP:
            return handle_tcp_error(error, user_data);
        case ERROR_UNKNOWN:
        default:
            return handle_unknown_error(error, user_data);
    }
}

/**
 * @brief 记录错误日志
 * @param error 错误代码
 * @param message 错误信息
 * @return 0 成功，非0 失败
 */
int error_handler_log(error_code_t error, const char *message)
{
    switch (error)
    {
        case ERROR_NETWORK:
            osal_log_e("[NETWORK ERROR] %s", message);
            break;
        case ERROR_SENSOR:
            osal_log_e("[SENSOR ERROR] %s", message);
            break;
        case ERROR_TCP:
            osal_log_e("[TCP ERROR] %s", message);
            break;
        case ERROR_UNKNOWN:
        default:
            osal_log_e("[UNKNOWN ERROR] %s", message);
            break;
    }
    
    return 0;
}

/**
 * @brief 触发错误报警
 * @param error 错误代码
 * @param message 错误信息
 * @return 0 成功，非0 失败
 */
int error_handler_alert(error_code_t error, const char *message)
{
    /* 这里可以添加具体的报警逻辑，比如发送通知、触发LED闪烁等 */
    osal_log_e("[ALERT] %s", message);
    
    return 0;
}
