#include "habitat.hpp"


//------------------------- HABITAT Module ----------------------//
//						  v 08 . 03 .  2007						 //
//																 //
//								MT								 //
//---------------------------------------------------------------//


// --- CHabitat :: Constructer --- //
CHabitat :: CHabitat()
{ };

// --- The New Game --- //
void CHabitat :: NewGame(int to_wait)
{
	Socket.SendCommand(COMMAND_HABITAT_INIT_CREATE);

	char *str = new char [strlen(Data.you.gamer_name) + strlen(COMMAND_HABITAT_INIT_GAMENUMBER)+1];
	strcpy(str, Data.you.gamer_name);
	strcat(str, COMMAND_HABITAT_INIT_GAMENUMBER);
	Socket.Wait(str);
	Data.game_number = Socket.Read_Int();
	printf("~Info: %s%d\n", str,Data.game_number);
	delete [] str;
	printf("~Info: %s waiting %d gamers.\n", Data.you.gamer_name, GAMERS_TO_WAIT);

	//--- waiting N gamers --- 
	for (int i=1; i<GAMERS_TO_WAIT +1 /*youself*/; i++) {
		if  (Socket.Wait2(COMMAND_HABITAT_INIT_WAIT_NSTART, COMMAND_HABITAT_INIT_WAIT_START) == -1 )
			if (i>1) break;
		else 
			if (i>0) {										
				Socket.Read_Str();
				Data.AddGamer(Socket.GetBufAddr());
				printf("~Info: + one gamer (%s), #%d.\n", Data.players[i-1].gamer_name, i);	
			}
	}
	//==== waiting N gamers ===

	Socket.SendCommand(COMMAND_HABITAT_INIT_START);
}

// --- CHabitat :: Init --- //
void CHabitat :: Init(char *host, int portno, char *gamer_name, int to_wait)
{ 
	Socket.ConnectTo(host,portno);
		printf("~Info: Connection done.\n");
	Socket.SendCommand(gamer_name);
	strcpy(Data.you.gamer_name, gamer_name);
		printf("~Info: The name is %s.\n", Data.you.gamer_name);
	Socket.SendCommand("Hi!\0");
		
		//-------------------------------------
		Socket.SendCommand(COMMAND_HABITAT_INIT_WHO);
		Data.game_number = Socket.ReadAfterWait2_Int(COMMAND_HABITAT_INIT_WAITING);
		
		if (Socket.error.get_number() == ERROR_SOCKET_QUIET_NOT_FIND_S) {
			// Create a new game	
			Data.game_number = -1;
				printf("~Info: %s creating a game...\n", Data.you.gamer_name);
			NewGame(to_wait);
		}
		else {	
			// Join to the game
				printf("~Info: %s finding a game...\n", Data.you.gamer_name);
			Socket.SendCommandWithInt(COMMAND_HABITAT_INIT_JOIN, Data.game_number);
				printf("~Info: %s join to #%d game.\n", Data.you.gamer_name, Data.game_number);
			}
		//=====================================

	Socket.Wait(COMMAND_HABITAT_INIT_STARTJOIN);
		printf("~Info: The game is started.\n\n");
};


// --- CHabitat :: Destroy --- //
void CHabitat :: Destroy()
{
	Socket.CloseHost();
		printf("\n~Info: Closed connection.\n");
};


// --- CHabitat :: GetDataAddr() --- //
CData* CHabitat :: GetDataAddr()
{
	return &Data;
}


// --- CHabitat :: GetSocketAddr --- //
CSocket* CHabitat :: GetSocketAddr()
{
	return &Socket;
};


// --- CHabitat :: ANALYZE --- //
void CHabitat :: Market ()
{
	Socket.Wait(COMMAND_ANALYZER_MARKET);

		Data.market.raw = Socket.Read_Int();
		Data.market.min_raw_price = Socket.Read_Int();
		Data.market.prod = Socket.Read_Int();
		Data.market.max_prod_price = Socket.Read_Int();

		printf("\n~Game: ~Market: raw = %d, min price = %d; \n~Game: ~Market: prod = %d, max price = %d.\n\n",
			Data.market.raw, Data.market.min_raw_price, Data.market.prod,Data.market.max_prod_price);
};


// --- CHabitat :: ANALYZE --- //
void CHabitat :: Info ()
{
	printf("\n");
	Data.you.money = -1;
	for (int i = 0; i < Data.players_count; i++)
		Data.players[i].money = -1;

	while (	Socket.Wait2(COMMAND_ANALYZER_INFO_AND_PLAYERS ) == 1)
		{
		
		Socket.Read_Str();
		Socket.DelSpacesInBuf();
		
		CGamer *Work_Obj;

		int n = Data.GetNumberByGamerName(Socket.GetBufAddr());
			if ( n == -1 ) n = Data.AddGamer(Socket.GetBufAddr());
			if ( n == -2 ) {Work_Obj = &Data.you; printf("~Game: ~Info: about you:\n");}
			if ( n  > -1 ) Work_Obj = &Data.players[n]; 

				Work_Obj -> raw = Socket.Read_Int();
				Work_Obj -> prod = Socket.Read_Int();
				Work_Obj -> money = Socket.Read_Int();
				Work_Obj -> fabrics = Socket.Read_Int();
				Work_Obj -> auto_plants = Socket.Read_Int();
				
			printf("~Game: ~Info: %s :  raw  = %d, prod  = %d; \n~Game: ~Info: %s : money = %d; plants [%d_%d]. \n\n",
					Work_Obj -> gamer_name, Work_Obj -> raw, Work_Obj -> prod, 
					Work_Obj -> gamer_name, Work_Obj -> money, Work_Obj -> fabrics, Work_Obj -> auto_plants);
		}
	if (Data.you.money == -1) Data.win = -1; 

	int tmp2 = Socket.Read_Int();
		printf("~Game: players quantity = %d; at the beginning = %d.\n", tmp2, Data.players_count+1);

};


// --- CHabitat :: ANALYZE --- //
void CHabitat :: Analyze()
{
	Socket.SendCommand(COMMAND_ROBOT_MARKET);
	Market();

	Socket.SendCommand(COMMAND_ROBOT_INFO);
	Info();
};


// --- CHabitat :: WaitingTurn --- //
void CHabitat :: WaitingTurn()
{		
	if ( Socket.Wait2(COMMAND_ANALYZER_BANKRUPT, COMMAND_ANALYZER_ENDTURN) == 1 ) {
		Data.win = -1; 
		Data.you.money = -1;
	}

		Socket.SendCommand(COMMAND_ROBOT_INFO);
	 if ( Socket.Wait2(COMMAND_ANALYZER_YOUWIN, COMMAND_ANALYZER_PLAYERS) == 1 )
	 	Data.win = 1; 

	Data.turn_number++;
	printf("~Game: Turn [%d] ++.\n------------------------------------------------------------ \n", Data.turn_number);
};

