#include "ctrl_process.h"
#include "energy_config.h"

void common_ask(energy_var_t *var,char *dev_sn,char *identifier,int mi){
    char *data_tmp = NULL;
    char topic[TOPIC_MAX_LEN] = {0};
    cJSON *tag_data = cJSON_CreateObject();
    cJSON_AddStringToObject(tag_data, "sn", dev_sn);
    cJSON_AddNumberToObject(tag_data, "time", time(NULL));
    cJSON_AddStringToObject(tag_data, "identifier", identifier);
    cJSON_AddNumberToObject(tag_data, "data_type", 2);
    cJSON_AddStringToObject(tag_data, "tag_node", "{}");
    cJSON_AddNumberToObject(tag_data, "mi", mi);
    data_tmp = cJSON_Print(tag_data);        
    // ipc/%s/+/device/+/data/set_rglt_raw
    snprintf(topic, TOPIC_MAX_LEN, "ipc/%s/%s/device/%s/data/service/%s", var->sn_str,"NULL", dev_sn, identifier);
    ipc_session_publish(var->session, topic, (unsigned char*)data_tmp , strlen(data_tmp));
    
    //dbg_syslog(LOG_INFO, "topic:%s", topic);
    cJSON_Delete(tag_data);
    free(data_tmp);
}

void save_config_file(energy_var_t *var)
{
    char *data_tmp = NULL;                    
    cJSON *tag_data = cJSON_CreateObject();
    cJSON_AddNumberToObject(tag_data, "on_service_state", var->eng_ass_data->on_service_state);
    cJSON_AddNumberToObject(tag_data, "expect_run_state", var->eng_ass_data->expect_run_state);
    cJSON_AddNumberToObject(tag_data, "expect_relay_state", var->eng_ass_data->expect_relay_state);
    cJSON_AddNumberToObject(tag_data, "pcs_connect_state", var->eng_ass_data->pcs_connect_state);
    cJSON_AddNumberToObject(tag_data, "expect_power", var->eng_ass_data->expect_power);
    cJSON_AddNumberToObject(tag_data, "expect_wggl", var->eng_ass_data->expect_wggl);
    cJSON_AddNumberToObject(tag_data, "SOCMAX", var->eng_ass_data->SOCMAX);
    cJSON_AddNumberToObject(tag_data, "SOCMIN", var->eng_ass_data->SOCMIN);
    cJSON_AddNumberToObject(tag_data, "SINGLE_MAX", var->eng_ass_data->SINGLE_MAX);
    cJSON_AddNumberToObject(tag_data, "SINGLE_MIN", var->eng_ass_data->SINGLE_MIN);	
    data_tmp = cJSON_Print(tag_data); 
    write_file_data(ENG_SVC_STATE,data_tmp,strlen(data_tmp));  
    cJSON_Delete(tag_data);
    free(data_tmp);  
}

int data_ctrl_raw_msg(energy_var_t *var,char *str)
{
    if(!str)return -1;
    cJSON *root = NULL;
    root = cJSON_Parse(str);
    if (root)
    {
        char dev_sn[ENG_ASS_SN_LEN_MAX]="";
        char identifier[64]="";
        int mi = 0;
        GET_JSON_VALUE_STRING(root, "identifier", identifier);
        GET_JSON_VALUE_STRING(root, "sn", dev_sn);
        GET_JSON_VALUE_INT(root, "mi", mi);
        if(var->module_item)
        {
            abstract_item_t *item = var->module_item;
            //两个特殊的topic
            if(strcmp(identifier,ENG_ASS_ON_SERVICE_RUN ) == 0)
            {
                int action = -1;
                GET_JSON_VALUE_INT(root,"action",action);
                if(action != -1)
                {
                    if(item->set_service_state)item->set_service_state(var,action);
                    //added by yut
                    save_config_file(var);
                    //ended by yut
                }
            }
            else if(strcmp(identifier, MODESEL_SET_IDENTIFIER) == 0) {
                int mode = 0xff;
                GET_JSON_VALUE_INT(root, "ctrlMode", var->ems_run_mode);
                dbg_syslog(LOG_NOTICE, "ctrlMode: %d ", var->ems_run_mode);
                if (var->ems_run_mode == 0) // 手动模式
                {
                    var->eng_ass_data->SOCMAX = -1;
                    var->eng_ass_data->SOCMIN = -1;
                    dbg_syslog(LOG_NOTICE,"ctrlMode:%d SOCMAX: %f SOC min:%f ",var->ems_run_mode,var->eng_ass_data->SOCMAX,var->eng_ass_data->SOCMIN);
                    save_config_file(var);
                }
            }
            else if(strcmp(identifier,ENG_ASS_SAVE_CONFIG_IDENTIFIER) == 0){
                char  *pdata = NULL;
                pdata  = cJSON_Print(root);
                write_file_data(ENG_ASS_CFG_FILE,pdata,sizeof(pdata));
                free(pdata);
            }
            else if (strcmp(identifier, ENG_ASS_BMS_RELAY_ON_IDENTIFIER) == 0)
            {
                var->eng_ass_data->expect_relay_state = 1;
                if(item->set_bms_relay)item->set_bms_relay(var,var->eng_ass_data->expect_relay_state);
                save_config_file(var);
            }
            else if (strcmp(identifier, ENG_ASS_BMS_RELAY_OFF_IDENTIFIER) == 0)
            {
                var->eng_ass_data->expect_relay_state = 0;
                if(item->set_bms_relay)item->set_bms_relay(var,var->eng_ass_data->expect_relay_state);
                save_config_file(var);
            }
            else if(strcmp(identifier,ENG_ASS_PCS_OPEN_IDENTIFIER) == 0 || strcmp(identifier,ENG_ASS_PCS_RUN_IDENTIFIER) == 0){
                var->eng_ass_data->expect_run_state = 2;
                if(item->set_runmode)item->set_runmode(var,var->eng_ass_data->expect_run_state);
                save_config_file(var);
            }
            else if (strcmp(identifier, ENG_ASS_PCS_STABY_IDENTIFIER) == 0)
            {
                var->eng_ass_data->expect_run_state = 1;
                if(item->set_runmode)item->set_runmode(var,var->eng_ass_data->expect_run_state);
                save_config_file(var);
            }
            else if (strcmp(identifier, ENG_ASS_PCS_CLOSE_IDENTIFIER) == 0 || strcmp(identifier, ENG_ASS_PCS_STOP_IDENTIFIER) == 0)
            {
                var->eng_ass_data->expect_run_state = 0;
                if(item->set_runmode)item->set_runmode(var,var->eng_ass_data->expect_run_state);
                save_config_file(var);
            }

            else if (strcmp(identifier, ENG_ASS_PCS_CONNECT_IDENTIFIER) == 0 )
            {
                var->eng_ass_data->pcs_connect_state = 1;
                if(item->set_pcs_connect)item->set_pcs_connect(var,var->eng_ass_data->pcs_connect_state);
                save_config_file(var);
            }

            else if (strcmp(identifier, ENG_ASS_PCS_DISCONNECT_IDENTIFIER) == 0 && var->ems_run_mode == 0) //手动模式才能发离网
            {
                var->eng_ass_data->pcs_connect_state = 0;
                if(item->set_pcs_connect)item->set_pcs_connect(var,var->eng_ass_data->pcs_connect_state);
                save_config_file(var);
            }

            else if (strcmp(identifier, ENG_ASS_PCS_SET_TOTAL_IDENTIFIER) == 0 )
            {
                int power = 0;
                GET_JSON_VALUE_INT(root,"p2",power);
                var->eng_ass_data->expect_power = power;
                if(item->set_total_power)item->set_total_power(var,var->eng_ass_data->expect_power,0);
                save_config_file(var);
            }

            else if (strcmp(identifier, ENG_ASS_PCS_SET_TOTAL_WGGL_IDENTIFIER) == 0 )
            {
                int power = 0;
                GET_JSON_VALUE_INT(root,"wggl",power);
                var->eng_ass_data->expect_wggl = power;
                if(item->set_total_power)item->set_total_power(var,var->eng_ass_data->expect_wggl,1);
                save_config_file(var);
            }

            else if (strcmp(identifier, ENG_ASS_SET_SOC_MAX_MIN_IDENTIFIER) == 0 )
            {
                double socmax = 0;
                double socmin = 0;
                GET_JSON_VALUE_DOUBLE(root,"SOCMAX",socmax);
                GET_JSON_VALUE_DOUBLE(root,"SOCMIN",socmin);
                if(socmax == 0 && socmin == 0)
                {
                    socmax = -1;
                    socmin = -1;
                }
                if ((var->eng_ass_data->SOCMAX != socmax) || (var->eng_ass_data->SOCMIN != socmin))
                {
                    var->eng_ass_data->SOCMAX = socmax;
                    var->eng_ass_data->SOCMIN = socmin;
                    dbg_syslog(LOG_NOTICE,"SOCMAX: %f SOC min:%f ",var->eng_ass_data->SOCMAX,var->eng_ass_data->SOCMIN);
                    save_config_file(var);
                }
            }
            else if (strcmp(identifier, ENG_ASS_SET_SINGLE_MAX_MIN_IDENTIFIER) == 0 )
            {
				double singlemax = 0, singlemin = 0;
                GET_JSON_VALUE_DOUBLE(root, "SINGLE_MAX", singlemax);
                GET_JSON_VALUE_DOUBLE(root, "SINGLE_MIN", singlemin);
                if(singlemax == 0 && singlemin == 0) // 最高电压单体门限和最低电压单体门限同时设置为0，无效
                {
                    singlemax = -1;
                    singlemin = -1;
                }
                if ((var->eng_ass_data->SINGLE_MAX != singlemax) || (var->eng_ass_data->SINGLE_MIN != singlemin))
                {
                    var->eng_ass_data->SOCMAX = singlemax;
                    var->eng_ass_data->SOCMIN = singlemin;
                    dbg_syslog(LOG_NOTICE,"SINGLE_MAX: %f SINGLE_MIN:%f ",var->eng_ass_data->SINGLE_MAX,var->eng_ass_data->SINGLE_MIN);
                    save_config_file(var);
                }
            }

            else if (strcmp(identifier, ENG_ASS_PCS_RESET_ERR) == 0)
            {
                if(item->clr_pcs_error)item->clr_pcs_error(var);
            }
            
            else if(strcmp(identifier,ENG_ASS_PROTECT_LEVEL_IDENTIFIER) == 0)
            {
                cJSON *group_protects  = NULL;
                //TODO
                int grp_idx = 0;
                GET_JSON_VALUE_INT(root,"protect_level",var->eng_ass_data->protect_level);
                group_protects = cJSON_GetObjectItemCaseSensitive(root, "grps_protect_level");
                int node_cnt = cJSON_GetArraySize(group_protects);
                if (node_cnt != 0)
                {
                    for(int node_index=0;node_index<node_cnt;node_index++){
                        cJSON *group_protect   = NULL;
                        group_protect = cJSON_GetArrayItem(group_protects,node_index);
                        GET_JSON_VALUE_INT(group_protect,"level",var->grp[node_index].eng_ass_grp_ctrl.protect_level);
                    }
                }
                for(grp_idx = 0;grp_idx<var->eng_ass_grp_num;grp_idx++)
                {
                    int tmp = -1;
                    char buff[100] = {0};
                    snprintf(buff,sizeof(buff),"grp%d_protect_level",grp_idx+1);                    
                    GET_JSON_VALUE_INT(root,buff,tmp);
                    if(tmp != -1)
                    {   
                        var->grp[grp_idx].eng_ass_grp_ctrl.protect_level = tmp;
                        dbg_syslog(LOG_INFO,"protect: %d",var->grp[grp_idx].eng_ass_grp_ctrl.protect_level);
                    }
                }
            }else{
                /*
                for(i=0;i<ARRAY_SIZE(service_cbs);i++)
                {
                    int grp_idx;
                    data_ctrl_ident_cb_t *service_cb = &service_cbs[i];
                    if(cJSON_GetObjectItem(root, service_cb->tag_key)){
                        GET_JSON_VALUE_INT(root, service_cb->tag_key, value);              
                        if(strcmp(identifier,service_cb->identifier) == 0)
                        {
                            for(grp_idx = 0;grp_idx<var->eng_ass_grp_num;grp_idx++)
                                service_cb->func(var,grp_idx,value);
                            break;
                        }
                    }else{ //没有key
                        if(strcmp(identifier,service_cb->identifier) == 0)
                        {
                            for(grp_idx = 0;grp_idx<var->eng_ass_grp_num;grp_idx++)
                                service_cb->func(var,grp_idx,value);
                            break;
                        }
                    }
                }
                */
            }
        }
        if(mi != ENG_ASS_EMS_CMD_MI)common_ask(var,dev_sn,identifier,mi);
        cJSON_Delete(root);
    }
    return 0;
}
