#include "munga.h"
#pragma hdrstop

#include "team.h"
#include "app.h"
#include "nttmgr.h"

//#############################################################################
//###############################    Team     #################################
//#############################################################################

//#############################################################################
// Shared Data Support
//
Derivation* Team::GetClassDerivations()
{
	static Derivation classDerivations(Entity::GetClassDerivations(), "Team");
	return &classDerivations;
}

Team::SharedData
	Team::DefaultData(
		Team::GetClassDerivations(),
		Team::MessageHandlers,
		Team::GetAttributeIndex(),
		Team::StateCount,
		(Team::MakeHandler)Team::Make
	);
//#############################################################################
// Attribute Support
//

const Team::IndexEntry
	Team::AttributePointers[]=
{
	ATTRIBUTE_ENTRY(Team, TeamName, teamName),
	ATTRIBUTE_ENTRY(Team, TeamScore, teamScore)
};

Team::AttributeIndexSet& Team::GetAttributeIndex()
{
	static Team::AttributeIndexSet attributeIndex(ELEMENTS(Team::AttributePointers),
		Team::AttributePointers,
		Entity::GetAttributeIndex()
	);
	return attributeIndex;
}

//#############################################################################
// Message Support
//

const Receiver::HandlerEntry
	Team::MessageHandlerEntries[]=
{
	MESSAGE_ENTRY(Team, Score)
};

Receiver::MessageHandlerSet
	Team::MessageHandlers(
		ELEMENTS(Team::MessageHandlerEntries),
		Team::MessageHandlerEntries,
		Entity::GetMessageHandlers()
	);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Team::ScoreMessageHandler(ScoreMessage *score_message)
{
	Check(this);
	Check(score_message);

	teamScore += score_message->scoreAward;
   Check_Fpu();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Team::TeamSimulation(
		Scalar	// time_slice
	)
{
	Check(this);

}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Team::Team(
	MakeMessage	*creation_message,
	SharedData	&shared_data
) :
	Entity (creation_message, shared_data)
{
	Str_Copy(teamName, creation_message->teamName, sizeof(teamName));

	teamScore = creation_message->initialScore;
	//
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	// Add this to the Entity Group of Teams
	//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	//
	Check(application);
	EntityManager *entity_manager = application->GetEntityManager();
	Check(entity_manager);
	EntityGroup *team_group = entity_manager->UseGroup("Teams");
	Check(team_group);
	team_group->Add(this);

	SetValidFlag();

	Check_Fpu();
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Team::~Team()
{

}


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Team*
	Team::Make(MakeMessage *creation_message)
{
	Check_Fpu();
	return new Team(creation_message);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
Logical
	Team::CreateMakeMessage(
		MakeMessage 					*creation_message,
		NotationFile 					*model_file,
		const ResourceDirectories	*directories
)
{
	Check(creation_message);
	Check(model_file);
	Check_Pointer(directories);

	if (!Entity::CreateMakeMessage(creation_message, model_file, directories))
	{
		return False;
	}

	creation_message->messageLength = sizeof(Team::MakeMessage);
	creation_message->classToCreate = TeamClassID;
	creation_message->instanceFlags = MasterInstance | TrappedFlag | MapFlag;
	Str_Copy(creation_message->teamName, "DEFUALT", sizeof(creation_message->teamName));

	char *p;
#if 0
		//
		//~~~~~~~~~~~~~~~
		// Get the TeamID
		//~~~~~~~~~~~~~~~
		//
		if ((p = strtok(NULL, " ")) == NULL)
		{
			std::cerr << "teamID missing!\n";
			return False;
		}
		creation_message->teamID = atoi(p);
#endif

	//
	//~~~~~~~~~~~~~~~~~~~~~~
	// Get the Initial Score
	//~~~~~~~~~~~~~~~~~~~~~~
	//
	if ((p = strtok(NULL, " ")) == NULL)
	{
		std::cerr << "InitialScore missing!\n";
		return False;
	}
	creation_message->initialScore = atoi(p);


	//
	//~~~~~~~~~~~~~~~
	// Get the TeamName
	//~~~~~~~~~~~~~~~
	//
	if ((p = strtok(NULL, ",")) == NULL)
	{
		std::cerr << "teamName missing!\n";
		return False;
	}
	Str_Copy(creation_message->teamName,p, sizeof(creation_message->teamName));



	return True;
}

Logical
	Team::TestInstance() const
{
	return IsDerivedFrom(*GetClassDerivations());
}
