#pragma once

#include "sccsdk.h"

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

/**
 * @brief 根据网卡 IP地址 获取网卡索引
 * @param[in] pIpAddr 网卡IP地址
 * @param[out] pIfIndex 网卡索引编号
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - -ERR_ITEM_UNEXISTS 找不到合适的网卡
 * - -ERR_UN_SUPPORT 系统不支持该操作
 * - ERR_SUCCESS 成功
 */
int GetInterfaceIfIndexByIpAddr(const TCHAR *pIpAddr, ULONG *pIfIndex);

/**
 * @brief 根据网卡 GUDI 获取网卡名称
 * @param[in] pGUID 网卡 GUID
 * @param[out] ifName 网卡名称
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - -ERR_CREATE_COMMOBJECT 创建 COM 对象失败
 * - -ERR_SYS_CALL 调用 COM 接口失败
 * - -ERR_ITEM_UNEXISTS GUID 不存在
 * - ERR_SUCCESS 成功
 */
int GetInterfaceNameByGUID(const TCHAR *pGUID, TCHAR ifName[MAX_NETCARD_NAME]);

/**
 * @brief 根据网卡名获取网卡索引
 * @param[in] pInterfaceName 网卡名称
 * @param[out] pIfIndex 网卡 Index
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_ITEM_UNEXISTS 网卡不存在
 * - -ERR_SYS_CALL 获取操作系统网卡适配器失败
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - ERR_SUCCESS 成功
 */
int GetInterfaceIfIndexByName(const TCHAR *pInterfaceName, int *pIfIndex);

/**
 * @brief 根据网卡名获取网卡 GUID
 * @param[in] ifIndex 网卡索引
 * @param[out] pGuid 网卡 GUID
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_ITEM_UNEXISTS 网卡不存在
 * - -ERR_MEMORY_STR 字符串转 GUID 结构体失败
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - ERR_SUCCESS 成功
 */
int GetInterfaceGUIDByIfIndex(const int ifIndex, GUID *pGuid);

/**
 * @brief 根据网卡名获取网卡 GUID
 * @param[in] pInterfaceName 网卡名称
 * @param[out] pGuid 网卡 GUID
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_ITEM_UNEXISTS 网卡不存在
 * - -ERR_MEMORY_STR 字符串转 GUID 结构体失败
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - ERR_SUCCESS 成功
 */
int GetInterfaceGUIDByName(const TCHAR *pInterfaceName, GUID *pGuid);

int WaitNetAdapterConnected(const TCHAR *pInterfaceName, int timeOutOfMs);

/**
 * @brief 获取网卡 NetworkCategory 是否设置为 Private 模式
 * @param[in] pInterfaceName 网卡名称
 * @param[out] pIsPrivate 网卡属性
 * - TRUE Private 模式
 * - FALSE Public 模式 
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_CREATE_COMMOBJECT 创建 COM 对象失败
 * - -ERR_SYS_CALL 调用 COM 接口失败
 * - -ERR_ITEM_UNEXISTS 当前网络接口不存在不存在
 * - -ERR_MEMORY_STR 字符集转换失败
 * - ERR_SUCCESS 成功
 */
int GetNetConnectionNetworkCategory(const TCHAR *pInterfaceName, bool *pIsPrivate);

/**
 * @brief 启动/停止 Windows 网络共享服务
 * @param[in] ifIndex 网卡索引
 * @param[in] isEnable 启动/停止 Windows 网络共享服务
 * - TRUE 启动服务
 * - FALSE 停止服务
 * @param[in] isSetPrivate 共享连接属性
 * -TRUE 私有连接
 * -FALSE 公共连接
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_CREATE_COMMOBJECT 创建 COM 对象失败
 * - -ERR_SYS_CALL 调用 COM 接口失败
 * - -ERR_ITEM_UNEXISTS GUID 不存在
 * - -ERR_NET_UNCONNECT 网络未连接
 * - ERR_SUCCESS 成功
 */
int SetNetIntelnetConnectionSharing(int ifIndex, bool isEnable, bool isSetPrivate);

/**
 * @brief 获取当前网络共享服务状态
 * @param[in] ifIndex 网卡名称索引
 * @param[out] pIsEnable 当前网络共享服务状态
 * - TRUE 启动
 * - FALSE 停止
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_CREATE_COMMOBJECT 创建 COM 对象失败
 * - -ERR_SYS_CALL 调用 COM 接口失败
 * - -ERR_ITEM_UNEXISTS GUID 不存在
 * - -ERR_NET_UNCONNECT 网络未连接
 * - -ERR_CALL_COMMOBJECT 获取网络共享状态失败
 * - ERR_SUCCESS 成功
 */
int GetNetIntelnetConnectionSharing(int ifIndex, bool *pIsEnable);
/**
 * @brief 设置网卡为 Private/Public 模式
 * @param[in] pInterfaceName pInterfaceName 网卡名称
 * @param[in] isPrivate 网卡 Category 模式
 * - TRUE Private 模式
 * - FALSE Public 模式
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - -ERR_PROCESS_RETURN 系统调用执行结束返回失败
 * - ERR_SUCCESS 成功
 */
int SetNetConnectionNetworkCategory(const TCHAR *pInterfaceName, const bool isPrivate);

/**
 * @brief 添加系统路由表项 
 * @param[in] pIP 目的 IP 地址
 * @param[in] pMask 目的子网掩码
 * @param[in] pGateway 路由网关
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_UN_SUPPORT IP地址转网络字节序网络地址失败
 * - -ERR_NET_ADD_ROUTE 添加路由表项失败
 * - -ERR_NET_REMOVE_ROUTE 删除路由表项失败
 * - ERR_SUCCESS 成功
 */
int AddRouteTable(const char *pIP, const char *pMask, const char *pGateway);

/**
 * @brief 开启 Windows WireGuard NAT 转发功能
 * @param[in] pInterfaceName 网卡名称
 * @param[in] pCidrIpaddr CIDR 网络接口地址
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - -ERR_PROCESS_RETURN 系统调用执行结束返回失败
 * - ERR_SUCCESS 成功
 */
int SetNATRule(const TCHAR *pInterfaceName, const TCHAR *pCidrIpaddr);

/**
 * @brief 关闭 Windows WireGuard NAT 转发功能
 * @param pInterfaceName 网卡名称
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - -ERR_PROCESS_RETURN 系统调用执行结束返回失败
 * - ERR_SUCCESS 成功
 */
int RemoveNATRule(const TCHAR *pInterfaceName);

#if 0
/**
 * @brief 设置网络接口IP地址
 * @param[in] pInterfaceName 网卡名称
 * @param[in] pIpaddr IP 地址
 * @param[in] pNetmask 子网掩码
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - ERR_SUCCESS 成功
 */
 int  SetInterfaceIpAddress(const TCHAR *pInterfaceName, const TCHAR *pIpaddr, const TCHAR *pNetmask);

/**
 * @brief 获取Windows Hyper-V 虚拟机状态， 必须开启后才能开启NAT转发功能
 * @param[out] pEnabled 当前 Hyper-V 虚拟机状态, TRUE 表示开启, FALSE 表示关闭
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - ERR_SUCCESS 成功
 */
 int  GetWindowsHyperVStatus(int *pEnabled);

/**
 * @brief 启用/禁用 Windows Hyper-V 功能
 * @param[in] enabled TRUE 启用, FALSE 关闭
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - -ERR_PROCESS_RETURN 系统调用执行结束返回失败
 * - ERR_SUCCESS 成功
 */
 int  EnableWindowsHyperV(bool enabled);

/**
 * @brief 设置网卡为 Private/Public 模式
 * @param[in] pInterfaceName 网卡名称
 * @param[in] isPrivate
 * - TRUE Private 模式
 * - FALSE Public 模式
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - -ERR_PROCESS_RETURN 系统调用执行结束返回失败
 * - ERR_SUCCESS 成功
 */
 int  SetInterfacePrivate(const TCHAR *pInterfaceName, bool isPrivate);

/**
 * @brief 获取网卡 NetworkCategory 是否设置为 Private 模式
 * @param[in] pInterfaceName 网卡名称
 * @param[out] pIsPrivateMode 网卡属性
 * - TRUE Private 模式
 * - FALSE Public 模式 
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_ITEM_UNEXISTS 设备不存在
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - -ERR_PROCESS_RETURN 系统调用执行结束返回失败
 * - ERR_SUCCESS 成功
 */
 int  IsInterfacePrivate(const TCHAR *pInterfaceName, bool *pIsPrivateMode);

/**
 * @brief 获取网卡接口索引编号
 * @param[in] pInterfaceName 网卡名称
 * @param[out] pIndex 网卡索引
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - ERR_SUCCESS 成功
 */
 int  GetInterfaceIndexByName(const TCHAR *pInterfaceName, int *pIndex);

/**
 * @brief 删除接口网络地址
 * @param[in] pInterfaceName 网卡名称
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - ERR_SUCCESS 成功
 */
 int  RemoveInterfaceIpAddress(const TCHAR *pInterfaceName);

/**
 * @brief 设置网络接口IP地址
 * @param[in] pInterfaceName 网卡名称
 * @param[in] pCidrIpaddr CIDR类型IP地址
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - ERR_SUCCESS 成功
 */
 int  SetInterfaceIpAddressFromCIDR(const TCHAR *pInterfaceName, const TCHAR *pCidrIpaddr);

/**
 * @brief 设置网络接口IP地址
 * @param[in] pInterfaceName 网卡名称
 * @param[in] pIpaddr IP 地址
 * @param[in] pNetmask 子网掩码
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MALLOC_MEMORY 分配内存失败
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - ERR_SUCCESS 成功
 */
 int  SetInterfaceIpAddress(const TCHAR *pInterfaceName, const TCHAR *pIpaddr, const TCHAR *pNetmask);


/**
 * @brief 获取网络连接NAT功能是否开启
 * @param[in] pInterfaceName 网卡名称
 * @param[out] pIsEnabled 网卡NAT当前是否开启
 * - TRUE NAT 开启
 * - FALSE NAT 关闭
 * @return 函数执行结果 0: 成功， 小于0 失败 @see USER_ERRNO
 * - -ERR_INPUT_PARAMS 输入参数错误
 * - -ERR_MEMORY_STR 字符串处理
 * - -ERR_ITEM_UNEXISTS 设备不存在
 * - -ERR_CALL_SHELL 调用系统命令行失败
 * - -ERR_PROCESS_RETURN 系统调用执行结束返回失败
 * - ERR_SUCCESS 成功
 */
 int  IsNetConnectionSharingEnabled(const TCHAR *pInterfaceName, bool *pIsEnabled);

/**
 * @brief  WireGuard 服务 Windows PowerShell 自定义命令是否安装
 * @return
 * - TRUE 已经安装
 * - FALSE 未安装
 */
 bool  IsCustomNatPSCmdInstalled();
#endif
#ifdef __cplusplus
}
#endif