#include "service_home_page.h"
#include "data/data_home_page.h"
#include "comm.h"
#include "format_utils.h"
#include "ui_config.h"
#include <time.h>
#include <string.h>
#include <stdio.h>
#include "data_manager.h"

/* ====================================================================================================================
 * 文件名称: service_home_page.c
 * 文件职责: 首页服务层实现 - 业务逻辑中心，数据格式化，为UI提供可直接渲染的配置
 * 架构位置: Service层 (ViewModel)
 * ==================================================================================================================== */

/* 相位颜色定义 - 使用项目中已定义的颜色宏 */
#define PHASE_A_COLOR   Default_PA_color  /* A相 - 红色 */
#define PHASE_B_COLOR   Default_PB_color  /* B相 - 绿色 */
#define PHASE_C_COLOR   Default_PC_color  /* C相 - 黄色 */
#define DEFAULT_COLOR   Default_HZ_color  /* 默认 - 黑色 */

/* 当前显示组 */
static HomePageGroupType s_current_group = HP_GROUP_MCB;

/**
 * @brief  格式化浮点数为字符串
 * @param  decimal_places  小数位数
 * @param  value           浮点数值
 * @param  buf             输出缓冲区
 * @param  buf_size        缓冲区大小
 */
static void hp_format_value(uint8_t decimal_places, float value, char *buf, size_t buf_size)
{
    format_float_to_string(decimal_places, value, buf, buf_size);
}

/**
 * @brief  获取相位颜色
 * @param  phase  相位索引 0=A相, 1=B相, 2=C相
 * @return 颜色值
 */
static lv_color_t hp_get_phase_color(uint8_t phase)
{
    switch (phase)
    {
    case 0: /* A相 */
        return PHASE_A_COLOR;
    case 1: /* B相 */
        return PHASE_B_COLOR;
    case 2: /* C相 */
        return PHASE_C_COLOR;
    default:
        return DEFAULT_COLOR;
    }
}

/**
 * @brief  获取日期时间字符串
 * @param  buf       输出缓冲区
 * @param  buf_size  缓冲区大小
 */
static void hp_get_datetime(char *buf, size_t buf_size)
{
    struct tm *p = NULL;
    time_t timep;
    time(&timep);
    p = localtime(&timep);
    
    snprintf(buf, buf_size, "%d-%02d-%02d %02d:%02d:%02d",
             p->tm_year + 1900, p->tm_mon + 1, p->tm_mday,
             p->tm_hour, p->tm_min, p->tm_sec);
}

/**
 * @brief  配置母线侧电压组
 * @param  config  页面配置
 * @param  raw     原始数据
 */
static void hp_config_mcb_group(HomePageViewConfig *config, const HomePageRawData *raw)
{
    strcpy(config->group_title, "母线侧:");
    config->item_count = 4;
    
    /* A相 */
    strcpy(config->items[0].label, "Uab:");
    hp_format_value(2, raw->telemet[HP_TELEMET_UA].value, config->items[0].value, sizeof(config->items[0].value));
    strcpy(config->items[0].unit, "V");
    config->items[0].color = hp_get_phase_color(0);
    config->items[0].visible = 1;
    
    /* B相 */
    strcpy(config->items[1].label, "Ubc:");
    hp_format_value(2, raw->telemet[HP_TELEMET_UB].value, config->items[1].value, sizeof(config->items[1].value));
    strcpy(config->items[1].unit, "V");
    config->items[1].color = hp_get_phase_color(1);
    config->items[1].visible = 1;
    
    /* C相 */
    strcpy(config->items[2].label, "Uca:");
    hp_format_value(2, raw->telemet[HP_TELEMET_UC].value, config->items[2].value, sizeof(config->items[2].value));
    strcpy(config->items[2].unit, "V");
    config->items[2].color = hp_get_phase_color(2);
    config->items[2].visible = 1;
    
    /* 零序电压U0 - 使用母线侧零序 */
    strcpy(config->items[3].label, "U0:");
    /* U0需要从其他数据源获取，暂时使用UA代替 */
    hp_format_value(2, raw->telemet[HP_TELEMET_UA].value * 0.1f, config->items[3].value, sizeof(config->items[3].value));
    strcpy(config->items[3].unit, "V");
    config->items[3].color = DEFAULT_COLOR;
    config->items[3].visible = 1;
}

/**
 * @brief  配置线路侧电压组
 * @param  config  页面配置
 * @param  raw     原始数据
 */
static void hp_config_lcb_group(HomePageViewConfig *config, const HomePageRawData *raw)
{
    strcpy(config->group_title, "线路侧:");
    config->item_count = 4;
    
    /* A相 - 使用线路侧数据 */
    strcpy(config->items[0].label, "Uab:");
    hp_format_value(2, raw->telemet[HP_TELEMET_UA2].value, config->items[0].value, sizeof(config->items[0].value));
    strcpy(config->items[0].unit, "V");
    config->items[0].color = hp_get_phase_color(0);
    config->items[0].visible = 1;
    
    /* B相 - 使用线路侧数据 */
    strcpy(config->items[1].label, "Ubc:");
    hp_format_value(2, raw->telemet[HP_TELEMET_UB2].value, config->items[1].value, sizeof(config->items[1].value));
    strcpy(config->items[1].unit, "V");
    config->items[1].color = hp_get_phase_color(1);
    config->items[1].visible = 1;
    
    /* C相 - 使用线路侧数据 */
    strcpy(config->items[2].label, "Uca:");
    hp_format_value(2, raw->telemet[HP_TELEMET_UC2].value, config->items[2].value, sizeof(config->items[2].value));
    strcpy(config->items[2].unit, "V");
    config->items[2].color = hp_get_phase_color(2);
    config->items[2].visible = 1;
    
    /* 零序电压U0 - 使用线路侧数据 */
    strcpy(config->items[3].label, "U0:");
    hp_format_value(2, raw->telemet[HP_TELEMET_UA2].value * 0.1f, config->items[3].value, sizeof(config->items[3].value));
    strcpy(config->items[3].unit, "V");
    config->items[3].color = DEFAULT_COLOR;
    config->items[3].visible = 1;
}

/**
 * @brief  配置负荷电流组
 * @param  config  页面配置
 * @param  raw     原始数据
 */
static void hp_config_load_i_group(HomePageViewConfig *config, const HomePageRawData *raw)
{
    strcpy(config->group_title, "保护电流:");
    config->item_count = 4;
    
    /* Ia */
    strcpy(config->items[0].label, "Ia:");
    hp_format_value(3, raw->telemet[HP_TELEMET_IA].value, config->items[0].value, sizeof(config->items[0].value));
    strcpy(config->items[0].unit, "A");
    config->items[0].color = hp_get_phase_color(0);
    config->items[0].visible = 1;
    
    /* Ib */
    strcpy(config->items[1].label, "Ib:");
    hp_format_value(3, raw->telemet[HP_TELEMET_IB].value, config->items[1].value, sizeof(config->items[1].value));
    strcpy(config->items[1].unit, "A");
    config->items[1].color = hp_get_phase_color(1);
    config->items[1].visible = 1;
    
    /* Ic */
    strcpy(config->items[2].label, "Ic:");
    hp_format_value(3, raw->telemet[HP_TELEMET_IC].value, config->items[2].value, sizeof(config->items[2].value));
    strcpy(config->items[2].unit, "A");
    config->items[2].color = hp_get_phase_color(2);
    config->items[2].visible = 1;
    
    /* I0 */
    strcpy(config->items[3].label, "I0:");
    hp_format_value(3, raw->telemet[HP_TELEMET_I0].value, config->items[3].value, sizeof(config->items[3].value));
    strcpy(config->items[3].unit, "A");
    config->items[3].color = DEFAULT_COLOR;
    config->items[3].visible = 1;
}

/**
 * @brief  配置零序电流组（测量电流）
 * @param  config  页面配置
 * @param  raw     原始数据
 */
static void hp_config_zero_i_group(HomePageViewConfig *config, const HomePageRawData *raw)
{
    strcpy(config->group_title, "测量电流:");
    config->item_count = 3;  /* 测量电流没有I0 */
    
    /* Ia */
    strcpy(config->items[0].label, "Ia:");
    hp_format_value(2, raw->telemet[HP_TELEMET_IA].value, config->items[0].value, sizeof(config->items[0].value));
    strcpy(config->items[0].unit, "A");
    config->items[0].color = hp_get_phase_color(0);
    config->items[0].visible = 1;
    
    /* Ib */
    strcpy(config->items[1].label, "Ib:");
    hp_format_value(2, raw->telemet[HP_TELEMET_IB].value, config->items[1].value, sizeof(config->items[1].value));
    strcpy(config->items[1].unit, "A");
    config->items[1].color = hp_get_phase_color(1);
    config->items[1].visible = 1;
    
    /* Ic */
    strcpy(config->items[2].label, "Ic:");
    hp_format_value(2, raw->telemet[HP_TELEMET_IC].value, config->items[2].value, sizeof(config->items[2].value));
    strcpy(config->items[2].unit, "A");
    config->items[2].color = hp_get_phase_color(2);
    config->items[2].visible = 1;
    
    /* 第四项隐藏 */
    config->items[3].visible = 0;
}

/**
 * @brief  配置设备信息组
 * @param  config  页面配置
 * @param  raw     原始数据
 */
static void hp_config_dev_info_group(HomePageViewConfig *config, const HomePageRawData *raw)
{
    strcpy(config->group_title, "");
    config->item_count = 3;
    /* 装置类型 */
    strcpy(config->items[0].label, "设备:");
    strncpy(config->items[0].value, raw->device_type, sizeof(config->items[0].value) - 1);
    config->items[0].value[sizeof(config->items[0].value) - 1] = '\0';
    strcpy(config->items[0].unit, "");
    config->items[0].color = DEFAULT_COLOR;
    config->items[0].visible = 1;
    config->items[0].use_chinese_font = 1;  /* 使用中文 */
    config->items[0].value_x = 250;         /* 数值X坐标向左调整 */

    /* 装置地址 */
    strcpy(config->items[1].label, "地址:");
    snprintf(config->items[1].value, sizeof(config->items[1].value), "%d", raw->device_addr);
    strcpy(config->items[1].unit, "");
    config->items[1].color = DEFAULT_COLOR;
    config->items[1].visible = 1;
    config->items[1].use_chinese_font = 1;  /* 使用中文 */
    config->items[1].value_x = 250;         /* 数值X坐标向左调整 */

    /* 日期时间 - 显示在value中 */
    strcpy(config->items[2].label, "时间:");
    hp_get_datetime(config->items[2].value, sizeof(config->items[2].value));
    strcpy(config->items[2].unit, "");
    config->items[2].color = DEFAULT_COLOR;
    config->items[2].visible = 1;
    config->items[2].use_chinese_font = 1;  /* 使用中文 */
    config->items[2].value_x = 250;         /* 数值X坐标向左调整 */

    /* 第四项隐藏 */
    config->items[3].visible = 0;
}

void home_page_service_init(void)
{
    s_current_group = HP_GROUP_MCB;
    data_home_page_init();
}

bool home_page_service_get_config(HomePageGroupType group, HomePageViewConfig *config)
{
    if (config == NULL)
    {
        return false;
    }
    
    HomePageRawData raw;
    if (!data_home_page_get_raw(&raw))
    {
        return false;
    }
    
    /* 清空配置 */
    memset(config, 0, sizeof(HomePageViewConfig));

    /* 初始化所有项的坐标为 -1（表示使用默认值） */
    for (int i = 0; i < HP_MAX_ITEMS_PER_GROUP; i++)
    {
        config->items[i].label_x = -1;
        config->items[i].label_y = -1;
        config->items[i].value_x = -1;
        config->items[i].value_y = -1;
        config->items[i].unit_x = -1;
        config->items[i].unit_y = -1;
    }

    config->group_type = group;
    config->device_addr = raw.device_addr;
    hp_get_datetime(config->datetime, sizeof(config->datetime));
    
    switch (group)
    {
    case HP_GROUP_MCB:
        hp_config_mcb_group(config, &raw);
        break;
        
    case HP_GROUP_LCB:
        hp_config_lcb_group(config, &raw);
        break;
        
    case HP_GROUP_LOAD_I:
        hp_config_load_i_group(config, &raw);
        break;
        
    case HP_GROUP_ZERO_I:
        hp_config_zero_i_group(config, &raw);
        break;
        
    case HP_GROUP_DEV_INFO:
        hp_config_dev_info_group(config, &raw);
        break;
        
    default:
        return false;
    }
    
    return true;
}

void home_page_service_set_group(HomePageGroupType group)
{
    if (group < HP_GROUP_NUM)
    {
        s_current_group = group;
    }
}

HomePageGroupType home_page_service_get_current_group(void)
{
    return s_current_group;
}

HomePageGroupType home_page_service_next_group(void)
{
    if (s_current_group >= HP_GROUP_NUM - 1)
    {
        s_current_group = HP_GROUP_MCB;
    }
    else
    {
        s_current_group++;
    }
    return s_current_group;
}

HomePageGroupType home_page_service_prev_group(void)
{
    if (s_current_group == HP_GROUP_MCB)
    {
        s_current_group = HP_GROUP_DEV_INFO;
    }
    else
    {
        s_current_group--;
    }
    return s_current_group;
}
