#ifndef __UA_MQTTV1_H
#define __UA_MQTTV1_H

#include <syslog.h>
#include <pthread.h>
#include <poll.h>
#include "ipc_session.h"
#include "dy_utils/dy_common.h"
#include "dy_utils/dy_pp.h"
#include "dy_utils/dy_ipc.h"
#include "dy_utils/dy_ds.h"
#include "dy_utils/period_service.h"
#include "dy_utils/uthash/uthash.h"

#include "open62541.h"
/*
#include <open62541/client_config_default.h>
#include <open62541/client_highlevel.h>
#include <open62541/client_subscriptions.h>
#include <open62541/plugin/log_stdout.h>
*/
#include <hiredis/hiredis.h>

#include "lnxall_ubuslog.h"

#define MAX_L1_NODES 20
#define MAX_L2_NODES 10
#define MAX_L3_NODES 500
#define MAX_L4_NODES 1000

#define REDIS_DATA_U8 1
#define REDIS_DATA_U16 2
#define REDIS_DATA_I16 3
#define REDIS_DATA_U32 4
#define REDIS_DATA_I32 5
#define REDIS_DATA_F32 6

#define MAX_DEV_NUM 128
#define DEV_SN_LEN 32
#define CMD_MAX_LENGTH 256
#define TAG_MAX_LENGTH 32
#define SERV_MAX_LENGTH 8
#define MAX_DEVTYPE_LEN 24
#define MAX_USR_LEN 32
#define MAX_PWD_LEN 32
#define MAX_STA_LEN 24
#define MAX_STANO_LEN 24
#define MAX_URL_LEN 128
#define REDIS_SERVER_IP "127.0.0.1"
#define REDIS_SERVER_PORT 6379
#define SERV_STATUS "STATUS"
#define SERV_DATA "DATA"
#define SERV_ALARM "ALARM"
#define SERV_SETTING "SETTING"

#define UA_SETPTS "UA_SETPTS"

#define FOLDER_SYSTEM "System"
#define SYSTEM_ABOUT "About"
#define SYSTEM_CONFIG "Config"
#define SYSTEM_STANO "StationNo"
#define SYSTEM_STANAME "station_name"
#define SYSTEM_CNTID "id"

#define UA_MQTTV1_DEVTYPE "/app/config/ua_mqttv1/devtype"
#define UA_MQTTV1_CFG_PATH "/app/config/ua_mqttv1/ua_mqttv1_cfg.json"
#define CERTFILE "/app/config/ua_mqttv1/client_cert.der"
#define KEYFILE "/app/config/ua_mqttv1/client_key.pem"

typedef struct _dev_entry dev_entry_t;

typedef struct _devtype_t
{
    char typenam[MAX_DEVTYPE_LEN];
    int addr;
    UT_hash_handle hh;
}devtype_t;

typedef struct _devdata_t
{
    UA_NodeId nodeId;
    char datatag[TAG_MAX_LENGTH];
    int addr;
    ushort dtype;
    UT_hash_handle hh;
}devdata_t;

typedef struct _devserv_t
{
    UA_NodeId nodeId;
    char service[SERV_MAX_LENGTH];
    devdata_t *devdata;
    dev_entry_t *dev;
    int datanum;
}devserv_t;

typedef struct _dev_entry
{
    char devsn[DEV_SN_LEN]; 
    char devtype[MAX_DEVTYPE_LEN];
    int dev_no;
    int common_addr;
    int ycaddr;
    int yxaddr;
    int modbus_addr;
    devserv_t statserv; //STATUS 状态
    devserv_t dataserv; //DATA 读数据服务
    devserv_t alarmserv; //ALARM 告警
    devserv_t setserv;  //SETTING 设置参数服务
} dev_entry_t;

typedef struct _dev_table
{
    dev_entry_t devtab[MAX_DEV_NUM];
    int devcount;
} dev_table_t;

typedef struct __ua_mqttv1_var_t
{
    redisContext *redisContext;
    redisContext *subContext;
    UA_Client *client;
    int ua_sync_timer;  
    unsigned char proto;    //1-iec104/mqtt ; 2-modbus
    int syncinterval; //in seconds
    char endpointUrl[MAX_URL_LEN];
    char usrname[MAX_USR_LEN];
    char userpass[MAX_PWD_LEN];
    devtype_t *devtypes; //all devtype configuration
    dev_table_t dev_table;
    char ccsn[DEV_SN_LEN];
    char staname[MAX_STA_LEN];
    char stano[MAX_STANO_LEN];
}ua_mqttv1_var_t;

#endif /* __UA_MQTTV1_H */