#pragma once

#define USED_PORTMAP_TUNNEL (1)
/**
 * @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 网络连接状态
 * 
 */
typedef enum {
    STATUS_DISCONNECTED = 0,            ///< 连接已断开连接
    STATUS_CONNECTING,                  ///< 连接正在进行连接
    STATUS_CONNECTED,                   ///< 连接处于连接状态
    STATUS_DISCONNECTING,               ///< 连接正在断开连接
    STATUS_HARDWARE_NOT_PRESENT,        ///< 连接的硬件(例如网络接口卡 (NIC) )不存在
    STATUS_HARDWARE_DISABLED,           ///< 连接的硬件存在,但未启用
    STATUS_HARDWARE_MALFUNCTION,        ///< 连接的硬件中发生了故障
    STATUS_MEDIA_DISCONNECTED,          ///< 媒体(例如网络电缆)断开连接
    STATUS_AUTHENTICATING,              ///< 连接正在等待身份验证发生
    STATUS_AUTHENTICATION_SUCCEEDED,    ///< 身份验证在此连接上成功
    STATUS_AUTHENTICATION_FAILED,       ///< 此连接上身份验证失败
    STATUS_INVALID_ADDRESS,             ///< 地址无效
    STATUS_CREDENTIALS_REQUIRED,        ///< 需要安全凭据
    STATUS_ACTION_REQUIRED,             ///< 连接需要其它动作
    STATUS_ACTION_REQUIRED_RETRY,       ///< 重试连接其它动作
    STATUS_CONNECT_FAILED,              ///< 连接失败
} NET_CONNECT_STATUS;

/**
 * @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;