#include <ctype.h>
#include <stdio.h>
#include "com_room.h"
#include "socket.h"
#include "stringops.h"
#include "command.h"

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

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

	l = tokenize (word, l);
	room_add(g->room_list, word);

	if (p->verbose)
	{
		sprintf (output, "w %s = Room %s added, #%d.", p->name,
			g->room_list->tail->name, g->room_list->size);
		socket_write (g->socket, output);
	}
}

void command_room_delete (globals *g, player *p, char *l)
{
	char room_name[128];
	room *r;

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

	l = tokenize (word, l);

	if (g->room_list->head == NULL)
	{
		if (p->verbose)
		{
                        sprintf (output, "w %s = No rooms currently in \
                                memory.", p->name);
                        socket_write (g->socket, output);
		}
		return;
	}

	if (strlen(word))
	{
		if (*word == '*')
			r = g->room_current;
		else
			r = room_find (g->room_list, word);

		if (r == NULL)
		{
			sprintf (output, "w %s = Room %s not \
				found.", p->name, word);
			socket_write (g->socket, output);

			return;
		}

		strcpy (room_name, r->name);

		if (r == g->room_current)
			g->room_current = NULL;

		room_delete (g->room_list, r);
		if (p->verbose)
		{
			sprintf (output, "w %s = Room %s deleted.",
				p->name, room_name);
			socket_write (g->socket, output);
		}
	}
}

void command_room_current (globals *g, player *p, char *l)
{
	char room_name[128];
	room *r;

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

	l = tokenize (word, l);

	if (g->room_list->head == NULL)
	{
		if (p->verbose)
		{
                        sprintf (output, "w %s = No rooms currently in \
                                memory.", p->name);
                        socket_write (g->socket, output);
		}
		return;
	}

	if (strlen(word))
	{
		if (*word == '*')
			r = g->room_current;
		else
			r = room_find (g->room_list, word);

		if (r == NULL)
		{
			sprintf (output, "w %s = Room %s not \
				found.", p->name, word);
			socket_write (g->socket, output);
			return;
		}

		g->room_current = r;
	}
	if (p->verbose)
	{
		if (g->room_current != NULL)
		{
			sprintf (output, "w %s = Current room is:%d %s",
				p->name, room_num (g->room_list,
				g->room_current), g->room_current->name);
			socket_write (g->socket, output);
		}
		else
		{
			sprintf (output, "w %s = Current room is:-1 Nowhere",
				p->name);
			socket_write (g->socket, output);
		}
	}
}

void command_room_list (globals *g, player *p, char *l)
{
	room *list;
	int num = 1;

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

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

	for (list = g->room_list->head; list != NULL; list = list->next, num++)
	{
		sprintf (output, "w %s = %d %s", p->name, num, list->name);
		socket_write (g->socket, output);
	}
}

void command_room_default (globals *g, player *p, char *l)
{
	l = tokenize (word, l);

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

	if (p->verbose)
	{
		sprintf (output, "w %s = Room file default name:%s",
			p->name, g->room_file);
		socket_write (g->socket, output);
	}
}

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

	l = tokenize (word, l);
	room_burn (g->room_list);
	g->room_list = room_load (strlen (word) ? word : g->room_file);

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

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

	l = tokenize (word, l);
	room_save (g->room_list, strlen (word) ? word : g->room_file);

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

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

	l = tokenize (word, l);

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

	if (!strcasecmp (word, "add"))		command_room_add (g, p, l);
	if (!strcasecmp (word, "delete"))	command_room_delete (g, p, l);
	if (!strcasecmp (word, "list"))		command_room_list (g, p, l);
	if (!strcasecmp (word, "default"))	command_room_default (g, p, l);
	if (!strcasecmp (word, "current"))      command_room_current (g, p, l);
	if (!strcasecmp (word, "load"))		command_room_load (g, p, l);
	if (!strcasecmp (word, "save"))		command_room_save (g, p, l);
}