/*
* @fileName mqtt_dp.h
* @author gaoyang
* @date 2025-05-15 09:26
* @description 
*/
#ifndef _MQTT_DP_H
#define _MQTT_DP_H

#include "mqtt_session.h"
#include <stdint.h>

#define MQTT_DP_STATION_ID "mqtt_dp"

#define MQTT_DP_MAX_BASE_LEN       (256)
#define MQTT_DP_MAX_BASE_SHORT_LEN (128)
#define MQTT_DP_KEEP_ALIVE_MAX     (10)
#define MQTT_DP_DEFAULT_IPC_QOS    (0)

#define DEFAULT_HEARTBEAT_INTERVAL (60)
#define DEFAULT_MONITOR_INTERVAL   (60)
#define DEFAULT_CONFIG_INTERVAL    (7200)
#define DEFAULT_LC_INTERVAL       (5)

#define FUNCTION_ID_LOGIN     "Login"
#define FUNCTION_ID_HEARTBEAT "Heartbeat"
#define FUNCTION_ID_CONFIG    "Config"
#define FUNCTION_ID_MONITOR   "Monitor"
#define FUNCTION_ID_LC_INFO   "LcInfo"
#define FUNCTION_ID_UPGRADE   "Upgrade"
#define FUNCTION_ID_PROGRESS  "Progress"
#define FUNCTION_ID_OPERATION  "Active"

#define FUNCTION_TYPE_GET      "Get"
#define FUNCTION_TYPE_GETRESP  "GetResp"
#define FUNCTION_TYPE_SET      "Set"
#define FUNCTION_TYPE_SETRESP  "SetResp"
#define FUNCTION_TYPE_POST     "LcPost"
#define FUNCTION_TYPE_POSTRESP "LcPostResp"

#define MQTT_DB_CONFIG_PATH "/app/config/dp_mqtt.json"

#define MQTT_DP_TLS_CAFILE   "/app/cert/mqtt_server_cacert.pem"
#define MQTT_DP_TLS_CERTFILE "/app/cert/mqtt_client_cert.pem"
#define MQTT_DP_TLS_KEYFILE  "/app/cert/mqtt_client_key.pem"


#define UPGRADE_DOWNLOAD_DIR "/app/temp/upgrade"
#define UPGRADE_INFO_FILE    "/app/temp/upgrade/upgrade_info"

#define MQTT_OPERATION_FILE "/app/temp/operation"
#define MQTT_DP_CONFIG_TAR_DIR  "/app/temp/config"
#define MQTT_DP_CONFIG_MD5_FILE "/app/temp/config/ems_md5_"
#define MQTT_DP_UPLOAD_CONFIG_API "api/emmsv2/manager/config/upload"

#define MQTT_DP_CONFIG_SET_DIR  "/app/temp/config/set"
#define MQTT_DP_CONFIG_SET_INFO "/app/temp/config/set/info"


typedef enum
{
    MQTT_DP_CONNECTING = 0,
    MQTT_DP_LOGINING,
    MQTT_DP_DEVREPORTING,
    MQTT_DP_HEARTBEAT
} MQTT_DP_STATUS;

typedef struct mqtt_dp_param_s
{
    char host[32];
    char user[32];
    char pass[32];
    int  port;
    char up_url[128];
    int  enable_tls;
    bool disenable_lz4;
    bool operation; // 是否投运
} mqtt_dp_param_t;

typedef struct mqtt_dp_heartbeat
{
    time_t last_time;
    int    offline_count;
    int    interval;
} mqtt_dp_heartbeat_t;

typedef struct mqtt_dp_login
{
    time_t last_time;
    int backoff_count;
} mqtt_dp_login_t;

typedef struct mqtt_dp_config
{
    time_t last_time;
    int    interval;
    bool   operation;
} mqtt_dp_config_t;

#define MAX_DISK_INFO_NUM (2)

typedef struct hardware_info_t
{
    int cpu_usage;
    int mem_used;
    int mem_total;
    struct disk_info_t
    {
        char name[32];
        int  used;
        int  total;
    } disk_info[MAX_DISK_INFO_NUM];
    int disk_info_num;
    int signal;
} hardware_info_t;

typedef struct mqtt_dp_hardware_t
{
    time_t last_time;
    int    interval;
} mqtt_dp_hardware_t;

struct lc_info_t
{
    char name[32];
    char no[32];
    char ua_url[256];
    char sn[32];
    char model[32];
    char product[64];
    char version[64];
    bool is_lc;
};

typedef struct mqtt_dp_lc_list_t
{
    struct lc_info_t  ems_info;
    struct lc_info_t* lc_list;
    int    lc_num;
    time_t last_time;
    int    interval;
} mqtt_dp_lc_list_t;

typedef struct mqtt_dp_var_t
{
    char*               station_id;
    mqtt_dp_param_t     base_param;
    mqtt_session_t*     session;
    char                topic_sn[MQTT_DP_MAX_BASE_SHORT_LEN];
    pthread_t           mqtt_cycle_tid;
    uint64_t            cur_seq;
    int                 log_fd;
    MQTT_DP_STATUS      status;
    mqtt_dp_login_t     login;
    mqtt_dp_heartbeat_t heartbeat;
    mqtt_dp_config_t    config;
    mqtt_dp_hardware_t  hardware;
    mqtt_dp_lc_list_t   lc_info; // 0: cur ems,
} mqtt_dp_var_t;

typedef struct mqtt_dp_lc_upgrade_info_t
{
    char   url[256];
    char   file[256];
    char   md5[33];
    char** sn;
    char** ip;
    int    num;
} mqtt_dp_lc_t;

typedef struct mqtt_dp_upgrade_info_t
{
    mqtt_dp_lc_t** lc_info;
    int            lc_num;
    int            do_index;

    int  ems;
    char url[256];
    char md5[33];
    char file[256];

    mqtt_dp_var_t* var;
    int            seq;
    pthread_t      tid;
} mqtt_dp_upgrade_t;

typedef struct mqtt_dp_set_config_t
{
    char md5[33];
    char url[256];
    char file[256];
    char sn [32];
    int  seq;

    mqtt_dp_var_t* var;
    pthread_t     tid;
} mqtt_dp_set_config_t;

void mqtt_dp_start(void);
void mqtt_dp_lc_info_task(mqtt_dp_var_t* var, time_t now);
void mqtt_dp_heartbeat_task(mqtt_dp_var_t* var, time_t now);
void mqtt_dp_config_task(mqtt_dp_var_t* var, time_t now);
void mqtt_hardware_monitor_task(mqtt_dp_var_t* var, time_t now);
int init_mqtt_dp_lc_list(mqtt_dp_lc_list_t* lc_list);
int get_opeartion_status(char* station_id);

#endif // _MQTT_DP_H
