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

#include <winsock2.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 {
    TCHAR              userName[MAX_PATH];     ///< 用户名
    TCHAR              userToken[MAX_PATH];    ///< 用户访问令牌
    USER_CLIENT_CONFIG cliConfig;              ///< 用户客户端配置
    USER_SERVER_CONFIG svrConfig;              ///< 用户服务端配置
} USER_CONFIG, *PUSER_CONFIG;

typedef struct {
    TCHAR  targetIp[MAX_IP_LEN];
    UINT16 targetPort;
    UINT16 proxyPort;
    UINT16 scgGwPort;
    TCHAR  scgIpAddr[MAX_IP_LEN];
    SOCKET udpProxySock;
    SOCKET scgGwSock;
    HANDLE hProxyTunnelThread;
    HANDLE hProxySCGThread;
    bool   exitNow;
} SCG_PROXY_INFO, *PSCG_PROXY_INFO;

/**
 * @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 当前模式 客户端/服务端
    PROTO_CRYPTO_TYPE         proCryptoType;                  ///< 协议加密类型
    TCHAR                     proKeyBuf[256];                 ///< 协议加密秘钥
    BOOL                      enableLog;                      ///< 是否启用日志
    spdlog::level::level_enum logLevel;                       ///< 日志等级
    TCHAR                     cfgPath[MAX_PATH];              ///< 配置文件路径
    WGINTERFACE_CFG           wgServerCfg;                    ///< wireguard 服务端网络接口配置
    WGINTERFACE_CFG           wgClientCfg;                    ///< wireguard 客户端网络接口配置
    USER_CONFIG               userCfg;                        ///< 用户配置项
    SCG_PROXY_INFO            scgProxy;                       ///< SCG UDP 代理信息
    int                       curConnVmId;                    ///< 当前连接的VM
    TCHAR                     clientId[MAX_PATH];             ///< 客户端验证签名 ID
    TCHAR                     clientSecret[MAX_PATH];         ///< 客户端验证签名秘钥
} 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