/*
Bind socket to port 8888 on localhost
*/
#include<io.h>
#include<string>
#include<iostream>
#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
using namespace std;
struct history
{
		string user[100];
		string host[100];
};
struct client
{
	 SOCKET client_socket;
	 string id,name,family_name;
};
WSADATA wsa;
history vec[10];
SOCKET s;
client list[10];
struct sockaddr_in server, client2;
int c;
int recv_size;
char *message, server_reply[100];
bool search(string str,string str2)
{
	int i=0;
	while (i<sizeof(str))
	{
		int j=0;
		int flag=0;
		if (str[i]==str2[j]) 
		{
			for (j;j<sizeof(str2);j++)
			{
				if (str[i]==str2[j]) 
				{
					flag++;
				}
				i++;
			}
		}
		if (flag==sizeof(str2)) 
		{
			return 1;
		}
	}
}
string search(string str,int part)
{
	string str2;
	int swap=0;
	while (swap<sizeof(str))
	{
		int j=0;
		int flag=0;
		if (str[swap]==' ' && part==2) 
		{
			int count=0;
			while (str[swap]!='&')
			{
				str2[count]=str[swap+1];
				swap++;
			}
			break;
		}
		if (swap=0 && part==1) 
		{
			while (str[swap]!=' ')
			{
				str2[swap]=str[swap];
			}
			break;
		}
	}
	return str2;
}
bool division(string str,int temp)
{
	string str2,str3;
	int swap=0;
	int flag=0;
	while (swap<sizeof(str))
	{
		int j=0;
		if (str[swap]==' ') 
		{
			int count=0;
			while (str[swap]!='*')
			{
				str2[count]=str[swap+1];
				swap++;
			}
			break;
		}
		if (swap=0) 
		{
			while (str[swap]!=' ')
			{
				str3[swap]=str[swap];
			}
			break;
		}
	}
	for (int i=0;i<temp;i++)
	{
		if (list[i].name==str2 && list[i].family_name==str3) flag=1;
	}
	return flag;
}
int main(int argc, char *argv[])
{

	printf("\nInitialising Winsock...");
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
	{
		printf("Failed. Error Code : %d", WSAGetLastError());
		return 1;
	}

	printf("Initialised.\n");

	//Create a socket
	if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
	{
		printf("Could not create socket : %d", WSAGetLastError());
	}

	printf("Socket created.\n");

	//Prepare the sockaddr_in structure
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = INADDR_ANY;
	server.sin_port = htons(8888);
	int o=0;
	//Bind
	if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
	{
		printf("Bind failed with error code : %d", WSAGetLastError());	
	}
	puts("Bind done");
	int count=0;
	int id=0;
	bool star;
	char str[100];
	while (1)
	{
		//Listen to incoming connections
		listen(s, 10);
		if (!o) 
		{
			//Accept and incoming connection
			puts("Waiting for incoming connections...");
			c = sizeof(struct sockaddr_in);
			list[count].client_socket = accept(s, (struct sockaddr *)&client2, &c);
			if ((recv_size = recv(list[count].client_socket, server_reply, 2000, 0)) == SOCKET_ERROR)
			{
				puts("recv failed");
			}
			puts("Reply received\n");
			//Add a NULL terminating character to make it a proper string before printing
			server_reply[recv_size] = '\0';
			if (list[count].client_socket == INVALID_SOCKET)
			{
				printf("accept failed with error code : %d", WSAGetLastError());
			}

			puts("Connection accepted");
			o++;
		}
		else
		{
			if ((recv_size = recv(list[count].client_socket, server_reply, 2000, 0)) == SOCKET_ERROR)
			{
				puts("recv failed");
			}
			puts("Reply received\n");
			server_reply[recv_size] = '\0';
		}
		//Add a NULL terminating character to make it a proper string before printing
		if (search(server_reply,"&"))
		{
			list[count].name=search(server_reply,1);
			list[count].family_name=search(server_reply,2);
			list[count].id=char(count);
			if (count=0);
		}
		if (search(server_reply,"*"))
		{
			if (division(server_reply,count)) star=1;
		}
		cout<<"Tell client something: ";
		cin>>str;
		message = str;
		if (star) message[strlen(message)]='*';
		send(list[count].client_socket, message, strlen(message), 0);
	}
	getchar();

	closesocket(s);
	WSACleanup();

	return 0;
}