#include <ctype.h>
#include <stdio.h>
#include "socket.h"
#include "com_player.h"
#include "stringops.h"

static char word [128], output[1024];

void command_player_add (globals *g, player *p, char *l)
{
	#ifdef FUNCTIONS
	puts ("**command_player_add");
	#endif

	l = tokenize (word, l);
	if (strlen(word) > 0)
	{
		player_add (g->player_list, word);

		if (p->verbose)
		{
			sprintf (output, "w %s = Player %s added.", p->name,
				word);
			socket_write (g->socket, output);
		}
	}
}

void command_player_delete (globals *g, player *p, char *l)
{
	player *dead;

	#ifdef FUNCTIONS
	puts ("**command_player_delete");
	#endif

	l = tokenize (word, l);

	dead = player_find (g->player_list, word);
	if (dead != NULL)
	{
		if (dead != p)
		{
			player_delete (g->player_list, dead);

			sprintf (output, "w %s = Player %s deleted.",
				p->name, word);
			socket_write (g->socket, output);
		}
		else
		{
			sprintf (output, "w %s = I can't delete you!",
				p->name);
			socket_write (g->socket, output);
		}
	}
	else
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = I don't know player %s.",
				p->name, word);
			socket_write (g->socket, output);
		}
	}
}

static void command_player_list_output (globals *g, player *p, player *o)
{
	#ifdef FUNCTIONS
	puts ("<command_player_list_output>");
	#endif

	sprintf (output, "w %s = %- 4d %-25s s:%+03d v:%c i:%c c:%c o:%c",
		p->name,
		player_num (g->player_list, o),
		o->name,
		o->status,
		o->verbose ? 'T' : 'F',
		o->ignore ? 'T' : 'F',
		o->command ? 'T' : 'F',
		o->owner ? 'T' : 'F'
		);
	socket_write (g->socket, output);
}

void command_player_list (globals *g, player *p, char *l)
{
	player *scan;

	#ifdef FUNCTIONS
	puts ("**command_player_list");
	#endif
	
	l = tokenize (word, l);
	if (strlen (word))
	{
		scan = player_find (g->player_list, word);
		if (scan == NULL)
		{
			if (p->verbose)
			{
				sprintf (output, "w %s = I don't know %s.",
					p->name, word);
				socket_write (g->socket, output);
			}
		}
		else
			command_player_list_output (g, p, scan);
	}
	else
	{
		for (scan = g->player_list->head; scan != NULL;
			scan = scan->next)
			command_player_list_output (g, p, scan);
	}
}

void command_player_status (globals *g, player *p, char *l)
{
	player *current;

	#ifdef FUNCTIONS
	puts ("**command_player_status");
	#endif

	l = tokenize (word, l);

	if (strlen (word) == 0)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = player status {player} \
				{status}", p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	current = player_find (g->player_list, word);

	if (current == NULL)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = I don't know player %s.",
				p->name, word);
			socket_write (g->socket, output);
		}
		return;
	}

	l = tokenize (word, l);

	if (strlen (word) != 0)
		current->status = atoi(word);

	if (p->verbose)
	{
		sprintf (output, "w %s = Status for %s set to %d.", p->name,
			current->name, current->status);
		socket_write (g->socket, output);
	}
}

void command_player_verbose (globals *g, player *p, char *l)
{
	player *current;

	#ifdef FUNCTIONS
	puts ("**command_player_verbose");
	#endif

	l = tokenize (word, l);

	if (strlen (word) == 0)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = player verbose {player} \
				T/F", p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	current = player_find (g->player_list, word);

	if (current == NULL)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = I don't know player %s.",
				p->name, word);
			socket_write (g->socket, output);
		}
		return;
	}

	l = tokenize (word, l);

	if (strlen (word) != 0)
		current->verbose =
			((isupper(*word) ? tolower (*word) : *word) == 't');

	if (p->verbose)
	{
		sprintf (output, "w %s = Verbose for %s set to %c.", p->name,
			current->name, current->verbose ? 'T' : 'F');
		socket_write (g->socket, output);
	}
}

void command_player_ignore (globals *g, player *p, char *l)
{
	player *current;

	#ifdef FUNCTIONS
	puts ("**command_player_ignore");
	#endif

	l = tokenize (word, l);

	if (strlen (word) == 0)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = player ignore {player} \
				T/F", p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	current = player_find (g->player_list, word);

	if (current == NULL)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = I don't know player %s.",
				p->name, word);
			socket_write (g->socket, output);
		}
		return;
	}

	l = tokenize (word, l);

	if (strlen (word) != 0)
		current->ignore = ((isupper(*word) ? tolower (*word) :
			*word) == 't');

	if (p->verbose)
	{
		sprintf (output, "w %s = Ignore for %s set to %c.", p->name,
			current->name, current->ignore ? 'T' : 'F');
		socket_write (g->socket, output);
	}
}

void command_player_command (globals *g, player *p, char *l)
{
	player *current;

	#ifdef FUNCTIONS
	puts ("**command_player_command");
	#endif

	l = tokenize (word, l);

	if (!p->owner)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = You have to be an owner to \
				change command status of players.", p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	if (strlen (word) == 0)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = player command {player} \
				T/F", p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	current = player_find (g->player_list, word);

	if (current == NULL)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = I don't know player %s.",
				p->name, word);
			socket_write (g->socket, output);
		}
		return;
	}

	l = tokenize (word, l);

	if (strlen (word) != 0)
		current->command = ((isupper(*word) ? tolower (*word) :
			*word) == 't');

	if (p->verbose)
	{
		sprintf (output, "w %s = Command for %s set to %c.", p->name,
			current->name, current->command ? 'T' : 'F');
		socket_write (g->socket, output);
	}
}

void command_player_owner (globals *g, player *p, char *l)
{
	player *current;

	#ifdef FUNCTIONS
	puts ("**command_player_owner");
	#endif

	l = tokenize (word, l);

	if (!p->owner)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = You have to be an owner to \
				change owner status of players.", p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	if (strlen (word) == 0)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = player owner {player} \
				T/F", p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	current = player_find (g->player_list, word);

	if (current == NULL)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = I don't know player %s.",
				p->name, word);
			socket_write (g->socket, output);
		}
		return;
	}

	l = tokenize (word, l);

	if (strlen (word) != 0)
		current->owner = ((isupper(*word) ? tolower (*word) :
			*word) == 't');

	if (p->verbose)
	{
		sprintf (output, "w %s = Owner for %s set to %c.", p->name,
			current->name, current->owner ? 'T' : 'F');
		socket_write (g->socket, output);
	}
}

void command_player_load (globals *g, player *p, char *l)
{
	char *name;
	int verbose;

	#ifdef FUNCTIONS
	puts ("**command_player_load");
	#endif

	l = tokenize (word, l);
	copystring (name, p->name);
	verbose = p->verbose;

	player_burn (g->player_list);
	g->player_list = player_load (strlen (word) ? word : g->player_file);

	if (verbose)
	{
		sprintf (output, "w %s = Player file %s loaded.", name,
			strlen (word) ? word:g->player_file);
		socket_write (g->socket, output);
	}

	free (name);
}

void command_player_save (globals *g, player *p, char *l)
{
	#ifdef FUNCTIONS
	puts ("**command_player_save");
	#endif

	l = tokenize (word, l);

	player_save (g->player_list, strlen (word) ? word : g->player_file);

	if (p->verbose)
	{
		sprintf (output, "w %s = Players saved to file %s.",
			p->name,
			strlen (word) ? word : g->player_file);
		socket_write (g->socket, output);
	}
}

void command_player_default (globals *g, player *p, char *l)
{
	#ifdef FUNCTIONS
	puts ("**command_player_default");
	#endif

	l = tokenize (word, l);

	if (strlen (word) != 0)
	{
		copystring (g->player_file, word);
	}

	if (p->verbose)
	{
		sprintf (output, "w %s = Default player filename is \
			%s.", p->name, g->player_file);
		socket_write (g->socket, output);
	}
}

void command_player (globals *g, player *p, char *l)
{
	#ifdef FUNCTIONS
	puts ("**command_player");
	#endif

	l = tokenize (word, l);

	if (strlen (word) == 0)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = player commands:add, delete, \
				list, status, verbose, command, ignore, \
				owner, load, save, default", p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	if (!strcasecmp (word, "add"))      command_player_add (g, p, l);
	if (!strcasecmp (word, "delete"))   command_player_delete (g, p, l);
	if (!strcasecmp (word, "list"))     command_player_list (g, p, l);
	if (!strcasecmp (word, "status"))   command_player_status (g, p, l);
	if (!strcasecmp (word, "verbose"))  command_player_verbose (g, p, l);
	if (!strcasecmp (word, "command"))  command_player_command (g, p, l);
	if (!strcasecmp (word, "ignore"))   command_player_ignore (g, p, l);
	if (!strcasecmp (word, "owner"))    command_player_owner (g, p, l);
	if (!strcasecmp (word, "load"))     command_player_load (g, p, l);
	if (!strcasecmp (word, "save"))     command_player_save (g, p, l);
	if (!strcasecmp (word, "default"))  command_player_default (g, p, l);
}