/// @addtogroup httpclient HTTPClient
/// @brief NWNX HTTPClient
/// @{
/// @file nwnx_httpclient.nss

const string NWNX_HTTPClient = "NWNX_HTTPClient"; ///< @private

/// @name Request Types
/// @anchor request_types
///
/// @{
const int NWNX_HTTPCLIENT_REQUEST_METHOD_GET     = 0;
const int NWNX_HTTPCLIENT_REQUEST_METHOD_POST    = 1;
const int NWNX_HTTPCLIENT_REQUEST_METHOD_DELETE  = 2;
const int NWNX_HTTPCLIENT_REQUEST_METHOD_PATCH   = 3;
const int NWNX_HTTPCLIENT_REQUEST_METHOD_PUT     = 4;
const int NWNX_HTTPCLIENT_REQUEST_METHOD_OPTION  = 5;
const int NWNX_HTTPCLIENT_REQUEST_METHOD_HEAD    = 6;
///@}

/// @name Content Types
/// @anchor content_types
///
/// @{
const int NWNX_HTTPCLIENT_CONTENT_TYPE_HTML            = 0;
const int NWNX_HTTPCLIENT_CONTENT_TYPE_PLAINTEXT       = 1;
const int NWNX_HTTPCLIENT_CONTENT_TYPE_JSON            = 2;
const int NWNX_HTTPCLIENT_CONTENT_TYPE_FORM_URLENCODED = 3;
const int NWNX_HTTPCLIENT_CONTENT_TYPE_XML             = 4;
///@}

/// @name HTTP Authentication Types
/// @anchor auth_types
///
/// @{
const int NWNX_HTTPCLIENT_AUTH_TYPE_NONE         = 0;
const int NWNX_HTTPCLIENT_AUTH_TYPE_BASIC        = 1;
const int NWNX_HTTPCLIENT_AUTH_TYPE_DIGEST       = 2;
const int NWNX_HTTPCLIENT_AUTH_TYPE_BEARER_TOKEN = 3;
///@}

/// A structure for an HTTP Client Request
struct NWNX_HTTPClient_Request
{
    int nRequestMethod; ///< A @ref request_types "Request Type"
    string sTag; ///< A unique tag for this request
    string sHost; ///< The host domain name/IP address
    string sPath; ///< The path for the url (include the leading /)
    string sData; ///< The data being sent
    int nContentType; ///< A @ref content_types "Content Type"
    int nAuthType; ///< An @ref auth_types "Authentication Type"
    string sAuthUserOrToken; ///< The authentication username or token
    string sAuthPassword; ///< The authentication password (ignored if just using a token)
    int nPort; ///< The host port
    string sHeaders; ///< Pipe (|) delimited header pairs, e.g. "User-Agent: My NWNX HTTP Client|Accept: application/vnd.github.v3+json"
};

/// @brief Sends an http method to the given host.
/// @param s The structured NWNX_HTTPClient_Request information.
/// @return A unique identifier for the request for later access in the REQUEST_ID event data.
int NWNX_HTTPClient_SendRequest(struct NWNX_HTTPClient_Request s);

/// @brief Returns an NWNX_HTTP_Client_Request structure
/// @param nRequestId The request id returned from NWNX_HTTPClient_SendRequest()
/// @return The structured NWNX_HTTPClient_Request information
struct NWNX_HTTPClient_Request NWNX_HTTPClient_GetRequest(int nRequestId);

/// @}

int NWNX_HTTPClient_SendRequest(struct NWNX_HTTPClient_Request s)
{
    NWNXPushString(s.sHeaders);
    NWNXPushInt(s.nPort);
    NWNXPushString(s.sAuthPassword);
    NWNXPushString(s.sAuthUserOrToken);
    NWNXPushInt(s.nAuthType);
    NWNXPushString(s.sData);
    NWNXPushInt(s.nContentType);
    NWNXPushString(s.sPath);
    NWNXPushString(s.sHost);
    NWNXPushInt(s.nRequestMethod);
    NWNXPushString(s.sTag);
    NWNXCall(NWNX_HTTPClient, "SendRequest");
    return NWNXPopInt();
}

struct NWNX_HTTPClient_Request NWNX_HTTPClient_GetRequest(int nRequestId)
{
    NWNXPushInt(nRequestId);
    NWNXCall(NWNX_HTTPClient, "GetRequest");

    struct NWNX_HTTPClient_Request s;

    s.sTag             = NWNXPopString();
    s.nRequestMethod   = NWNXPopInt();
    s.sHost            = NWNXPopString();
    s.sPath            = NWNXPopString();
    s.nContentType     = NWNXPopInt();
    s.sData            = NWNXPopString();
    s.nAuthType        = NWNXPopInt();
    s.sAuthUserOrToken = NWNXPopString();
    s.sAuthPassword    = NWNXPopString();
    s.nPort            = NWNXPopInt();
    s.sHeaders         = NWNXPopString();

    return s;
}