#include "service_real_time_data.h"
#include "comm.h"
#include "format_utils.h"
#include "data/data_manager.h"
#include "data/data_real_time.h"
#include "data/data_telemet_common.h"


#define RTD_YX_RIGHT_VALUE_X       450
#define RTD_YC_RIGHT_VALUE_X       325  // 可根据页面调整，内部兼容
#define RTD_YC_RIGHT_UNIT_X        430

// ===================== 开出控制设置界面相关数据结构 =====================
// 开出控制选项：合闸/分闸
static const UiSetOption yk_control_options[] = {
    { "分闸", 0 },  // 选项索引0：分闸
    { "合闸", 1 },  // 选项索引1：合闸
};

#define YK_CONTROL_OPTION_NUM   (sizeof(yk_control_options) / sizeof(yk_control_options[0]))

// 开出控制设置数据结构
static UiSetValueOptDef s_yk_set_opt = {0};
static bool s_yk_set_opt_inited = false;

/**
 * @brief  初始化开出控制设置选项数据结构
 * @note   创建UiSetValueOptDef结构体，用于ui_comp_set_vale_list组件
 * @return 返回初始化好的UiSetValueOptDef指针
 * @date   2026-02-26
 */
static UiSetValueOptDef* rtd_init_yk_set_opt(void)
{
    if (!s_yk_set_opt_inited)
    {
        s_yk_set_opt.title = "开出控制";
        s_yk_set_opt.set_str = "设置数值";
        s_yk_set_opt.curr_value = 0.0f;     // 默认选择分闸(索引0)
        s_yk_set_opt.max_value = 1.0f;      // 最大索引1(合闸)
        s_yk_set_opt.min_value = 0.0f;      // 最小索引0(分闸)
        s_yk_set_opt.step = 1.0f;           // 步长为1
        s_yk_set_opt.decimal_digit = 0;     // 整数，无小数位
        s_yk_set_opt.opt_list = yk_control_options;  // 选项列表
        s_yk_set_opt.opt_list_num = YK_CONTROL_OPTION_NUM;  // 选项数量
        s_yk_set_opt.unit = "";             // 无单位
        s_yk_set_opt.type = UISETOPT_TYPE_LIST;  // 列表类型
        s_yk_set_opt_inited = true;
    }
    return &s_yk_set_opt;
}

/**
 * @brief  获取开出控制设置选项数据结构
 * @return UiSetValueOptDef指针
 * @date   2026-02-26
 */
UiSetValueOptDef* rtd_service_get_yk_set_opt(void)
{
    return rtd_init_yk_set_opt();
}

/**
 * @brief  设置当前选中的开出控制值
 * @param  value 选择的值(0=分闸, 1=合闸)
 * @date   2026-02-26
 */
void rtd_service_set_yk_control_value(float value)
{
    UiSetValueOptDef* opt = rtd_init_yk_set_opt();
    opt->curr_value = value;
    
    // 输出选择结果
    int idx = (int)value;
    if (idx >= 0 && idx < YK_CONTROL_OPTION_NUM)
    {
        printf("[开出控制] 选择结果: %s (值=%d)\r\n", yk_control_options[idx].str, idx);
    }
}

/**
 * @brief  获取当前选中的开出控制值
 * @return 当前值(0=分闸, 1=合闸)
 * @date   2026-02-26
 */
float rtd_service_get_yk_control_value(void)
{
    UiSetValueOptDef* opt = rtd_init_yk_set_opt();
    return opt->curr_value;
}

// ===================== DO遥控控制接口实现（data层映射）=====================

/**
 * @brief  执行DO遥控操作（开出控制）
 * @param  do_index DO索引（0 ~ do_num-1）
 * @param  type 操作类型，DO_CTRL_OFF(分闸) 或 DO_CTRL_ON(合闸)
 * @return DoCtrlRet 操作结果
 * @date   2026-02-26
 */
DoCtrlRet rtd_service_do_control(uint8_t do_index, DoCtrlType type)
{
    // 直接调用data层的接口
    return data_mgr_do_control(do_index, type);
}

/**
 * @brief  获取DO遥控状态
 * @param  do_index DO索引（0 ~ do_num-1）
 * @return int 当前状态，0=分，1=合，-1=错误
 * @date   2026-02-26
 */
int rtd_service_get_do_status(uint8_t do_index)
{
    // 直接调用data层的接口
    return data_mgr_get_do_status(do_index);
}

void rtd_get_yx_ui_data(u8 item_sel_idx ,GeneralListPageConfig_t *config)
{
    // 获取最新的遥信数据
    data_mgr_get_yx_data();
    
    u8 manulen = 0;
    manulen = data_real_time_get_yx_count();           //获取遥信数量
    YX_OPTTypeDef *menu_opt = Telesignal_opt;

    u8 i = 0;
    
    config->slider_size = manulen;          //设置进度条
    config->slider_value = item_sel_idx;

    PageInfo info;  // 计算页数  定义存储结果的结构体
    calculate_page_info_default(item_sel_idx , manulen , &info);
    config->total_page = info.total_pages;
    config->current_page = info.current_page;
    config->right_data_count = info.current_page_items; //此页有多少数据


    for ( i = 0; i < config->right_data_count; i++)
    {
        //计算数据索引
        int dataidx = i + DEFAULT_RIGHT_DATA_ITEM_COUNT * (info.current_page - 1) ;

        //设置名称
        strcpy(config->right_data[i].name, menu_opt[dataidx].name);
        config->right_data[i].name_color = Default_HZ_color;

        //设置数值
        if (menu_opt[dataidx].valu == 1)
        {
            strcpy(config->right_data[i].value, "合");
            config->right_data[i].value_color = LV_COLOR_RED;
        }
        else if (menu_opt[dataidx].valu == 0)
        {
            strcpy(config->right_data[i].value, "分");
            config->right_data[i].value_color = LV_COLOR_GREEN;
        }
        
        config->right_data[i].value_posx = RTD_YX_RIGHT_VALUE_X;        
        
        //设置单位
        //遥信无单位，所以不进行设置
        
    }
    
}

void rtd_get_yc_ui_data(CursorPosition selectMenu , u8 item_sel_idx ,GeneralListPageConfig_t *config)
{
    // 获取最新的遥测数据，根据菜单选择确定遥测类型
    GET_TYPE yc_type = TYPE_YCDISPLY_PRIMARY; // 默认一次值
    if (selectMenu == SUB_RTD_SYC)
    {
        yc_type = TYPE_YCDISPLY_SECONDY; // 二次值
    }
    data_mgr_get_yc_data(yc_type);
    
    u8 manulen = 0 ,i = 0;
    char buf[30] = {0};
    manulen = SUBMENU_TELEMET_NUM;
    REAL_OPTTypeDef *menu_opt = Telemet_opt;

    PageInfo info;  // 计算页数  定义存储结果的结构体
    calculate_page_info_default(item_sel_idx , manulen , &info);

    config->slider_size = manulen;          //设置进度条
    config->slider_value = item_sel_idx;

    config->total_page = info.total_pages;
    config->current_page = info.current_page;
    config->right_data_count = info.current_page_items; //此页有多少数据
    // printf("%s item_sel_idx = %d , total_page = %d , current_page = %d, right_data_count = %d\n", __FUNCTION__, item_sel_idx, config->total_page ,
    //                         config->current_page , config->right_data_count);


    for ( i = 0; i < config->right_data_count; i++)
    {
        config->right_data[i].value_posx = RTD_YC_RIGHT_VALUE_X;
        config->right_data[i].unit_posx = RTD_YC_RIGHT_UNIT_X;

        //计算数据索引
        int dataidx = i + DEFAULT_RIGHT_DATA_ITEM_COUNT * (info.current_page - 1) ;

        // 判断是否为需要隐藏的项（数组id为15或31，名称为空格的占位项）
        if (dataidx == 15 || dataidx == 31)
        {
            // 不显示名称和数值
            strcpy(config->right_data[i].name, "");
            strcpy(config->right_data[i].value, "");
            strcpy(config->right_data[i].unit, "");
            continue;
        }

        if (item_sel_idx == dataidx)    //如果是选中的则设置红色
        {
            config->right_data[i].name_color = LV_COLOR_RED;
            config->right_data[i].value_color = LV_COLOR_RED;
        }
        else
        {
            config->right_data[i].name_color = Default_HZ_color;
            config->right_data[i].value_color = Default_HZ_color;
        }
        
        //strcpy(config->right_data[i].name, menu_opt[dataidx].name);
        //config->right_data[i].name_color = Default_HZ_color;

        if ((info.current_page < 5 && (i == 1 || i == 3 || i == 5 || i == 7)) ||
            (info.current_page == 5 && (i == 1 || i == 3 || i == 5)))
        {
            strcpy(config->right_data[i].name , " ");
        }
        else
        {
            //lv_label_set_text(rtd_labeldis[i], menu_opt[i + 8 * page].opt); // 子菜单
            strcpy(config->right_data[i].name , menu_opt[dataidx].opt);
        }

        // if ((info.current_page == 1 || info.current_page == 3) && i == 7)
        {
            // strcpy(config->right_data[i].value , " ");
            // strcpy(config->right_data[i].unit , " ");
        }
        //else
        {
            format_float_to_string(menu_opt[dataidx].point, menu_opt[dataidx].valu, buf, sizeof(buf));
            strncpy(config->right_data[i].value , buf , strlen(buf));
            strncpy(config->right_data[i].unit , menu_opt[dataidx].Company , strlen(menu_opt[dataidx].Company));
        }
    }
}

void rtd_get_yk_outside_ui_data(u8 item_sel_idx ,GeneralListPageConfig_t *config, bool is_authenticated)
{
    u8 manulen = 0;
    u8 i = 0;
    Para_OPTTypeDef *menu_opt = NULL;

    // 根据认证状态选择显示的数据
    if (is_authenticated)
    {
        // 已认证通过，显示实际遥控输出仪数据
        data_mgr_get_yk_data();
        manulen = g_equ_config->do_num;
        if (manulen > SUBMENU_REMOTCRTL_NUM)
            manulen = SUBMENU_REMOTCRTL_NUM;
        menu_opt = Remote_ctrl_opt;
    }
    else
    {
        // 未认证时显示占位数据
        manulen = 1;
        menu_opt = Remote_RemoteParset_opt;
    }

    // 计算页面信息
    PageInfo info;
    calculate_page_info_default(item_sel_idx, manulen, &info);

    config->slider_size = manulen;
    config->slider_value = item_sel_idx;
    config->total_page = info.total_pages;
    config->current_page = info.current_page;
    config->right_data_count = info.current_page_items;

    // 填充页面显示数据
    for (i = 0; i < config->right_data_count; i++)
    {
        int dataidx = i + DEFAULT_RIGHT_DATA_ITEM_COUNT * (info.current_page - 1);

        // 填充选项名称
        strcpy(config->right_data[i].name, menu_opt[dataidx].opt);

        config->right_data[i].name_color = Default_HZ_color;

        if (is_authenticated)
        {
            if(dataidx == item_sel_idx)
            {
                config->right_data[i].name_color = LV_COLOR_RED;
            }
            // 认证通过，显示状态
            if (menu_opt[dataidx].value == 1)
            {
                strcpy(config->right_data[i].value, "合");
                config->right_data[i].value_color = LV_COLOR_RED;
            }
            else if (menu_opt[dataidx].value == 0)
            {
                strcpy(config->right_data[i].value, "分");
                config->right_data[i].value_color = LV_COLOR_GREEN;
            }
            else
            {
                strcpy(config->right_data[i].value, "未知");
                config->right_data[i].value_color = Default_HZ_color;
            }
        }
        else
        {
            // 未认证时显示占位空值
            strcpy(config->right_data[i].value, "");
        }

        config->right_data[i].value_posx = RTD_YX_RIGHT_VALUE_X;

        // 填充单位
        strcpy(config->right_data[i].unit, "");
    }
}

void rtd_service_get_ui_data(CursorPosition selectMenu ,u8 manu_sel_idx , u8 item_sel_idx , GeneralListPageConfig_t *config, bool is_yk_authenticated)
{
    u8 i = 0;
    if (config == NULL)
    {
        GeneralListPageConfig_t default_config = {0};
        config = &default_config;
    }


    //标题栏
    strcpy(config->path_text, Disp_path_opt[0]);
    strcat(config->path_text, MainManu_dis[4]);

    //左侧
    config->left_menu_count = MENU_RealTimeData_NUM;
    for ( i = 0; i < MENU_RealTimeData_NUM; i++)
    {
        
        strcpy(config->left_menu[i].text , Sys_RealTimeData_disp[i]);
        if (manu_sel_idx == i)
        {
            config->left_menu[i].color = LV_COLOR_RED;
        }
        else
            config->left_menu[i].color = Default_HZ_color;
        //config.left_menu[0].font = &GBhzk22;
    }

    switch (manu_sel_idx)
    {
    case SUB_RTD_YX:
        rtd_get_yx_ui_data(item_sel_idx,config);
        break;
    case SUB_RTD_OYC:
    case SUB_RTD_SYC:
        rtd_get_yc_ui_data(selectMenu , item_sel_idx , config);
        break;
    case SUB_RTD_YK:
        rtd_get_yk_outside_ui_data( item_sel_idx , config, is_yk_authenticated);
        break;
    default:
        break;
    }
}