#pragma once

/**
 * @brief WireGuard key 最大长度
 */
#define WG_KEY_MAX       (64)

/**
 * @brief 操作系统最大网卡数
 */
#define NET_CARD_MAX     (32)

/**
 * @brief IP 字符串最大长度(支持IPv6)
 */
#define MAX_IP_LEN       (48)

/**
 * @brief IP 字符串最小长度
 */
#define MIN_IP_LEN       (7)

/**
 * @brief 网卡名称字符串最大长度(支持IPv6)
 */
#define MAX_NETCARD_NAME (64)

/**
 * @brief SCG 服务 ID
 * 
 */
typedef enum {
    WG_TUNNEL_SCG_ID = 3,    ///< 隧道服务
    WG_CTRL_SCG_ID   = 4     ///< 隧道控制服务
} SCG_SVR_ID;

/**
 * @brief 协议加密类型
 * 
 */
typedef enum {
    CRYPTO_NONE   = 0,    ///< 不加密
    CRYPTO_BASE64 = 1,    ///< BASE64 字符串编码
    CRYPTO_AES128 = 2,    ///< AES 128位秘钥 加密
    CRYPTO_3DES   = 3,    ///< 3DES 加密
    CRYPTO_AES256 = 4,    ///< AES 256 位秘钥加密
    CRYPTO_MAX,
} PROTO_CRYPTO_TYPE;

/**
 * @brief 日志等级
 * 
 */
enum LOG_LEVEL {
    LOG_TRACE = 0,    ///< TRACE 日志等级
    LOG_DEBUG,        ///< DEBUG 日志等级
    LOG_INFO,         ///< INFO  日志等级
    LOG_WARN,         ///< WARN  日志等级
    LOG_ERROR,        ///< ERROR 日志等级
    LOG_CRITICAL,     ///< CRITICAL 日志等级
    LOG_OFF           ///< 关闭日志
};

/**
 * @brief Hash 算法类型
 * 
 */
typedef enum {
    HASH_MD2 = 0,    ///< MD2 HASH 算法
    HASH_MD4,        ///< MD4 HASH 算法
    HASH_MD5,        ///< MD5 HASH 算法
    HASH_SHA1,       ///< SHA1 HASH 算法
    HASH_SHA256,     ///< SHA256 HASH 算法
    HASH_SHA384,     ///< SHA384 HASH 算法
    HASH_SHA512      ///< SHA512 HASH 算法
} HASH_TYPE;

/**
 * @brief 网络共享模式
 * 
 */
typedef enum {
    ICS_SHARE_MODE = 0,    ///< Internet Share Mode(ICS) 模式
    NAT_SHARE_MODE = 1     ///< Net Address Translation(NAT) 模式
} NET_SHARE_MODE;

/** 
 *
 * @brief 虚拟主机配置信息
 */
typedef struct {
    int   vmId;                     ///< 用户虚拟机 ID
    TCHAR vmName[MAX_PATH];         ///< 用户虚拟机名称
    TCHAR svrPublicKey[64];         ///< 用户服务端公钥
    TCHAR vmNetwork[MAX_IP_LEN];    ///< 用户虚拟机网络地址
    TCHAR scgGateWay[MAX_PATH];     ///< 用户服务端接入网关
    TCHAR scgTunnelGw[MAX_PATH];    ///< 用户隧道接入网关
} VM_CFG, *PVM_CFG;

/** 
 *
 * @brief 客户端用户相关配置信息
 */
typedef struct {
    int     scgCtrlAppId;              ///< 用户接入网关控制 ID
    int     scgTunnelAppId;            ///< 用户接入网关隧道 ID
    TCHAR   cliPrivateKey[64];         ///< 用户客户端私钥
    TCHAR   cliPublicKey[64];          ///< 用户客户端公钥
    TCHAR   cliAddress[MAX_IP_LEN];    ///< 用户客户端隧道IP地址
    PVM_CFG pVMConfig;                 ///< 用户虚拟机配置列表
    int     tolVM;                     ///< 用户虚拟机配置最大数
} USER_CLIENT_CONFIG, *PUSER_CLIENT_CONFIG;

typedef struct {
    int   svrListenPort;             ///< 用户服务端监听端口
    TCHAR svrPrivateKey[64];         ///< 用户服务端公钥
    TCHAR svrAddress[MAX_IP_LEN];    ///< 用户服务端隧道 IP 地址
} USER_SERVER_CONFIG, *PUSER_SERVER_CONFIG;