#pragma once

#include "ehs/Str.h"

#ifndef EHS_IPV4_HEADER
	#define EHS_IPV4_HEADER 60
#include <string>
#endif

#ifndef EHS_IPV6_HEADER
	#define EHS_IPV6_HEADER 40
#endif

#ifndef EHS_UDP_HEADER
	#define EHS_UDP_HEADER 8
#endif

#ifndef EHS_IPV4_UDP_PAYLOAD
	#define EHS_IPV4_UDP_PAYLOAD (EHS_UINT_16_MAX - EHS_IPV4_HEADER - EHS_UDP_HEADER)
#endif

#ifndef EHS_IPV6_UDP_PAYLOAD
	#define EHS_IPV6_UDP_PAYLOAD (EHS_UINT_16_MAX - EHS_IPV6_HEADER - EHS_UDP_HEADER)
#endif

namespace ehs
{
    enum class IP
    {
        V4,
    	V6
    };

    enum class ContentType
    {
        APP_MULTIPART_FORMDATA,
        APP_FORMURLENCODED,
        APP_JAVASCRIPT,
        APP_JSON,
        APP_XML,
        TEXT_PLAIN,
        TEXT_HTML,
        TEXT_XML,
        NONE
    };

	struct Endpoint
	{
		IP version = IP::V6;
		Str_8 address;
		UInt_16 port = 0;
	};

#if defined(EHS_OS_WINDOWS)
	typedef UInt_64 Socket;
	#define EHS_INVALID_SOCKET EHS_UINT_64_MAX
#elif defined(EHS_OS_LINUX)
	typedef SInt_32 Socket;
	#define EHS_INVALID_SOCKET (SInt_32)0xffffffff
#endif
}