#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <iostream>

using namespace std;

#define MYPORT 1550
#define BACKLOG 10

int policz(char *bufor)
{
	int licznik=0;
	for(int i=0; i<1000; i++)
	{
		if(bufor[i]!='\0') licznik++;
		else goto koniec;
	}
	koniec:
	return licznik;
}

int main()
{
	int sockfd, new_fd, numbytes, wybor, kolej;
	char bufor[1000];
	char zgoda;
	struct sockaddr_in my_addr;
	struct sockaddr_in their_addr;
	socklen_t sin_size;
	sin_size = sizeof(struct sockaddr_in);
	int yes=1;
	system("clear");
	cout << "Dandys IM v0.1" << endl;
	cout << "Wybierz tryb połączenia:" << endl;
	cout << "1. Serwer (wymagane zewnętrzne IP)" << endl;
	cout << "2. Klient" << endl;
	cout << "Twój wybór: ";
	cin >> wybor;
	switch(wybor)
	{
		case 1:
		if((sockfd=socket(AF_INET, SOCK_STREAM, 0)) == -1)
		{
			perror("socket");
			exit(1);
		}
	
		if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
		{
			perror("setsockopt");
			exit(1);
		}

		my_addr.sin_family = AF_INET;
		my_addr.sin_port = htons(MYPORT);
		my_addr.sin_addr.s_addr = INADDR_ANY;
		memset(&(my_addr.sin_zero), '\0', 8);

		if(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
		{
			perror("bind");
			exit(1);
		}

		if(listen(sockfd, BACKLOG) == -1)
		{
			perror("listen");
			exit(1);
		}

		cout << "Serwer uruchomiony. Oczekiwanie na podłączenie klienta." << endl;

		if((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
		{
			perror("accept");
			exit(0);
		}

		cout << "Otrzymano połaczenie z adresu: " << inet_ntoa(their_addr.sin_addr) << endl;
		cout << "Zgadzasz się na rozmowę? (T/N): ";
		cin >> zgoda;
		if((zgoda=='T') || (zgoda=='t'))
		{
			if(send(new_fd, "Witamy! Prosimy rozpocząć rozmowę.\n", 38, 0)== -1) perror("send");
			kolej=0;
			do
			{
				switch(kolej)
				{
					case 0:
					if((numbytes=recv(new_fd, bufor, 999, 0)) == -1)
					{
						perror("read");
						exit(1);
					}
					bufor[numbytes]='\0';
					cout << ">>> " << bufor;
					kolej=1;
					break;

					case 1:
					cout << "<<< ";
					cin.getline(bufor, 1000);
					numbytes=policz(bufor);
					if(send(new_fd, bufor, numbytes, 0) == -1) perror("send");		
					kolej=0;
					break;
				}
			}
			while(bufor[0]!='0');
		}
		else if(send(new_fd, "Przepraszamy, ale serwer odrzucił połączenie.\n", 49, 0) == -1) perror("send");
		close(new_fd);
		close(sockfd);
		break;

		case 2:
		break;
	}
	return 0;
}

