#ifndef __CLOUD_MQTT_COMMON_H
#define __CLOUD_MQTT_COMMON_H

/***************HEADER FILES****************/
#include <string.h>
#include <syslog.h>
#include "dy_utils/dy_mqtt.h"
#include "dy_utils/dy_list.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 "das-link.h"

#define CLOUD_DASLINK_CFG   "/app/config/daslink/uplink_channels.json"

#define MAX_UPLINK_CHANNEL_CNT 8
struct _cloud_mqtt_var_s;

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

typedef enum
{
    LOGIN_PASS = 0,
    LOGIN_REFUSE = 501,
} login_result_code;

typedef struct
{
    int serial_num;
    time_t timestamp;
    login_result_code error_code;
} login_info_t;

typedef struct
{
    char *pub_topic;
    char *sub_topic;
    int interval; //如果不需要周期发送则设置interval为0
    char *payload;
    int last_ts;
    int mi;
} cloud_mqtt_hb_login_msg_t;

typedef struct
{
    char *internal_topic;
    char *external_topic;
} topic_pair_t;

typedef struct
{
    int uplink_cnt;
    topic_pair_t *uplink;
    int downlink_cnt;
    topic_pair_t *downlink;
} topic_maps_t;

typedef struct
{
    list_t list;
    daslink_params_info_t daslink_params;
	char port[64];
}daslink_params_list_t;

typedef struct
{
    mqtt_session_t* session;           //外部broker的MQTT client，用于连接云平台
    dy_db_session_t *db_session; //用于操作DB的会话
    struct _cloud_mqtt_var_s *var; //上层数据
    cloud_mqtt_hb_login_msg_t heart_beat;
    cloud_mqtt_hb_login_msg_t login;
    topic_maps_t topic_maps;
    COMM_STATUS_E comm_status;
    unsigned int heart_beat_lost_cnt;
    int resume;                  ///<断点续传，1 开启断点续传  0 关闭断点续传

	char	addr[MAX_HOST_LEN];		///<地址
    unsigned short port;            ///<端口
    char	user[MAX_USER_LEN];		///<用户名
    char	pass[MAX_PASS_LEN];		///<密码地址
    char thing_id[64];                     // thing id
    char device_id[64];                    // device id
    char device_secret[64];                // device secret

	int connect_status;
	daslink_params_info_t params;
} channel_t;

typedef struct _cloud_mqtt_var_s
{
    mqtt_session_t* session; //内部broker的MQTT client，用于进程间通信
    nodes_cfg_table_t* nodes_cfg_table; //节点信息
    list_t node_list;
    char sn_str[SN_MAX_LEN];
    char proc_name[PROGRAM_NAME_LEN];
    int status_poll_timer;
    int report_timer;
    int channel_cnt;
    channel_t channel[MAX_UPLINK_CHANNEL_CNT]; //上行通道
    int daslink_channel_cnt;
    channel_t daslink_channel[MAX_UPLINK_CHANNEL_CNT]; //上行通道
} cloud_mqtt_var_t;

extern int cloud_mqtt_load_cfg(cloud_mqtt_var_t *var, const char *cfg);
extern int cloud_mqtt_internal_mqtt_init(cloud_mqtt_var_t *var);
extern int recv_cloud_mqtt_msg(void *obj, mqtt_message_t *mqtt_msg);
extern int cloud_daslink_channel_create(cloud_mqtt_var_t *var);
extern int daslink_message_produce(channel_t *channel, char *topic, char *payload, int payloadLen);

#endif /* __CLOUD_MQTT_COMMON_H */
