#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<string.h>


void read_pp(int fd,char* str,int size)
{
	if(!read(fd,str,size)) {printf("closed connection\n"); exit(1);}
}


int pti(char *port)
{
	int i=0;
	int p=0;
	while(port[i]!='\0')
		{
			if(!(port[i]>='0'&&port[i]<='9')){ printf("invalid port\n"); exit(0);}
			p=p*10+port[i]-'0';
			i++;
		}
	return p;
}
void getstring(int fd,char* buf)
{
	int i=0;
	char c=' ';
	while(c!='\n')
	{
		read_pp(fd,&c,sizeof(char));
		buf[i]=c;
		i++;
	}
	buf[i]='\0';
}
void findamp(int fd)
{
	char c;
	read(fd,&c,sizeof(char));
	while(c!='&') read(fd,&c,sizeof(char));
}
void waiting(int fd,char* str,int len)
{
	char buf[100];
	do
	{
		getstring(fd,buf);
		printf("%s",buf);
	}while(strncmp(buf,str,len));	
}
char findint(int fd)
{
	char c;
	read_pp(fd,&c,sizeof(char));
	while(!isdigit(c)) read(fd,&c,sizeof(char));
	return c;
}
void market(int fd,char* price)
{ 
	char c;
	int i=1;
	findint(fd);
	price[0]=findint(fd);
	read_pp(fd,&c,sizeof(char));
	while(isdigit(c)) {price[i]=c;i++;read_pp(fd,&c,sizeof(char));}
	price[i]='\n';
}
void command(char* price,char * com,int num)
{
	int i=0;
	
	for(i=0;i<num-3;i++)
	{
		com[i+num]=price[i];
		
	}
	com[i+num]='\n';
}


#define NAME_SIZE 6
#define JOIN_SIZE 8
#define BUY_PRICE_SIZE 4
#define SELL_PRICE_SIZE 5
#define SELL_NAME_SIZE 12
#define BUY_NAME_SIZE 10
#define PROD_SIZE 7
#define TURN_SIZE 5
#define MARKET_SIZE 7
int main(int argc, char **argv)
{
	struct sockaddr_in addr;
	
	int sockfd;
	int port=pti(argv[2]);
	


	char end_game[12];
	char name[NAME_SIZE]="DmBot\n";
	char join[JOIN_SIZE]=".join 1\n";
	char mar_n[MARKET_SIZE]="market\n";
	
	
	char buy_price[BUY_PRICE_SIZE];
	char sell_price[SELL_PRICE_SIZE];
	char buy_n[BUY_NAME_SIZE]="buy 2 ";
	char sell_n[SELL_NAME_SIZE]="sell 2 ";
	char prod_n[PROD_SIZE]="prod 2\n";
	char turn_n[TURN_SIZE]="turn\n";
	
	
	sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd==-1)
		{
			printf("cannot create socket\n");
			exit(-1);
		}
	
	addr.sin_family =AF_INET;
	addr.sin_port=htons(port);
	
	if(!inet_aton(argv[1],&(addr.sin_addr)))
		{
			printf("invalid ip addres\n");
			exit(-1);
		}
	
	if(connect(sockfd,(struct sockaddr*)&addr,sizeof(addr))!=0)
		{
			printf("cannot create connection\n");
			exit(-1);
		}
	
	write(sockfd,name,NAME_SIZE*sizeof(char));
	write(sockfd,join,JOIN_SIZE*sizeof(char));
	
	waiting(sockfd,"& START",7);
	
	for(;;)	
	{
		write(sockfd,mar_n,7*sizeof(char));			
		
		findamp(sockfd);
		market(sockfd,buy_price);
		market(sockfd,sell_price);
		
		command(buy_price,buy_n,BUY_NAME_SIZE-BUY_PRICE_SIZE);	
		command(sell_price,sell_n,SELL_NAME_SIZE-SELL_PRICE_SIZE);
		
		write(sockfd,sell_n,SELL_NAME_SIZE*sizeof(char));
		
		write(sockfd,buy_n,BUY_NAME_SIZE*sizeof(char));
		
		write(sockfd,prod_n,PROD_SIZE*sizeof(char));
		
		write(sockfd,turn_n,TURN_SIZE*sizeof(char));
		
		waiting(sockfd,"& ENDTURN",9);
	}
	return 0;
}
