#include <stdint.h>
#include <signal.h>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include "socket.h"
#include "user_interface_thread.h"

using namespace std;

void* UserInterfaceThread::Run(void* parameter)
{
	uint16_t	userInterfacePortNumber;

	userInterfacePortNumber = *((uint16_t *) parameter);

	try {
		TCP_ServerSocket userInterfaceServerSocket(userInterfacePortNumber);

		for (;;) {   // Run forever
			processCommands(userInterfaceServerSocket.accept());       // Wait for someone to connect
		}

	} catch (SocketException &e) {
		cerr << e.what() << endl;
		exit(1);
	}
}

void UserInterfaceThread::processCommands(TCP_Socket *socket)
{
	char	request[80];
	char	*command;

	const char	*prompt			= "\n==> ";
	const char	*howdyMessage	= "Howdy, pardner";
	const char	*errorMessage	= "What?";

	try {
		cout << socket->getForeignAddress() << ":";
	} catch (SocketException e) {
		cerr << "Unable to get foreign address" << endl;
	}
	try {
		cout << socket->getForeignPort();
	} catch (SocketException e) {
		cerr << "Unable to get foreign port" << endl;
	}
	cout << endl;

	int receiveMessageSize;
	for (;;) {
		socket->send(prompt,strlen(prompt));
		int receiveMessageSize = socket->recv(request, sizeof(request));
		if (receiveMessageSize > 0) {
			command = strtok(request," \t\r\n");
			if (!strcmp(command,"echo")) {
				command = strtok(NULL, "\r\n");
				socket->send(command,strlen(command));
			} else if(!strcmp(command,"Howdy")) {
				socket->send(howdyMessage,strlen(howdyMessage));
			} else {
				socket->send(errorMessage,strlen(errorMessage));
			}
		}
	}
}
