#include <ctype.h>
#include <stdio.h>
#include "interact.h"
#include "socket.h"
#include "command.h"
#include "globals.h"
#include "stringops.h"
#include "random_functs.h"
#include "resp.h"

static char tempstr [2048]; 

int main (int argc, char **argv)
{
	player *current_player;
	char *player, *action, *line_current, *line;
	globals *g;
	int quit = 0, n;

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

	random_seed ();

	if (argc != 2)
	{
		fprintf (stderr, "Usage:%s {global file}\n", *argv);
		exit (1);
	}

	g = globals_load (argv[1]);

	sprintf (tempstr, "connect %s %s", g->name->name, g->password);
	socket_write (g->socket, tempstr);

	if (g->room_home != NULL)
		socket_write (g->socket, g->home_str);

	do
	{
		if (socket_ready (g->socket))
		{
			if (socket_read (g->socket, &line) != 0)
			{
				globals_save (g);
				globals_burn (g);
				exit (1);
			}

			line_current = tokenize (tempstr, line);
			copystring (player, tempstr);
			line_current = tokenize (tempstr, line_current);
			copystring (action, tempstr);

			if (((current_player = player_find
				(g->player_list, player)) == NULL) &&
				(!strcasecmp (action, "says,")))
			{
				player_add (g->player_list, player);
				current_player = g->player_list->tail;
			}

			if ((current_player) &&
				!name_test (g->name, current_player->name))
			{
				if (!strcasecmp (action, g->command_str))
				{
					quit = command (g,
						current_player,
						quotestrip (line_current));
				}

				interact (g, current_player, line);
			}

			if (player) free (player);
			if (action) free (action);
		}
		else
		{
			if ((g->moveodds > 0) &&
				((random_int () % g->moveodds) == 0))
				command_move (g, "");

			if ((g->actodds > 0) &&
				((random_int () % g->actodds) == 0))
			{
				group *rnd_g;
				resp *r;

				rnd_g = group_find (g->group_list, "RANDOM");

				if ((rnd_g != NULL) &&
					(rnd_g->r->priority_total > 0))
				{
					r = resp_find_pri (rnd_g->r,
					n = random_int () %
						rnd_g->r->priority_total);
					resp_parse_output ( r->response,
						g->name->name, g);
				}
			}
		}
	}
	while (!quit);

	if (g->room_home != NULL)
		socket_write (g->socket, g->home_str);

	globals_save (g);
	globals_burn (g);

	return 0;
}