#ifndef __NORTH_MQTT_H
#define __NORTH_MQTT_H

/***************HEADER FILES****************/
#include <string.h>
#include <syslog.h>
#include "ipc_session.h"
#include "lnxall_list.h"
#include "mqtt_session.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 "../automatic_north/north_automatic.h"

#define N_MAXEPOLLSIZE 3

#define LZ4_N 0
#define MAX_UPLINK_CHANNEL_CNT 8

#define DEFAULT_QOS 1
#define KEEPALIVEINTERVAL 60
#define CABNO_INTERVAL 300

#define N_MQTT_NORTH_MAP_FILE "/app/config/north/mqtt_north_map.json"
#define N_MQTT_NORTH_CFG_FILE "/app/config/north/mqtt_north_cfg.json"
#define N_NORTH_ALL_PLAN_FILE "/app/config/north/mqtt_north_plan.json"

#define N_CLOUD_MQTT_TLS_FILE_PATH "/app/config/north/mqtt_tls/cloud_mqtt" //>暂时不用

#define REPORT_INTERVAL 300
#define CHANNEL_NAME 128

#define North_Get "Get"
#define North_Set "Set"
#define North_GetRsp "GetRsp"
#define North_SetRsp "SetRsp"
#define North_Post "Post"
#define North_PostRsp "PostRsp"

#define FUNCTION_LOGIN "Login"
#define FUNCTION_HeartBeat "HeartBeat"
#define FUNCTION_PeriodReport "PeriodReport"
#define FUNCTION_DevData "DevData"
#define FUNCTION_AlarmReport "AlarmReport"
#define FUNCTION_AllAlarm "AllAlarm"
#define FUNCTION_EmsSet "EmsSet"
#define FUNCTION_SCHEDULE "Schedule"

#define NORTH_CHANNEL_CONRTOL_CNT   10

typedef enum
{
    ERROR = 0,
    SUCCESS,
}N_RESPONSE_RESULT;

/*
 * MQTT SESSION
 * */
/*
typedef enum _mqtt_state
{
    MQTT_CONNECTING,   // 正在连接
    MQTT_CONNECTED,    // 已连接
    MQTT_DISCONNECTED, //主动断开连接
} mqtt_state_e; */
	

typedef enum _COMM_STATUS_E
{
    COMM_STATUS_IDLE = 0,   //未连接
    COMM_STATUS_CONNECTING, //连接中
    COMM_STATUS_CONNECTED,  //已连接
    COMM_STATUS_LOGIN,      //已经登录
} COMM_STATUS_E;

typedef enum
{
    NOALARM = 0,
	ALARM,
} ALARM_CODE;

typedef enum
{
    LOGIN_REFUSE = 0,
	LOGIN_PASS = 1,
} login_result_code;

typedef struct
{
    int serial_num;
    time_t timestamp;
    login_result_code error_code;
} login_info_t;

typedef struct
{
    int last_ts;
    int mi;
} north_mqtt_hb_login_msg_t;

typedef enum
{
    LINK_TYPE_MQTT = 0,
    LINK_TYPE_KAFKA,
} link_type_e;

struct mqt_north_var_s;

typedef struct
{
    mqtt_session_t *session;
	struct mqt_north_var_s *var; //上层数据
    north_mqtt_hb_login_msg_t heart_beat;
    north_mqtt_hb_login_msg_t login;

    unsigned int heart_beat_lost_cnt;
    // int resume; ///<断点续传，1 开启断点续传  0 关闭断点续传（暂时不用）
    link_type_e type;

    char addr[MAX_HOST_LEN]; ///<地址
    unsigned short port;     ///<端口
    char user[MAX_USER_LEN]; ///<用户名
    char pass[MAX_PASS_LEN]; ///<密码地址

	int lz4;
    int enable;
    int index;
    bool connect_flag;
    char name[CHANNEL_NAME];
	// int AutoRec;
	// int AutoRecInterval;
    COMM_STATUS_E comm_status;
} mqt_north_channel_t;

typedef struct
{
	char name[TAG_NAME_LEN];
	int data_type;   // 0 int 1 float
	int property;    // 0 realdata;	1 system; 2 alarm
	int cur_alarm;
	int report_flag; // 0 未上报   1 上报过
} mqt_north_tag_t;

typedef struct
{
    char no[DEV_NO_LEN];
    char disp_name[DEV_NAME_LEN];
	int realdata_num;
	mqt_north_tag_t *realdata_tags[TAG_NUM];
	int alarm_num;
	mqt_north_tag_t *alarm_tags[TAG_NUM];
	int last_ts;
} mqt_north_dev_t;

typedef struct
{    
	char *class_type; //类 类型
	char name[CLASS_NAME_LEN];
	int interval;
	int num;
	mqt_north_dev_t *mqt_north_dev[DEV_NUM];
} mqt_north_class_t;

typedef struct mqt_north_var_s
{
    char sn_str[SN_MAX_LEN];
	char protocol[32];
	char cab_id[256];
	char cab_station_name[128]; //<站点名称
	int channel_cnt;
    mqt_north_channel_t channel[MAX_UPLINK_CHANNEL_CNT];
	int status_poll_timer;
    int report_timer;
	int num;
    int heart_beat;
    int login;
    bool control_change;
    unsigned long long mi;
    time_t cabno_report;
	mqt_north_class_t *mqt_north_class[CLASS_NUM];
} mqt_north_var_t;

int common_north_mqtt_Init(void);
mqt_north_var_t *get_mqt_north_var(void);


#endif /* __CLOUD_gw_H */

