#ifndef __CLOUD_EMMSV2_COMMON_H
#define __CLOUD_EMMSV2_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>
/******************************************/

#define EMMSV2_SERVER_CONFIG "/app/config/emmsv2_config.json"
#define EMMSV2_STATION_CONFIG "/app/config/stacfg.json"
#define EMMSV2_TAGMAP_CONFIG "/app/config/emstag"
/*
* topic格式 {PLATFORM}/{ACTION}/{LC_SN}/{FUNC ID}(可选 /{lz4}) 
* 如 emms2/LcPost/218800000001/Login/lz4
*/
/*****************PLATFORM****************/
#define PLATFORM "emms2"

/******************ACTION*****************/
#define MAX_ACT_LEN 16
#define LCPOST "LcPost"
#define LCPOSTRSP "LcPostResp"
#define EMMSGET "Get"
#define EMMSGETRSP "GetResp"
#define EMMSSET "Set"
#define EMMSSETRSP "SetResp"

/****************FUNC ID*****************/
#define MAX_FUNC_LEN 24
#define FUNC_LOGIN "Login"
#define FUNC_HB "HeartBeat"
#define FUNC_DEVI "DeviceInfo"
#define FUNC_SCHED "Schedule"
#define FUNC_TELM "Telemetry"
#define FUNC_TELC "Telecontrol"
#define FUNC_SUBTELM "SubTelemetry"
#define FUNC_SUBTELC "SubTelecontrol"
#define FUNC_ALARMDIS "AlarmDisable"
#define FUNC_ALARM "Alarm"
#define FUNC_ALLALARM "AllAlarm"
#define FUNC_DASHBOARDCTRL "DashboardCtrl"
#define FUNC_DASHBOARDDATA "DashboardData"

/**************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_SOCSET "socset"
#define SET_DO5 "DO5"
#define SET_DO6 "DO6"
#define SET_PCSRST "pcsrst"
#define SET_CTRLMODE "ControlMode"

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

/************redis database***********/
#define REDIS_SERVER_IP "127.0.0.1"
#define REDIS_SERVER_PORT 6379

//实时告警表，哈希表
#define REDIS_REAL_ALARM_TABLE "realalarm" 	

//实时策略表，有序集，将yyyy-mm-dd格式的日期转换成yyyymmdd的整型数据后作为有序集的分数，存入
#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

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

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

#define SHORT_STR_LEN 8
#define MID_STR_LEN 16
#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 DEF_DB_TIMEOUT 60	//大屏数据推送默认时间
#define DEF_DB_PERIOD 5		//大屏数据推送默认周期
 
typedef struct _tagmap_entry
{
	char emmstag[MAX_TAG_LEN];
	char emsctrltag[MAX_TAG_LEN];
	UT_hash_handle hh;
}tagmap_entry_t;

typedef enum _COMM_STATUS_E
{
	COMM_STATUS_IDLE = 0,    //未连接
	COMM_STATUS_CONNECTING,              //连接中
	COMM_STATUS_CONNECTED,               //已连接
	COMM_STATUS_LOGIN,                    //已经登录
} COMM_STATUS_E;

typedef struct _cloud_conn_var_s
{
	redisContext *context;  //连接redis数据库
	mqtt_session_t* session_cloud; //外部broker的MQTT client，用于连接EMMSv2云平台
	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];
	COMM_STATUS_E comm_status;	//进程与emms平台的连接状态
	int status_timer;
	int report_timer;
	int heartbeat_interval; // 向emms平台发送心跳的间隔
	int emsctrl_interval; // 上报ems遥测数据的间隔
	int dev_interval;  // 上报设备遥测数据的间隔
    char product_name[PRODUCT_NAME_LEN];
	int seq;			//到emms平台的序列号
	int mi;				//ipc消息的mi
	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];
	char protocolVer[SHORT_STR_LEN];
	int mode;		 //0:对等模式;1:主从模式;2:优化器模式
	char tenant_id[MID_STR_LEN];	//租户id
	time_t db_endtime;	//大屏上报时间
	int db_period;		//大屏上报周期
} cloud_emmsv2_var_t;

extern int comm_status_poll(cloud_emmsv2_var_t* var);
extern void cloud_emmsv2_pubstra(cloud_emmsv2_var_t *var, uint tmscore);
extern void cloud_emmsv2_pubdevinfo(cloud_emmsv2_var_t *var);
extern void cloud_emmsv2_subdevmsg(cloud_emmsv2_var_t *var, cJSON *root);
extern void cloud_emmsv2_pubalarm(cloud_emmsv2_var_t *var, cJSON *msgs);
extern void timer_dashboard_report(cloud_emmsv2_var_t *var);
int cloud_emmsv2_mqtt_init(cloud_emmsv2_var_t* var);
int cloud_emmsv2_internal_mqtt_init(cloud_emmsv2_var_t* var);
int recv_host_msg(void* obj, mqtt_message_t* mqtt_msg);
void refuse_master_server(cloud_emmsv2_var_t* var);
int data_report_poll(cloud_emmsv2_var_t* var);
void gateway_login_msg(cloud_emmsv2_var_t *var);
#endif /* __CLOUD_EMMSV2_COMMON_H */
