#include "service_history_report.h"
#include "data/menu/Manu_str.h"
#include "comm/format_utils.h"
#include <stdio.h>
#include <string.h>

/* ============================ 私有常量定义 ============================= */

// 每页显示记录数定义
#define RECORDS_PER_PAGE_SINGLE     1   // 单记录模式（故障、动作次数）
#define RECORDS_PER_PAGE_MULTI      2   // 多记录模式（SOE、遥控、定值）

/* ============================ 私有函数声明 ============================= */

static void format_soe_record(uint32_t index, HistoryReportPageConfig *config, uint8_t start_line);
static void format_fault_record(uint32_t index, HistoryReportPageConfig *config);
static void format_remote_record(uint32_t index, HistoryReportPageConfig *config, uint8_t start_line);
static void format_setting_record(uint32_t index, HistoryReportPageConfig *config, uint8_t start_line);
static void format_action_count(HistoryReportPageConfig *config);

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

/**
 * @brief 获取页面显示数据（统一接口）
 */
void history_report_service_get_page_data(HistoryReportType type,
                                          uint32_t page_idx,
                                          HistoryReportPageConfig *config)
{
    uint32_t total_records;
    uint32_t total_pages;
    uint32_t records_per_page;
    uint32_t record_idx1, record_idx2;

    if (config == NULL) {
        return;
    }

    // 清空配置
    memset(config, 0, sizeof(HistoryReportPageConfig));

    // 设置基础信息
    config->left_menu_count = HISTORY_REPORT_MENU_NUM;
    config->left_menu_sel_idx = (uint8_t)type;
    strcpy(config->path_text, "/主菜单/历史报告");

    // 获取记录总数
    total_records = data_history_report_get_count(type);
    config->total_records = total_records;

    // 根据类型确定每页记录数
    switch (type) {
        case HISTORY_REPORT_FAULT:
        case HISTORY_REPORT_ACTION_COUNT:
            records_per_page = RECORDS_PER_PAGE_SINGLE;
            break;
        case HISTORY_REPORT_SOE:
        case HISTORY_REPORT_REMOTE:
        case HISTORY_REPORT_SETTING:
            records_per_page = RECORDS_PER_PAGE_MULTI;
            break;
        default:
            records_per_page = RECORDS_PER_PAGE_SINGLE;
            break;
    }
    config->records_per_page = records_per_page;

    // 计算总页数
    total_pages = (total_records + records_per_page - 1) / records_per_page;
    if (total_records == 0) {
        total_pages = 0;
    }
    config->total_pages = total_pages;

    // 检查是否有记录
    if (total_records == 0) {
        config->has_records = false;
        config->current_page = 0;
        config->line_count = 1;
        strcpy(config->record_content[0], "无事件!");
        return;
    }

    config->has_records = true;

    // 确保页码在有效范围内
    if (page_idx >= total_pages) {
        page_idx = total_pages - 1;
    }
    config->current_page = page_idx + 1;  // 转换为1-based页码

    // 计算当前页的记录索引
    record_idx1 = page_idx * records_per_page;
    record_idx2 = record_idx1 + 1;

    // 根据类型格式化记录
    switch (type) {
        case HISTORY_REPORT_SOE:
            // 格式化第一条SOE记录（从第1行开始，第0行留空避免与页码重叠）
            if (record_idx1 < total_records) {
                format_soe_record(record_idx1, config, 1);
            }
            // 格式化第二条SOE记录（从第5行开始，中间空两行）
            if (record_idx2 < total_records) {
                format_soe_record(record_idx2, config, 5);
                config->line_count = 7;
            } else {
                config->line_count = 4;
            }
            break;

        case HISTORY_REPORT_FAULT:
            if (record_idx1 < total_records) {
                format_fault_record(record_idx1, config);
            }
            break;

        case HISTORY_REPORT_REMOTE:
            // 格式化第一条遥控记录（从第1行开始，第0行留空避免与页码重叠）
            if (record_idx1 < total_records) {
                format_remote_record(record_idx1, config, 1);
            }
            // 格式化第二条遥控记录（从第5行开始，中间空两行）
            if (record_idx2 < total_records) {
                format_remote_record(record_idx2, config, 5);
                config->line_count = 8;
            } else {
                config->line_count = 4;
            }
            break;

        case HISTORY_REPORT_SETTING:
            // 格式化第一条定值记录（从第0行开始）
            // 每条定值记录显示3行：序号名称、旧值新值、时间
            if (record_idx1 < total_records) {
                format_setting_record(record_idx1, config, 1);
            }
            // 格式化第二条定值记录（从第4行开始，中间空一行）
            // HR_MAX_DISPLAY_LINES = 8, 所以第二条记录占用第4、5、6行，第7行留空
            if (record_idx2 < total_records) {
                format_setting_record(record_idx2, config, 5);
                config->line_count = 8;
            } else {
                config->line_count = 4;
            }
            break;

        case HISTORY_REPORT_ACTION_COUNT:
            format_action_count(config);
            break;

        default:
            config->has_records = false;
            config->line_count = 1;
            strcpy(config->record_content[0], "无事件!");
            break;
    }
}

/**
 * @brief 获取记录总数
 */
uint32_t history_report_service_get_total_count(HistoryReportType type)
{
    return data_history_report_get_count(type);
}

/**
 * @brief 获取总页数
 */
uint32_t history_report_service_get_total_pages(HistoryReportType type)
{
    uint32_t total_records = data_history_report_get_count(type);
    uint32_t records_per_page;

    switch (type) {
        case HISTORY_REPORT_FAULT:
        case HISTORY_REPORT_ACTION_COUNT:
            records_per_page = RECORDS_PER_PAGE_SINGLE;
            break;
        case HISTORY_REPORT_SOE:
        case HISTORY_REPORT_REMOTE:
        case HISTORY_REPORT_SETTING:
            records_per_page = RECORDS_PER_PAGE_MULTI;
            break;
        default:
            records_per_page = RECORDS_PER_PAGE_SINGLE;
            break;
    }

    if (total_records == 0) {
        return 0;
    }
    return (total_records + records_per_page - 1) / records_per_page;
}

/**
 * @brief 初始化历史报告service层
 */
void history_report_service_init(void)
{
    // 初始化data层
    data_history_report_init();
}

/* ============================ 私有函数实现 ============================= */

/**
 * @brief 格式化SOE事件记录
 * @param index 记录索引
 * @param config 页面配置
 * @param start_line 起始行号（在record_content中的起始位置）
 */
static void format_soe_record(uint32_t index, HistoryReportPageConfig *config, uint8_t start_line)
{
    HistorySOERecord record;

    if (!data_history_report_get_soe_record(index, &record)) {
        return;
    }

    snprintf(config->record_content[start_line], 64, "%lu.时间:%04u-%02u-%02u %02u:%02u:%02u.%03u",
             (unsigned long)record.record_id,
             record.year, record.month, record.day,
             record.hour, record.minute, record.second,
             record.millisecond);

    snprintf(config->record_content[start_line + 1], 64, "%s %s",
             record.point_name,
             record.value == 1 ? "合" : "分");
}

/**
 * @brief 格式化故障事件记录
 */
static void format_fault_record(uint32_t index, HistoryReportPageConfig *config)
{
    HistoryFaultRecord record;
    char buf[64];

    if (!data_history_report_get_fault_record(index, &record)) {
        config->has_records = false;
        config->line_count = 1;
        strcpy(config->record_content[0], "无事件!");
        return;
    }

    config->current_page = index + 1;  // 故障记录使用记录索引作为页码
    config->total_pages = config->total_records;
    config->records_per_page = 1;
    config->line_count = 7;

    // 第0行：空（页码由UI层统一显示在页码标签中）
    config->record_content[0][0] = '\0';

    // 第1行：故障名称
    snprintf(config->record_content[1], 64, "%s", record.fault_name);

    // 第2行：地址和类型
    snprintf(config->record_content[2], 64, "地址:%u 类型:%s",
             record.fault_addr, record.fault_type);

    // 第3行：启动时间
    snprintf(config->record_content[3], 64, "启动时间:%04u-%02u-%02u %02u:%02u:%02u.%ums",
             record.year, record.month, record.day,
             record.hour, record.minute, record.second,
             record.millisecond);

    // 第4行：电流值
    format_float_to_string(3, record.ia, buf, sizeof(buf));
    snprintf(config->record_content[4], 64, "Ia:%s", buf);

    // 第5行：电压值
    format_float_to_string(2, record.uab, buf, sizeof(buf));
    snprintf(config->record_content[5], 64, "Uab:%s", buf);

    // 第6行：频率
    format_float_to_string(2, record.freq_a, buf, sizeof(buf));
    snprintf(config->record_content[6], 64, "A侧Freq:%s", buf);
}

/**
 * @brief 格式化遥控记录
 * @param index 记录索引
 * @param config 页面配置
 * @param start_line 起始行号
 */
static void format_remote_record(uint32_t index, HistoryReportPageConfig *config, uint8_t start_line)
{
    HistoryRemoteRecord record;

    if (!data_history_report_get_remote_record(index, &record)) {
        return;
    }

    snprintf(config->record_content[start_line], 64, "%lu.%s: %s闸",
             (unsigned long)record.record_id,
             record.point_name,
             record.exec_result);

    snprintf(config->record_content[start_line + 1], 64, "%s",
             record.control_type);

    snprintf(config->record_content[start_line + 2], 64, "时间：%04u-%02u-%02u %02u:%02u:%02u.%03u ms",
             record.year, record.month, record.day,
             record.hour, record.minute, record.second,
             record.millisecond);
}

/**
 * @brief 格式化定值记录
 * @param index 记录索引
 * @param config 页面配置
 * @param start_line 起始行号
 */
static void format_setting_record(uint32_t index, HistoryReportPageConfig *config, uint8_t start_line)
{
    HistorySettingRecord record;
    char full_name[64];

    if (!data_history_report_get_setting_record(index, &record)) {
        return;
    }

    // 第1行：序号. 定值名称(类别)
    if (strlen(record.setting_category) > 0) {
        snprintf(full_name, sizeof(full_name), "%s(%s)", record.setting_name, record.setting_category);
    } else {
        snprintf(full_name, sizeof(full_name), "%s", record.setting_name);
    }
    snprintf(config->record_content[start_line], 64, "%lu. %s",
             (unsigned long)record.record_id, full_name);

    // 第2行：由：旧值 改：新值（直接使用保存的字符串）
    snprintf(config->record_content[start_line + 1], 64, "由%s 改%s",
             record.old_value, record.new_value);

    // 第3行：时间：YYYY-MM-DD HH:MM:SS
    snprintf(config->record_content[start_line + 2], 64, "时间：%04u-%02u-%02u %02u:%02u:%02u.%06u",
             record.year, record.month, record.day,
             record.hour, record.minute, record.second , record.millisecond);  // 
}

/**
 * @brief 格式化动作次数统计
 */
static void format_action_count(HistoryReportPageConfig *config)
{
    HistoryActionCount count;

    if (!data_history_report_get_action_count(&count)) {
        config->has_records = false;
        config->line_count = 1;
        strcpy(config->record_content[0], "无事件!");
        return;
    }

    config->current_page = 1;
    config->total_pages = 1;
    config->records_per_page = 1;
    config->line_count = 5;

    // 第0行：空（页码由UI层统一显示在页码标签中）
    config->record_content[0][0] = '\0';

    // 第1行：开关重合次数标题
    strcpy(config->record_content[1], "开关重合次数");

    // 第2行：开关重合次数值
    snprintf(config->record_content[2], 64, "%05lu 次", (unsigned long)count.reclose_count);

    // 第3行：开关跳闸次数标题
    strcpy(config->record_content[3], "开关跳闸次数");

    // 第4行：开关跳闸次数值
    snprintf(config->record_content[4], 64, "%05lu 次", (unsigned long)count.trip_count);
}
