#include "alarm_define.h"

#include "define.h"

#include "alarm_define.h"
#include <stdlib.h>
#include <sys/syslog.h>
#include "../ems/g100_protect.h"

alarm_define_t alarm_config_list[] = {
    {DEV_TYPE_EMS,
     {{DOD_LIMITED, 20003, 0, {DEV_NO_EMS "." EMS_SOCMIN, DEV_NO_EMS "." EMS_SOCMAX, "BMS.SOC"}, CONDITION_GE, 1, {{"EMS.EnProtectDOD", CONDITION_GE, 1}}, true},
      {IO_PROTECT, 20004, 5, {}, CONDITION_GE, 1, {{}}, true},
      {METER_ERROR, 20004, 8, {}, CONDITION_GE, 1, {{}}, true},
      {TEMP_CTRL_ERR, 20004, 10, {}, CONDITION_GE, 1, {{}}, true},
      {ALL_FIRE, 20004, 11, {}, CONDITION_GE, 1, {{}}, true},
      {USER_STOP1, 20004, 12, {}, CONDITION_GE, 1, {{}}, true},
      {USER_STOP2, 20004, 13, {}, CONDITION_GE, 1, {{}}, true},
      {USER_STOP3, 20004, 14, {}, CONDITION_GE, 1, {{}}, true},
      {USER_STOP_CHA1, 20004, 15, {}, CONDITION_GE, 1, {{}}, true},
      {USER_STOP_CHA2, 20004, 16, {}, CONDITION_GE, 1, {{}}, true},
      {USER_STOP_CHA3, 20004, 17, {}, CONDITION_GE, 1, {{}}, true},
      {USER_STOP_DISCHA1, 20004, 18, {}, CONDITION_GE, 1, {{}}, true},
      {USER_STOP_DISCHA2, 20004, 19, {}, CONDITION_GE, 1, {{}}, true},
      {USER_STOP_DISCHA3, 20004, 20, {}, CONDITION_GE, 1, {{}}, true},
      {WHITELIST_ALARM, 20004, 21, {}, CONDITION_GE, 1, {{}}, true},
      {METER_ERROR, 20006, 0, {}, CONDITION_GE, 1, {{}}, true},
      {FIRE, 20007, 2, {}, CONDITION_GE, 1, {{}}, true},
      {EXTERN_FIRE, 20007, 1, {}, CONDITION_GE, 1, {{}}, true},
      {ALL_FIRE, 20010, 1, {}, CONDITION_GE, 1, {{}}, true},
      {EMS_POWER, 20020, 0, {}, CONDITION_GE, 1, {{}}, true},
      {SINGLE_CELL_VOL_THRESHOLD_ALARM, 20021, 0, {DEV_NO_EMS "." SINGLE_MIN_VOLTAGE, DEV_NO_EMS "." SINGLE_MAX_VOLTAGE, DEV_NO_BMS "." RACK_MIN_VOLT, DEV_NO_BMS "." RACK_MAX_VOLT}, CONDITION_GE, 1, {{}}, true},
      {PROHIBITE_CHARGE, 20013, 0, {DEV_NO_EMS "." DOD_LIMITED, DEV_NO_BMS "." CELL_OVER_VOL2, DEV_NO_BMS "." CELL_OVER_VOL3, DEV_NO_BMS "." RACK_OVER_VOL2, DEV_NO_BMS "." RACK_OVER_VOL3}, CONDITION_GE, 1, {{}}, true},
      {PROHIBITE_DISCHARGE, 20014, 0, {DEV_NO_EMS "." DOD_LIMITED, DEV_NO_BMS "." CELL_UNDER_VOL2, DEV_NO_BMS "." CELL_UNDER_VOL3, DEV_NO_BMS "." RACK_UNDER_VOL2, DEV_NO_BMS "." RACK_UNDER_VOL3}, CONDITION_GE, 1, {{}}, true},
      {EMS_CPU_HIGH, 20023, 0, {}, CONDITION_GE, 1, {{}}, true},
      {EMS_MEM_HIGH, 20024, 0, {}, CONDITION_GE, 1, {{}}, true},
      {EMMC_DISK_HIGH, 20025, 0, {}, CONDITION_GE, 1, {{}}, true},
      {SSD_DISK_HIGH, 20025, 1, {}, CONDITION_GE, 1, {{}}, true},
      {G100_LOCK_STATE, 20028, 0, {DEV_NO_EMS"."G100_BACKFLOW_LOCK_TIME}, CONDITION_EQ, 1, {{DEV_NO_EMS"."G100_ABNORMAL_STATE, CONDITION_EQ, 1}}, true},
      {G100_LOCK_STATE, 20028, 1, {DEV_NO_EMS"."G100_OVERLOAD_LOCK_TIME}, CONDITION_EQ, 1, {{DEV_NO_EMS"."G100_ABNORMAL_STATE, CONDITION_EQ, 2}}, true},
      {G100_LOCK_STATE, 20028, 2, {DEV_NO_EMS"."G100_BACKFLOW_LOCK_TIME, DEV_NO_EMS"."G100_MAXCOUNT_MON}, CONDITION_EQ, 2, {{DEV_NO_EMS"."G100_ABNORMAL_STATE, CONDITION_EQ, 1}}, true},
      {G100_LOCK_STATE, 20028, 3, {DEV_NO_EMS"."G100_OVERLOAD_LOCK_TIME, DEV_NO_EMS"."G100_MAXCOUNT_MON}, CONDITION_EQ, 2, {{DEV_NO_EMS"."G100_ABNORMAL_STATE, CONDITION_EQ, 2}}, true},
      {G100_ABNORMAL_STATE, 20028, 4, {}, CONDITION_EQ, 1, {{}}, true},
      {G100_ABNORMAL_STATE, 20028, 5, {}, CONDITION_EQ, 2, {{}}, true},
      {SOC_LIMIT_ALARM, 20029, 0, {}, CONDITION_GE, 1, {{}}, true},
      {IEC104_CONN_ALARM, 20030, 0, {}, CONDITION_GE, 1, {{}}, true},
      {MODBUSTCP_CONN_ALARM, 20031, 0, {}, CONDITION_GE, 1, {{}}, true},
      {SSD_NOT_EXIST, 20032, 0, {}, CONDITION_GE, 1, {{}}, true},
      {HISTORY_DATA_READ_ALARM, 20033, 0, {}, CONDITION_GE, 1, {{}}, true},
    }},

    {DEV_TYPE_LC,
     {{"Online", 10001, 0, {}, CONDITION_LE, 0, {{}}, true},
      {SYSTEM_STATUS, 20004, 0, {}, CONDITION_GE, 1, {{}}, true},
      {DOD_LIMITED, 20003, 0, {"$DEV_NO." EMS_SOCMIN, "$DEV_NO." EMS_SOCMAX, "$DEV_NO.BMS.SOC"}, CONDITION_GE, 1, {{"$DEV_NO.EnProtectDOD", CONDITION_GE, 1}}, true},
      {PROHIBITE_CHARGE, 20013, 0, {"$DEV_NO." DOD_LIMITED, "$DEV_NO.BMS." CELL_OVER_VOL2, "$DEV_NO.BMS." CELL_OVER_VOL3, "$DEV_NO.BMS." RACK_OVER_VOL2, "$DEV_NO.BMS." RACK_OVER_VOL3}, CONDITION_GE, 1, {{}}, true},
      {PROHIBITE_DISCHARGE, 20014, 0, {"$DEV_NO." DOD_LIMITED, "$DEV_NO.BMS." CELL_UNDER_VOL2, "$DEV_NO.BMS." CELL_UNDER_VOL3, "$DEV_NO.BMS." RACK_UNDER_VOL2, "$DEV_NO.BMS." RACK_UNDER_VOL3}, CONDITION_GE, 1, {{}}, true},
      {SINGLE_CELL_VOL_THRESHOLD_ALARM, 20021, 0, {"$DEV_NO." SINGLE_MIN_VOLTAGE, "$DEV_NO." SINGLE_MAX_VOLTAGE, "$DEV_NO.BMS." RACK_MIN_VOLT, "$DEV_NO.BMS." RACK_MAX_VOLT}, CONDITION_GE, 1, {{}}, true}}},
    {DEV_TYPE_METER,
     {
         {"Online", 10004, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 4, {}, CONDITION_GE, 1, {{}}, true},
     }},
    {DEV_TYPE_AC,
     {
         {"Online", 10005, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 5, {}, CONDITION_GE, 1, {{}}, true},
     }},
    {DEV_TYPE_OTHERS,
     {
         {"Online", 10012, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 10, {}, CONDITION_GE, 1, {{}}, true},
     }},
    {DEV_TYPE_TMS,
     {
         {"Online", 10010, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 8, {}, CONDITION_GE, 1, {{}}, true},
     }},
    {DEV_TYPE_AIRECOND,
     {
         {"Online", 10005, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 5, {}, CONDITION_GE, 1, {{}}, true},
     }},
    {DEV_TYPE_DIDO,
     {
         {"Online", 10012, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 6, {}, CONDITION_GE, 1, {{}}, true},
     }},
    {DEV_TYPE_LIQUID_COOL,
     {
         {"Online", 10010, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 8, {}, CONDITION_GE, 1, {{}}, true},
     }},
    {DEV_TYPE_HUMITURE,
     {
         {"Online", 10011, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 9, {}, CONDITION_GE, 1, {{}}, true},
     }},
    {DEV_TYPE_BMS,
     {{"Online", 10003, 0, {}, CONDITION_LE, 0, {{}}, true},
      {STATE_CHANNELLOCK, 10020, 3, {}, CONDITION_GE, 1, {{}}, true},
      {CELL_OVER_VOL3, 20004, 1, {}, CONDITION_GE, 1, {{"EMS.EnBmsAlarm", CONDITION_GE, 1}}, true},
      {CELL_UNDER_VOL3, 20004, 2, {}, CONDITION_GE, 1, {{"EMS.EnBmsAlarm", CONDITION_GE, 1}}, true},
      {RACK_OVER_VOL3, 20004, 3, {}, CONDITION_GE, 1, {{"EMS.EnBmsAlarm", CONDITION_GE, 1}}, true},
      {RACK_UNDER_VOL3, 20004, 4, {}, CONDITION_GE, 1, {{"EMS.EnBmsAlarm", CONDITION_GE, 1}}, true},
      {"Online", 20004, 7, {}, CONDITION_LE, 0, {{}}, true},
      {RACL_VOLTAGE, 20012, 1, {"EMS.RackVoltage"}, CONDITION_LE, DC_TOTAL_VOL_LIMIT, {{}}, true}}},
    {DEV_TYPE_PCS,
     {{"Online", 10002, 0, {}, CONDITION_LE, 0, {{}}, true},
      {STATE_CHANNELLOCK, 10020, 2, {}, CONDITION_GE, 1, {{}}, true},
      {"Online", 20004, 6, {}, CONDITION_LE, 0, {{}}, true},
      {PCS_FAULT, 20004, 9, {}, CONDITION_GE, 1, {{}}, true}}},
    {DEV_TYPE_PV,
     {
         {"Online", 10013, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 11, {}, CONDITION_GE, 1, {{}}, true},
     }},
    {DEV_TYPE_MPPT,
     {
         {"Online", 10014, 0, {}, CONDITION_LE, 0, {{}}, true},
         {STATE_CHANNELLOCK, 10020, 12, {}, CONDITION_GE, 1, {{}}, true},
     }},
     {DEV_TYPE_UPS,
        {
            {"Online", 10009, 0, {}, CONDITION_LE, 0, {{}}, true},
            {STATE_CHANNELLOCK, 10020, 7, {}, CONDITION_GE, 1, {{}}, true},
        }},
};

const int alarm_config_list_num = sizeof(alarm_config_list) / sizeof(alarm_config_list[0]);


void destory_alarm_info(alarm_info_t* info)
{
	alarm_val_t *param;
	int i;
	if (info == NULL)
		return;

	for (i = 0; i < ALARM_CHILD_CONDS_NUM_MAX; i++) {
		param = info->additional_para;
		if (param == NULL)
			break;
		if (param->addtype[i] == 2 || param->tags[i])
			free(param->tags[i]);
		if (param->tags[i] == NULL)
			break;
	}
	free(param);

	for (i = 0; i < info->condition_num; i++)
		free(info->condition[i]);
	if (info->para_list)
		free(info->para_list);

	free(info);
}

void destory_alarm_tag(alarm_tag_t* tag)
{
    if (tag)
    {
        for (int i = 0; i < tag->alarm_info_num; i++)
        {
            destory_alarm_info(tag->alarm_info[i]);
        }

        free(tag);
    }
}

void destory_alarm_real(alarm_real_t* alarm_real)
{
    if (alarm_real)
    {
        if (alarm_real->additional)
            free(alarm_real->additional);
        if (alarm_real->entity)
            free(alarm_real->entity);
        if (alarm_real->tagname)
            free(alarm_real->tagname);

        free(alarm_real);
    }
}

void destory_alarm_report(alarm_report_t* alarm_report)
{
    if (alarm_report)
    {
        if (alarm_report->additional)
            free(alarm_report->additional);
        if (alarm_report->entity)
            free(alarm_report->entity);
        if (alarm_report->tagname)
            free(alarm_report->tagname);
        free(alarm_report);
    }
}

int alarm_tag_add_alarm_info(alarm_tag_t* tag, alarm_info_t* alarm_info)
{
    for (int i = 0; i < tag->alarm_info_num; i++)
    {
        if (tag->alarm_info[i]->alarm_code == alarm_info->alarm_code && tag->alarm_info[i]->reason_code == alarm_info->reason_code)
        {
			destory_alarm_info(tag->alarm_info[i]);
            tag->alarm_info[i] = alarm_info;
            return 0;
        }
    }
    if (tag->alarm_info_num >= ALARM_CHILD_CONDS_NUM_MAX)
    {
        return -1;
    }

    tag->alarm_info[tag->alarm_info_num++] = alarm_info;
    return 0;
}

int alarm_tag_add_condition(alarm_info_t* tag, alarm_condition_t* condition)
{
    if (tag->condition_num >= ALARM_CHILD_CONDS_NUM_MAX)
    {
        return -1;
    }
    tag->condition[tag->condition_num++] = condition;
    return 0;
}
