#ifndef __AZURE_ROCHE_COMMON_H
#define __AZURE_ROCHE_COMMON_H

/***************HEADER FILES****************/
#include <string.h>
#include <syslog.h>
#include "ipc_session.h"
#include "lnxall_list.h"
#include "dy_utils/dy_common.h"
#include "dy_utils/dy_ds.h"
#include "dy_utils/kv_array.h"
#include "dy_utils/dy_ipc.h"

#include "azure_macro_utils/macro_utils.h"
#include "azure_c_shared_utility/threadapi.h"
#include "azure_c_shared_utility/platform.h"
#include "iothub_device_client.h"
#include "iothub_client_options.h"
#include "iothub.h"
#include "iothub_message.h"
#include "parson.h"

#include "iothubtransportmqtt.h"
#include "dy_socket_server_session.h"
//#include "certs.h"

#define AZURE_ROCHE_CFG "/app/config/azure_roche_cfg.json"

/******************************************/
typedef struct
{
	int HeartbeatInterval;//Time interval for sending heatbeat message (seconds) Range: 30 – 3600 Default Value: 300
	int SensorTelemetryInterval;//设备发送传感器遥测数据（温、湿度等） 的频率（秒）Range: 30 –14400 (4 hours) Default Value: 300
	int InstrumentTelemetryInterval;//设备发送的仪器数据的频率（秒）Range: 30 –14400 Default Value: 300
	char InstrumentType[64];//cobasLink/E411
	int EnableE411DataConnection ;//1-Enable,0-Disabled
	int E411RealtimeDataInterval;//E411 实时数据获取和上传频率（秒）Range: 1-3600(1 hour) Default Value: 5
	int E411ScheduleDataInterval;//E411 非实时数据获取和上传频率（秒）Range: 60-86400(1 day)Default Value: 86400
	char EnableAxedaDataUpload[4];// string 1-Enable,0-Disabled
	char AutoRebootEnabled[4];// String 1-Enable, 0-Disabled, Default: 1
	int AutoRebootInterval;//Range: 1-100, Default: 7
	char AutoRebootTime[16];// String Default: 5:30, UTC time
}desired_config_t;

typedef struct
{
	char DeviceState[12];//Normal
	char CreatedTime[32];//datetime "2017-06-17T06:23:10.8773885Z"
	char StartupTime[32];
	char ShutdownTime[32];
	char ShutdownState[12];//Reboot/Poweroff
	char Carrier[16];//CMCC/ChinaUnion/ChinaTelecom
	char ICCID[40];//SIM Card ICCID No.
	int IsSimulatedDevice;//boolean False for device
}device_info_device_t;

typedef struct
{
	char IMEI[32];
	char Manufacturer[32];
	char ModelNumber[16];
	char SerialNumber[16];
	char FirmwareVersion[16];
	char Platform[16];
	char Processor[16];
	char InstalledRAM[8];//128MB
}device_info_system_t;

typedef struct
{
	char Name[32];//"Reboot"
	char DeliveryType[8];//0 – Command, 1 - Method
	char Version[8];//"1.0"
	char Description[32];
}device_info_support_commands_t;

typedef struct
{
	char Name[32];//Sensor name
	char DisplayName[32];//Display Text
	char Type[8];//String/number/boolean etc.
}device_info_telemetry_t;

typedef struct
{
	device_info_device_t device;
	device_info_system_t system;
	int support_commands_cnt;
	device_info_support_commands_t support_commands[0];
	int telemetry_cnt;
	device_info_telemetry_t telemetry[0];
}device_info_t;

typedef struct
{
	char sn[SN_MAX_LEN];          ///<设备SN
	int connected;
	char raw_connectionString[192]; ///<Azure IoT connectionString
	char connectionString[192]; ///<Azure IoT connectionString
	char instruments[128];
	IOTHUB_DEVICE_CLIENT_HANDLE iotHubClientHandle;
	IOTHUB_CLIENT_TRANSPORT_PROVIDER protocol;
	desired_config_t *desired_config;
	device_info_t *device_info;
	int registered;
	time_t last_register;
	char *register_string;
}azure_dev_info_t;

typedef struct
{
    list_t list;
	azure_dev_info_t azure_dev;
	time_t last_device_info;
	time_t last_heartbeat;
	time_t last_sensor;
	time_t last_instrument;
}azure_info_list_t;

typedef struct
{
    list_t list;
	int type;
    ipc_msg_t mqtt;
}data_list_t;

typedef struct
{
    list_t list;
	int len;
    char data[0];
}tcp_data_list_t;

typedef struct _connect_config_s 
{
	struct list_head list;
	socket_server_session_t socket_server;
	time_t last_send;
} connect_config_t;

typedef struct _client_info_t 
{
	struct list_head list;
	char sn[SN_MAX_LEN];
	char hostname[64];
	int port;
	int socket_fd;
	char file_name[128];
	int start;
	char status[256];
} client_info_t;

typedef struct _azure_var_t
{
    list_t node_list;
	
	int data_flag;
	int data_cnt;
	int tcp_data_cnt;
	struct list_head data_list;
	struct list_head client_list;
	struct list_head tcp_data_list;
	int link_node_cnt;

	int heartbeat_timer;
	int mqtt_list_cnt;
	list_t send_mqtt_list;
	char response_event[128];
	
	ipc_session_t *session; //内部broker的MQTT client，用于进程间通信
	socket_server_session_t socket_server;
    nodes_cfg_table_t *nodes_cfg_table; //节点信息
    template_table_t *template_table; //模板信息
    char sn_str[SN_MAX_LEN];
    char proc_name[PROGRAM_NAME_LEN];
    kv_array_t identifier_backup;
}azure_var_t;

typedef struct {
    char *dy_sn;
    char *azure_sn;
}azure_iot_sn_map_t;


#endif /* __LINKKIT_GATEWAY_COMMON_H */
