#ifndef GAMELOGIC_GENERAL_PROTOCOLS_H
#define GAMELOGIC_GENERAL_PROTOCOLS_H

#include <CustomNetProtocol.h>
#include "ProtocolIdentificationID.h"

namespace GameLogic
{
	struct Protocol_General_Status :public Oyster::Network::CustomProtocolObject
	{
		enum States
		{
			States_ready,
			States_idle,
			States_disconected,
			States_leave
		};
		States status;
	
		Protocol_General_Status()
		{
			this->protocol[0].value = protocol_General_Status;
			this->protocol[0].type = Oyster::Network::NetAttributeType_Short;

			this->protocol[1].type = Oyster::Network::NetAttributeType_Short;
		}
		Protocol_General_Status(States state)
		{
			this->protocol[0].value = protocol_General_Status;
			this->protocol[0].type = Oyster::Network::NetAttributeType_Short;

			this->protocol[1].type = Oyster::Network::NetAttributeType_Short;
			this->status = state;
		}
	
		Protocol_General_Status(Oyster::Network::CustomNetProtocol& p)
		{
			status = (States)this->protocol[1].value.netShort;
		}
		Oyster::Network::CustomNetProtocol GetProtocol() override
		{
			this->protocol[1].value = status;

			return protocol;		 
		}							 

	private:
		Oyster::Network::CustomNetProtocol protocol;
	};

	struct Protocol_General_Text :public Oyster::Network::CustomProtocolObject
	{
		std::string text;	//The text to send
		int destination;	//The destination if any (Ie a whisper to a player)

		Protocol_General_Text()
			: destination(-1) {}
		Protocol_General_Text(Oyster::Network::CustomNetProtocol& p)
		{
			destination = p.Get(1).value.netInt;
			text = p.Get(2).value.netCharPtr;
		}
		Oyster::Network::CustomNetProtocol GetProtocol() override
		{
			this->protocol.Set(0, protocol_General_Text, Oyster::Network::NetAttributeType_Short);
			this->protocol.Set(1, destination, Oyster::Network::NetAttributeType_Int);
			this->protocol.Set(2, text);
			return protocol;
		}							 

	private:
		Oyster::Network::CustomNetProtocol protocol;
	};

	//#define protocol_Broadcast_Test							102
	struct Protocol_Broadcast_Test :public Oyster::Network::CustomProtocolObject
	{
		unsigned short port;
		std::string ip;
		std::string name;

		Protocol_Broadcast_Test()
		{ 
			this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
			this->protocol[0].value.netShort = protocol_Broadcast_Test;
			this->protocol[1].type = Oyster::Network::NetAttributeType_UnsignedShort;
			this->protocol[2].type = Oyster::Network::NetAttributeType_CharArray;
			this->protocol[3].type = Oyster::Network::NetAttributeType_CharArray;
			this->port = 0;
		}
		Protocol_Broadcast_Test(unsigned short port, std::string ip, std::string name)
		{ 
			this->protocol[0].type = Oyster::Network::NetAttributeType_Short;
			this->protocol[0].value.netShort = protocol_Broadcast_Test;
			this->protocol[1].type = Oyster::Network::NetAttributeType_UnsignedShort;
			this->port = port;
			this->protocol[2].type = Oyster::Network::NetAttributeType_CharArray;
			this->ip = ip;
			this->protocol[3].type = Oyster::Network::NetAttributeType_CharArray;
			this->name = name;
		}
		Protocol_Broadcast_Test(Oyster::Network::CustomNetProtocol& p)
		{
			this->port = p[1].value.netUShort;
			this->ip.assign(p[2].value.netCharPtr);
			this->name.assign(p[3].value.netCharPtr);
		}
		Oyster::Network::CustomNetProtocol GetProtocol() override
		{
			this->protocol[1].value = this->port;
			this->protocol.Set(2, ip);
			this->protocol.Set(3, name);
			
			return protocol;		 
		}							 

	private:
		Oyster::Network::CustomNetProtocol protocol;
	};
}
#endif //!GAMELOGIC_CONTROL_PROTOCOLS_H