#include <ctype.h>
#include <stdio.h>
#include "com_group.h"
#include "stringops.h"
#include "group.h"
#include "socket.h"

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

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

	l = tokenize (word, l);

	if (strlen (word))
	{
		group_add (g->group_list, word);
		g->group_current = g->group_list->tail;

		if (p->verbose)
		{
			sprintf (output, "w %s = Group %s added.", p->name,
				word);
			socket_write (g->socket, output);
		}
	}
	else
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = You have to specify a name.",
				p->name);
			socket_write (g->socket, output);
		}
	}
}

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

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

	l = tokenize (word, l);

	if (!g->group_list)
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = No groups currently in \
				memory.", p->name);
			socket_write (g->socket, output);
		}

		return;
	}

	if (!strlen (word))
	{
		char *tempname;

		copystring (tempname, g->group_current->name);
		group_delete (g->group_list, g->group_current);

		g->group_current = g->group_list->head;

		if (p->verbose)
		{
			sprintf (output, "w %s = Group %s deleted.", p->name,
				tempname);
			socket_write (g->socket, output);
		}

		free (tempname);

		return;
	}

	if (gr = group_find (g->group_list, word))
	{
		group_delete (g->group_list, gr);

		if (p->verbose)
		{
			sprintf (output, "w %s = Group %s deleted.",
				p->name, word);
			socket_write (g->socket, output);
		}
	}
	else
	{
		if (p->verbose)
		{
			sprintf (output, "w %s = Group %s not found.",
				p->name, word);
			socket_write (g->socket, output);
		}
	}
}

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

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

	l = tokenize (word, l);

	if ((g->group_list->head == NULL) && p->verbose)
	{
		sprintf (output, "w %s = No groups in memory.",
			p->name);
		socket_write (g->socket, output);
	}

	for (gr = g->group_list->head; gr != NULL; gr = gr->next)
	{
		sprintf (output, "w %s = %s", p->name, gr->name);
		socket_write (g->socket, output);
	}
}

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

	l = tokenize (word, l);

	group_burn (g->group_list);

	g->group_list = group_load (strlen (word) ? word : g->group_file);

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

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

	l = tokenize (word, l);

	if (strlen (word))
	{
		free (g->group_file);
		copystring (g->group_file, word);
	}

	if (p->verbose)
	{
		sprintf (output, "w %s = Group default file is %s.", p->name,
			g->group_file);
		socket_write (g->socket, output);
	}
}

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

	l = tokenize (word, l);

	group_save (g->group_list, strlen (word) ? word : g->group_file);

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

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

	l = tokenize (word, l);

	if (strlen (word))
	{
		group *currenttemp;

		currenttemp = g->group_current;
		g->group_current = group_find (g->group_list, word);

		if (!g->group_current) g->group_current = currenttemp;
	}

	if (p->verbose)
	{
		sprintf (output, "w %s = Current group is %s.", p->name,
			g->group_current->name);
		socket_write (g->socket, output);
	}
}

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

	l = tokenize (word, l);

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

	if (!strcasecmp (word, "add"))		command_group_add (g, p, l);
	if (!strcasecmp (word, "delete"))	command_group_delete (g, p, l);
	if (!strcasecmp (word, "list"))		command_group_list (g, p, l);
	if (!strcasecmp (word, "load"))		command_group_load (g, p, l);
	if (!strcasecmp (word, "save"))		command_group_save (g, p, l);
	if (!strcasecmp (word, "default"))	command_group_default (g, p, l);
	if (!strcasecmp (word, "current"))	command_group_current (g, p, l);
}