#pragma once

#include "ehs/Serializer.h"

namespace ehs
{
	enum class NetStatus : UInt_8
	{
		DISCONNECTED,
		ACTIVE,
		PENDING,
		QUEUED
	};

	enum class NetChannelType : UInt_8
	{
		SERVER,
		CLIENT
	};

	struct Header
	{
		Version version = {};
		UInt_64 encId = 0;
		Version encVer = {};
		UInt_64 channelId = 0;
		NetChannelType channelType = NetChannelType::SERVER;
		Version channelVer = {};
		UInt_64 id = 0;
		UInt_64 fragmentCount = 0;
		UInt_64 fragment = 0;
		bool ensure = false;
		Char_8 token[64] = {};
		UInt_64 systemId = 0;
		UInt_64 opId = 0;
	};

	void WriteHeader(const Header &header, Serializer<UInt_64> &data);

	Header ReadHeader(Serializer<UInt_64> &data);

	struct Packet
	{
		Header header;
		Serializer<UInt_64> payload;
	};

    struct Insurance
    {
        Header header;
        Serializer<UInt_64> payload;
        float lastResend;
    };
}

#ifndef EHC_IPV4_PAYLOAD
	#define EHC_IPV4_PAYLOAD (EHS_IPV4_UDP_PAYLOAD - (UInt_16)sizeof(Header))
#endif

#ifndef EHC_IPV6_PAYLOAD
	#define EHC_IPV6_PAYLOAD (EHS_IPV6_UDP_PAYLOAD - (UInt_16)sizeof(Header))
#endif