/*
* @fileName frpc_proxy.h
* @author gaoyang
* @date 2025-05-20 16:52
* @description 
*/
#ifndef _FRPC_PROXY_H
#define _FRPC_PROXY_H

#include "frpc_config.h"
#include <stdatomic.h>
#include <sys/types.h>
#include <cJSON.h>

#define PROXY_SERVER_MAX       5    // 最大代理通道数
#define PROXY_SERVER_KEEPALIVE 600  // 10分钟内没有报文则退出
#define PROXY_SERVER_MAX_TIME  3600 // 通道最大持续1小时
#define FRPC_INFO_START_TIME   60   // 等待获取info信息时间 最长60秒

#define CHANNEL_READ_TIMEOUT  2000 // 通道等待回复报文时间 ms
#define CHANNEL_MAX_SIZE 4096 // 通道最大报文长度
// frpc.ini配置信息

#define FRPC_CONFIG_FIFO "/tmp/ems/frpc_queue"
#define FRPC_BIN_PATH    "/usr/bin/frpc"

#define MAX_MSG_SIZE 4096

#define FRPC_CONFIG_DIR     "/tmp/ems/frpc"
#define FRPC_INFO_FILE_NAME "info"
#define FRPC_LOG_FILE_NAME  "log"
#define FRPC_PID_FILE_NAME  "pid"
#define FRPC_INI_FILE_NAME  "frpc.ini"

#define FRPC_RUNNING_STATUS "running"



typedef enum frpc_type_t
{
    FRPC_TYPE_NONE,
    FRPC_TYPE_TCP,
    FRPC_TYPE_UDP,
} frpc_type_t;

typedef enum frpc_proto_t
{
    PROXY_MODE_NONE,
    PROXY_MODE_FRAME,
    PROXY_MODE_STREAM,
    PROXY_MODE_OTHERPORT,
    PROXY_MODE_TCP2RTU,
    PROXY_MODE_OTA,
} frpc_proto_t;

typedef enum frpc_proxy_state_t
{
    FRPC_SERVER_STARTED,
    FRPC_SERVER_RUNNING,
    FRPC_SERVER_STOPING,
    FRPC_SERVER_STOPED,
} frpc_proxy_state_t;

typedef enum frpc_server_error_code
{
    FRPC_SERVER_ERROR_NONE,
    FRPC_SERVER_ERROR_DEVSTOP,
    FRPC_SERVER_ERROR_TIMEOUT,
    FRPC_SERVER_ERROR_MAX,
}frpc_server_error_code;


typedef struct channel_t channel_t;

typedef struct tcp_trans_t tcp_trans_t;

typedef struct frpc_info_t
{
    char name[64];
    char status[32];
    char local_ip[32];
    int  local_port;
    char remote_ip[32];
    int  remote_port;
} frpc_info_t;

typedef struct frpc_cfg_t frpc_cfg_t;

typedef struct mqtt_emms2_var_s mqtt_emms2_var_t;

typedef struct frpc_server_t
{
    char   dev_no[32];

    mqtt_emms2_var_t* var;
    int               sep;

    time_t start;
    time_t stop;
    time_t last;

    atomic_int   state;
    frpc_proto_t mode;
    tcp_trans_t* trans;

    char ini_path[128];
    char log_path[128];
    char info_path[128];
    char pid_path[128];

    frpc_cfg_t  frpc_cfg;
    frpc_info_t info;

    struct frpc_server_t* next;
} frpc_server_t;


int  frpc_proxy_cmd(mqtt_emms2_var_t* var, cJSON* root, int seq);

#endif
