#ifndef DANBIAS_CLIENT_GAMECLIENTSTATE_H
#define DANBIAS_CLIENT_GAMECLIENTSTATE_H

#define NOMINMAX
#include "SharedStateContent.h"

namespace DanBias { namespace Client
{
	class GameClientState
	{
	public:
		enum ClientState
		{
			ClientState_Main,
			ClientState_Lan,
			ClientState_Lobby,
			ClientState_LobbyCreate,
			ClientState_LobbyReady,
			ClientState_NetLoad,
			ClientState_Game,
			ClientState_Same,
			ClientState_Quit
		};

		typedef ::Oyster::Network::NetEvent<::Oyster::Network::NetworkClient*, ::Oyster::Network::NetworkClient::ClientEventArgs> NetEvent;
		static const NetEvent event_processed;

		GameClientState();
		virtual ~GameClientState();
		virtual bool Init( SharedStateContent &shared ) = 0;
		virtual ClientState Update( float deltaTime ) = 0;
		virtual bool Render() = 0;
		virtual bool Release() = 0;
		virtual void ChangeState( ClientState next ) = 0;

		/******************************************************************
		 * @param message of the event
		 * @return message or a reference to GameClientState::event_processed.
		 ******************************************************************/
		virtual const NetEvent & DataRecieved( const NetEvent &message );
	};
} }

namespace Utility { namespace DynamicMemory
{ // template specializationto allowuse of dynamicmemory tools
	template<>
	inline void SafeDeleteInstance( ::DanBias::Client::GameClientState *dynamicInstance )
	{
		if( dynamicInstance )
		{
			dynamicInstance->Release();
			delete dynamicInstance;
		}
	}
} }

#endif