#include "data_collect.h"
#include <time.h>

static int get_grp_idx(energy_var_t *var, char *dev_sn)
{
    int i;
    assert(dev_sn);
    for (i = 0; i < var->eng_ass_grp_num; i++)
    {
        // TODO 目前支持1堆一簇
        if ((var->grp[i].eng_ass_grp_cfg.pcs_sn && (strcmp(var->grp[i].eng_ass_grp_cfg.pcs_sn, dev_sn) == 0)) ||
            (var->grp[i].eng_ass_grp_cfg.meter_sn && (strcmp(var->grp[i].eng_ass_grp_cfg.meter_sn, dev_sn) == 0)) ||
            (var->grp[i].eng_ass_grp_cfg.bms_sn[0] && (strcmp(var->grp[i].eng_ass_grp_cfg.bms_sn[0], dev_sn) == 0)))
        {
            return i;
        }
    }

    return -1;
}

static void update_recv_time(energy_var_t *var, char *dev_sn)
{
    int i;
    time_t now = time(NULL);
    assert(dev_sn);

    for (i = 0; i < var->eng_ass_grp_num; i++)
    {
        if (var->grp[i].eng_ass_grp_cfg.pcs_sn && (strcmp(var->grp[i].eng_ass_grp_cfg.pcs_sn, dev_sn) == 0))
        {
            var->grp[i].eng_ass_grp_data.pcs_recv_time = now;
        }
        else if (var->grp[i].eng_ass_grp_cfg.meter_sn && (strcmp(var->grp[i].eng_ass_grp_cfg.meter_sn, dev_sn) == 0))
        {
            var->grp[i].eng_ass_grp_data.meter_recv_time = now;
        }
        else if (var->grp[i].eng_ass_grp_cfg.bms_sn[0] && (strcmp(var->grp[i].eng_ass_grp_cfg.bms_sn[0], dev_sn) == 0))
        {
            var->grp[i].eng_ass_grp_data.bms_recv_time = now;
        }
    }
}

int into_data_col_raw_msg(energy_var_t *var, cJSON *sub, char *dev_sn)
{
    int grp_idx = get_grp_idx(var, dev_sn);

    if (grp_idx < 0 || grp_idx >= ENG_ASS_GRP_MAX)
    {
        dbg_syslog(LOG_WARNING, "Invalid device sn:%s", dev_sn);
        return -1;
    }

    update_recv_time(var, dev_sn);
    if(var->module_item)
    {
        abstract_item_t *item = var->module_item;
        if(item->on_dev_data_updata)
        {
            item->on_dev_data_updata(var,sub,grp_idx);
        }
    }
    pthread_cond_signal(&var->grp[grp_idx].action_cond);
    return 0;
}
/*
int data_col_raw_msg(energy_var_t *var, char *tagNode, char *dev_sn)
{
    cJSON *sub = NULL;
    cJSON *item = NULL;
    int i = 0;
    int tag_num = 0;

    if (!tagNode)
    {
        return -1;
    }

    int grp_idx = get_grp_idx(var, dev_sn);
    if (grp_idx < 0 || grp_idx >= ENG_ASS_GRP_MAX)
    {
        dbg_syslog(LOG_WARNING, "Invalid device sn:%s", dev_sn);
        return -1;
    }
    update_recv_time(var, dev_sn);

    void *ptr = &var->grp[grp_idx].eng_ass_grp_data;
    sub = cJSON_Parse(tagNode);
    if (sub)
    {
        tag_num = cJSON_GetArraySize(sub);
        for (i = 0; i < tag_num; i++)
        {
            item = cJSON_GetArrayItem(sub, i);
            if (item == NULL)
            {
                dbg_syslog(LOG_ERR, "cJSON_GetArrayItem failed");
                continue;
            }
            if (item->type != cJSON_Number)
            {
                continue;
            }

            tag_info_t *info_p = NULL;
            if (hash_intptr_findptr(tag_map_hash, item->string, strlen(item->string), (void **)&info_p) < 0)
            {
                continue;
            }

            switch (info_p->type)
            {
            case E_TAG_INT:
                *((int *)(ptr + info_p->member_ofs)) = item->valueint;
                break;
            case E_TAG_FLOAT:
                *((float *)(ptr + info_p->member_ofs)) = item->valuedouble;
                break;
            default:
                dbg_syslog(LOG_ERR, "unsupported this type on tag:%s", item->string);
                break;
            }
        }
        cJSON_Delete(sub);
        pthread_cond_signal(&var->grp[grp_idx].action_cond);
    }
    return 0;
}
*/