#pragma once
#include <spdlog/spdlog.h>
#include "common.h"

#if 0
/**
 * @brief WireGuard 配置项
 */
typedef struct {
    TCHAR wireguardPath[MAX_PATH];    ///< wireguard.exe 路径
    BOOL  wireguardExists;            ///< wireguard.exe 是否存在
    TCHAR wgPath[MAX_PATH];           ///< wg.exe 路径
    BOOL  wgExists;                   ///< wg.exe 是否存在
} WIREGUARD_CFG, *PWIREGUARD_CFG;
#endif

/**
 * @brief WireGuard 网络接口配置项
 */
typedef struct {
    TCHAR wgName[260];              ///< 网卡名称， Windows标识为 UUID
    TCHAR wgIpaddr[MAX_IP_LEN];     ///< 网卡 IP 地址
    TCHAR wgNetmask[MAX_IP_LEN];    ///< 网卡子网掩码
    TCHAR wgCfgPath[MAX_PATH];      ///< 配置文件路径
} WGINTERFACE_CFG, *PWGINTERFACE_CFG;

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

/**
 * @brief 用户信息配置
 */
typedef struct {
    TCHAR              userName[MAX_PATH];     ///< 用户名
    TCHAR              userToken[MAX_PATH];    ///< 用户访问令牌
    USER_CLIENT_CONFIG cliConfig;              ///< 用户客户端配置
    USER_SERVER_CONFIG svrConfig;              ///< 用户服务端配置
} USER_CONFIG, *PUSER_CONFIG;

/**
 * @brief SDK 全局配置项
 */
typedef struct {
    TCHAR                     platformServerUrl[MAX_PATH];    ///< 管理平台IP地址
    TCHAR                     configDirectory[MAX_PATH];      ///< 配置存放目录
    TCHAR                     systemDirectory[MAX_PATH];      ///< 操作系统目录
    TCHAR                     workDirectory[MAX_PATH];        ///< SDK 当前工作目录
    bool                      isWorkServer;                   ///< SDK 当前模式 客户端/服务端
    bool                      usedSCGProxy;                   ///< 是否启动 SCG 代理
    PROTO_CRYPTO_TYPE         proCryptoType;                  ///< 协议加密类型
    TCHAR                     proKeyBuf[256];                 ///< 协议加密秘钥
    BOOL                      enableLog;                      ///< 是否启用日志
    spdlog::level::level_enum logLevel;                       ///< 日志等级
    TCHAR                     cfgPath[MAX_PATH];              ///< 配置文件路径
    //WIREGUARD_CFG             wireguardCfg;                   ///< wireguard 配置项 @see WIREGUARD_CFG
    WGINTERFACE_CFG           wgServerCfg;                    ///< wireguard 服务端网络接口配置
    WGINTERFACE_CFG           wgClientCfg;                    ///< wireguard 客户端网络接口配置
    USER_CONFIG               userCfg;                        ///< 用户配置项
    int                       curConnVmId;                    ///< 当前连接的VM
} SDK_CONFIG, *PSDK_CONFIG;

#ifdef __cplusplus    // If used by C++ code,
extern "C" {
// we need to export the C interface
#endif

PSDK_CONFIG GetGlobalCfgInfo();

#ifdef __cplusplus
}
#endif