#include <ctype.h>
#include <stdio.h>
#include "socket.h"
#include "group.h"
#include "stringops.h"
#include "com_resp.h"
#include "resp.h"
#include "command.h"

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

static void command_resp_list_out (globals *g, player *p, resp *r, int n)
{
	sprintf (output, "w %s = % -4d", p->name, n);
	socket_write_noret (g->socket, output);

	if (r->lowerflag)
	{
		sprintf (output, "%+-4d", r->lower);
		socket_write_noret (g->socket, output);
	}
	else
		socket_write_noret (g->socket, "****");

	socket_write_noret (g->socket, " to ");
	if (r->upperflag)
	{
		sprintf (output, "%+-4d", r->upper);
		socket_write_noret (g->socket, output);
	}
	else
		socket_write_noret (g->socket, "****");

	sprintf (output, ":% -4d:% 4d:%s",
		r->status_change, r->priority,
		r->response);
	socket_write (g->socket, output);
}

void command_resp_add (globals *g, player *p, char *l)
{
	group *gr;
	int success;

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

	l = tokenize (word, l);

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

	gr = (*word == '*') ? (g->group_current) : group_find (g->group_list,
		word);

	if (gr)
	{
		success = resp_add (gr->r, l);

		if (p->verbose)
		{
			if (success)
			{
				sprintf (output, "w %s = Response %s added to \
					group %s.", p->name, l, gr->name);
				socket_write (g->socket, output);
			}
			else
			{
				sprintf (output, "w %s = Format of command: \
					resp add {group}/* {lower}/* to \
					{upper}/*:{status_change}:{priority}:\
					{action(s)}.", p->name);
				socket_write (g->socket, output);
			}
		}
	}
	else
	{
		if (p->verbose)
		{
			if (g->group_list)
				sprintf (output, "w %s = Group %s not found.",
					p->name, word);
			else
				sprintf (output, "w %s = No groups in \
					memory.", p->name);
			socket_write (g->socket, output);
		}
	}
}

void command_resp_list (globals *g, player *p, char *l)
{
	group *gr;

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

	l = tokenize (word, l);

	if (strlen (word) == 0)
	{
		if (p->verbose)
		{
			sprintf (output,
				"w %s = resp list {group} [{status}]",
				p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	gr = (*word == '*') ? (g->group_current) : group_find (g->group_list,
		word);

	if (gr)
	{
		resp *scan;
		int n = 1, status, statusflag = 0;

		l = tokenize (word, l);

		if (strlen (word) > 0)
		{
			statusflag = 1;
			status = atoi (word);
		}

		for (scan = gr->r->head; scan != NULL; scan = scan->next, n++)
		{
			if (statusflag)
			{
				if (((status >= scan->lower) ||
					(!scan->lowerflag)) &&
					((!scan->upperflag) ||
					(status <= scan->upper)))
					command_resp_list_out (g, p, scan, n);
			}
			else
			{
				command_resp_list_out (g, p, scan, n);
			}
		}
	}
	else
	{
		if (p->verbose)
		{
			if (g->group_list)
				sprintf (output, "w %s = Group %s not found.",
					p->name, word);
			else
				sprintf (output, "w %s = No groups in \
					memory.", p->name);
			socket_write (g->socket, output);
		}
	}
}

void command_resp_delete (globals *g, player *p, char *l)
{
	group *gr;

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

	l = tokenize (word, l);

	if (strlen (word) == 0)
	{
		if (p->verbose)
		{
			sprintf (output,
				"w %s = resp delete {group} {resp #}",
				p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	gr = (*word == '*') ? (g->group_current) : group_find (g->group_list,
		word);

	if (gr)
	{
		resp *resp_found;

		if (l == NULL)
		{
			if (p->verbose)
			{
				sprintf (output, "w %s = resp delete {group} \
					{response}", p->name);
				socket_write (g->socket, output);
			}
			return;
		}

		resp_found = resp_find_num (gr->r, atoi(l));

		if (resp_found != NULL)
		{
			resp_delete (gr->r, resp_found);

			if (p->verbose)
			{
				sprintf (output, "w %s = Response %s deleted \
					from group %s.", p->name, l, gr->name);
				socket_write (g->socket, output);
			}
		}
		else
		{
			if (p->verbose)
			{
				sprintf (output, "w %s = Response %s not \
					found in group %s.", p->name, l,
					gr->name);
				socket_write (g->socket, output);
			}
		}
	}
	else
	{
		if (p->verbose)
		{
			if (g->group_list)
				sprintf (output, "w %s = Group %s not found.",
					p->name, word);
			else
				sprintf (output, "w %s = No groups in \
					memory.", p->name);
			socket_write (g->socket, output);
		}
	}
}

void command_resp (globals *g, player *p, char *l)
{
	#ifdef FUNCTIONS
	puts ("**command_resp");
	#endif
 
	l = tokenize (word, l);

	if (strlen (word) == 0)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = resp commands:add, delete, \
			list", p->name);
			socket_write (g->socket, output);
		}
		return;
	}

	if (!strcasecmp (word, "add"))		command_resp_add (g, p, l);
	if (!strcasecmp (word, "list"))		command_resp_list (g, p, l);
	if (!strcasecmp (word, "delete"))	command_resp_delete (g, p, l);
}