#ifndef __EMS_SMU_COMMON_H
#define __EMS_SMU_COMMON_H

/***************HEADER FILES****************/
#include <string.h>
#include <syslog.h>
#include "ipc_session.h"
#include "lnxall_list.h"
#include "dy_utils/uthash/uthash.h"
#include "dy_utils/dy_common.h"
#include "dy_utils/dy_db.h"
#include "dy_utils/dy_ipc.h"
#include "dy_utils/led.h"
#include "mqtt_session.h"
#include "lnxall_ubuslog.h"
#include <hiredis/hiredis.h>

#include "util.h"
#include "cmdclient.h"
/******************************************/

#define EMS_SMU_CFGPATH "/app/config/emssmu_config.json"
#define EMS_SMU_NODESTRU "/app/config/smu_nodes"
#define DEV_TYPE_PATH "/app/config/ems_redis/devtype"
#define EMMSV2_STATION_CONFIG "/app/config/stacfg.json"
#define EMMSV2_TAGMAP_CONFIG "/app/config/emstag"
/*
* topic is defined in {PLATFORM}/{ACTION}/{LC_SN}/{FUNC ID}(optional. /{Compress Algorithm}) format
* such as smu/LcPost/218800000001/Login/lz4
*/
/*****************PLATFORM****************/
#define PLATFORM "smu"

/******************ACTION*****************/
#define MAX_ACT_LEN 16
#define LCPOST "LcPost"
#define LCPOSTRSP "LcPostResp"
#define GET "Get"
#define GETRSP "GetResp"
#define SET "Set"
#define SETRSP "SetResp"

/****************FUNC ID*****************/
#define MAX_FUNC_LEN 24
#define FUNC_LOGIN "Login"
#define FUNC_NODESTRUCTURE "NodeStructure"
#define FUNC_DATAREPORT "DataReport"
#define FUNC_HISTORYDATA "HistoryData"
#define FUNC_SETPOINT "SetPoint"
#define FUNC_GETSYSPARAM "GetSysParam"
#define FUNC_SETSYSPARAM "SetSysParam"
#define FUNC_ALLALARM "AllAlarm"
#define FUNC_SYSUSE "SysUse"
#define FUNC_NETSTAT "NetStat"
#define FUNC_GETPORTCFG "GetPortCfg"
#define FUNC_SETPORTCFG "SetPortCfg"
#define FUNC_NTP "NTP"
#define FUNC_LCUPGRADE "LCUpgrade"
#define FUNC_REBOOT "Reboot"
#define FUNC_ABOUT "About"

/**************EMS param***************/
#define SET_ONOFF "OnOff"
#define SET_POWER "SetPower"
#define SET_REPOWER "SetRePower"
#define SET_CONNECT "SetConnect"
#define SET_CLR "ClrAlarm"
#define SET_STRATEGY "StratagyType"
#define SET_BMSCONN "BmsSetConnect"
#define SET_CTRLMODE "ControlMode"

/**********Compress Algorithm**********/
#define CMPLZ4 "lz4"

/***********System Parameter***********/
#define SYSPARA_ID "id"
#define SYSPARA_CAP "capacity"
#define SYSPARA_POWER "power"
#define SYSPARA_STAN "station"

/************redis database************/
#define REDIS_SERVER_IP "127.0.0.1"
#define REDIS_SERVER_PORT 6379
#define REDIS_REAL_ALARM_TABLE "realalarm" 	//实时告警表
#define REDIS_STRA_BASE "realstra" 			//实时策略表
#define REDIS_PROPARAM_BASE "proparam" 		//保护参数表
#define REDIS_SETPARAM_BASE "setparam"		//设置参数表
#define REDIS_REPOPARAM_BASE "repoparam"	//周期上报参数表
#define CMD_MAX_LENGTH 1024
#define CMD_SHORT_LENGTH 256

/*****Inter-Process Communication*****/
#define TOPIC_ALARM_REPORT "alarmReport"
#define TOPIC_PARAM_REPORT "paramreport"

#define PATH_NET_STATUS "/opt/lnxall_app/lib/dyiot/bin/fetch_port_status.sh"
#define PORT_CFG_PATH "/app/config/port_config.json"

#define MAX_ID_LEN 12
#define MAX_STA_LEN 24
#define MAX_LOADTIME_LEN 16
#define MAX_LOC_LEN 24
#define MAX_STAN_LEN 24
#define MAX_VEND_LEN 12
#define MAX_SFVER_LEN 12
#define MAX_MODEL_LEN 12
#define MAX_DATE_LEN 12
#define MAX_STRA_LEN 1024
#define TIME_STR_LEN 6
#define MAX_TIME_SEG 96 //15分钟一段，一天的策略为96段
#define MAX_TAG_LEN 24
#define MAX_NAME_LEN 64
#define MAX_TIME_LEN 24
#define MAX_PNAME_LEN 32
#define MAX_SEV_LEN 32
#define MAX_DISP_LEN 64
#define MAX_DESC_LEN 128
#define MAX_DEVTYPE_LEN 16
#define MAX_DEVDISP_LEN 32
#define SHORT_STR_LEN 16
#define REG_STR_LEN 32
#define LONG_STR_LEN 64
#define URL_STR_LEN 256
#define PORT_NAME_LEN 16

typedef enum _LOGIN_STATE
{
	STAT_IDLE = 0,
	STAT_CONNECTED,
} LOGIN_STATE;

typedef struct _sysuse_entry
{
	char cpuuse[REG_STR_LEN];
	char memuse[SHORT_STR_LEN];
	char diskuse[REG_STR_LEN];
	char extdisk[REG_STR_LEN];
	uint8_t inetcnt;
}sysuse_entry_t;

typedef struct _tagmap_entry
{
	char emmstag[MAX_TAG_LEN];
	char emsctrltag[MAX_TAG_LEN];
	UT_hash_handle hh;
}tagmap_entry_t;

typedef struct _alarm_entry_t
{
	unsigned char type;
	char tag[MAX_TAG_LEN];
	char entryname[MAX_PNAME_LEN];
	char entryDisp[MAX_DISP_LEN];
	char entryDesc[MAX_DESC_LEN];
	UT_hash_handle hh;
}alarm_entry_t;

typedef struct _set_entry_t
{
	unsigned char type;
	char sevname[MAX_SEV_LEN];
	char settag[MAX_TAG_LEN];
	char entryname[MAX_PNAME_LEN];
	char entryDisp[MAX_DISP_LEN];
	char entryDesc[MAX_DESC_LEN];
	UT_hash_handle hh;
}set_entry_t;

typedef struct _stat_entry_t
{
	unsigned char type;
	char entryname[MAX_PNAME_LEN];
	char entryDisp[MAX_DISP_LEN];
	char entryDesc[MAX_DESC_LEN];
	char entryValue[SHORT_STR_LEN];
	UT_hash_handle hh;
}stat_entry_t;

typedef struct _data_entry_t
{
	unsigned char type;
	char entryname[MAX_PNAME_LEN];
	char entryDisp[MAX_DISP_LEN];
	char entryDesc[MAX_DESC_LEN];
	UT_hash_handle hh;
}data_entry_t;

typedef struct _dev_nodestruc_t
{
	char devtype[MAX_DEVTYPE_LEN];
	char devno[MAX_DEVTYPE_LEN];
	char devdisp[MAX_DEVDISP_LEN];
	alarm_entry_t *alarmnode;
	set_entry_t *setnode; 
	stat_entry_t *statnode;
	data_entry_t *datanode;
	UT_hash_handle hh;
}dev_nodestruct_t;

typedef struct _ems_smu_emsparam_t
{

} ems_smu_emsparam;

typedef struct _ems_smu_var_t
{
	redisContext *context;  //连接redis数据库
	ipc_session_t* session; //内部broker的MQTT client，用于进程间通信
	nodes_cfg_table_t* nodes_cfg_table; //节点信息
	tagmap_entry_t* tagmaps; //emmsv2->ems ctrl的tag映射
	int controlMode;		//设置远程/本地模式 1-本地模式，也即自动模式 0-远程模式，也即手动模式
	uint lastmday;		//上一次发布策略的日期，如20240322，则此值为22
	char sn_str[SN_MAX_LEN];
	char emsctrl_sn_str[SN_MAX_LEN];
	char proc_name[PROGRAM_NAME_LEN];
	int status_timer;
	int report_timer;
    char product_name[PRODUCT_NAME_LEN];
	int seq;			//cloud
	int mi;				//ipc
	char lcid[MAX_ID_LEN];
	char lcsta[MAX_STA_LEN];
	ushort capacity;
	ushort power;
	char loadtime[MAX_LOADTIME_LEN];
	char loc[MAX_LOC_LEN];
	char staname[MAX_STAN_LEN];
	char vendor[MAX_VEND_LEN];
	char softver[MAX_SFVER_LEN];
	char model[MAX_MODEL_LEN];
	dev_nodestruct_t *devtypenode;
	cJSON *staroot;
	int dev_interval;
	LOGIN_STATE state;
	sysuse_entry_t sysuse;
} ems_smu_var_t;

extern int comm_status_poll(ems_smu_var_t *var);
extern void ems_smu_pubstra(ems_smu_var_t *var, uint tmscore);
extern void ems_smu_subdevmsg(ems_smu_var_t *var, cJSON *root);
int ems_smu_mqtt_init(ems_smu_var_t* var);
int recv_host_msg(void* obj, mqtt_message_t* mqtt_msg);
void gateway_login_msg(ems_smu_var_t *var);
#endif /* __EMS_SMU_COMMON_H */
