#include "data.hpp"


//------------------------- DATA Module -------------------------//
//						  v 08 . 03 .  2007						 //
//																 //
//								MT								 //
//---------------------------------------------------------------//



// --- Constructor DATA --- //
//	  :: TYPES ::
//		1. child
//		2. childend
//		3. pointer
//		4. int
//		5. string
CData :: CData()
{
		// 1 Pointer to data
		strcpy(_tag_begin,  "<tag><type=pointer><name=CData>\0");
		pointer_to_data = this;

		// 2 Turn number
		strcpy(_tag_turn_number,  "<tag><type=int><name=turn_number>\0");
		turn_number = 0;
		// 3 Game number
		strcpy(_tag_game_number,  "<tag><type=int><name=game_number>\0");

		// 4 Win
		strcpy(_tag_win,  "<tag><type=int><name=win>\0");

		// 5 Gamers count
		strcpy(_tag_players_count,  "<tag><type=int><name=players_count>\0");
		players_count = 0;

			// CGamer - YOU
			strcpy(you._tag_header,  "<tag><type=child><name=you>\0");
			strcpy(you._tag_end,  "<tag><type=childend><name=you>\0");

		// x Data end
		strcpy(_tag_data_end,  "<end><type=end><name=end>\0");
	//-----------------------------------------------------
	players_count = 0;
};


// --- CData :: GetNumberByGamerName --- //
int CData :: GetNumberByGamerName(char *s)
{
	int res = -1;

	for (int i = 0; i<players_count; i++)
		if (strcmp(s, players[i].gamer_name) == 0) 
		{
			res = i;
			break;
		}
		
	if (strcmp(s, you.gamer_name) == 0) 
		res = -2;

 return res;
};


// --- CData :: AddGamer --- //
int CData :: AddGamer(char *s)
{
	
	strcpy(players[players_count].gamer_name, s);
	players_count++;
		
 return players_count-1;
};


// --- CData :: DeleteGamer --- //
int CData :: DeleteGamer(int i)
{
	int res = -1;
	if ( (i>0) && (i<players_count) )
	{
		players[i].money = -1;
		players_count--;
		res = 1;
	}
 return res;
};


// --- CData :: Get Address --- //
void* CData :: GetVarAddr(char *name, void *def, char* end)
{
	char *begin = (char*) def, *tmp, *tmp_eq;
	int name_size = strlen(name) -1;
	int near_tag = 0;
	
	for (unsigned int i=1; i<sizeof(CData); i++)
	{
		tmp = &begin[i];
		tmp_eq = &begin[i-1];

		if (strncmp(tmp, STR_TAG, strlen(STR_TAG)-1) == 0)
			near_tag = i;

		if (strncmp(tmp, name, name_size) == 0)
			if ( (*tmp_eq) == '=')  break;

		if (strncmp(tmp, end, strlen(end)-1) == 0) {
			near_tag = -1;
			break;
		};
	};
	if (near_tag<0) ShowError(name);
	int offset = near_tag + TAG_SIZE;
		
	return (void*) &begin[offset];
};


// --- CData :: Get Int --- //
int CData :: GetInt(char *name, void* begin, char* end)
{
	return (*((int*) GetVarAddr(name, begin, end)));
};


// --- CData :: Get 1 ! --- //
int CData :: GetInData(char *name)
{
	return GetInt(name, this, STR_END);
};


// --- CData :: Get ALL ! --- //
int CData :: Get(char *name1, char *name2, int n, char *name3)
{
	#define STR_YOU  ".you"
	#define STR_MARKET  ".market"
	#define STR_PLAYERS  ".players"

	// You
	if (strcmp(name1, STR_YOU) == 0) 
		if (name2 != NULL)
			return GetInt(PName(name2), &you, STR_CHILDEND);
		else { ShowError(name1); return 0; }

	// Players
	if (strcmp(name1, STR_PLAYERS) == 0) 
		if (name2 != NULL && n>-1)
			return GetInt(PName(name2), &players[n], STR_CHILDEND);
		else { ShowError(name1); return 0; }

	// You
	if (strcmp(name1, STR_MARKET) == 0) 
		if (name2 != NULL)
			return GetInt(PName(name2), &market, STR_CHILDEND);
		else { ShowError(name1); return 0; }

	// Data
	if (name2 == NULL) 
		return GetInData(PName(name1));

	return -1;
};

//--- Show Error
void CData :: ShowError(char *name)
{
	CError Err; 

	Err.Gum("Runtime error. Can't give variable: '");
	Err.Gum(name);
	Err.Gum("'\n");
	Err.OnErrorSpit(-700);
};
