#include "../client.h"
#include "../mob_movement_manager.h"

void command_movement(Client *c, const Seperator *sep)
{
	const int arguments = sep->argnum;
	if (!arguments) {
		c->Message(Chat::White, "Usage: #movement [clear|packet|rotate|run|stats|stop|walk]");
		return;
	}

	const bool is_clear  = !strcasecmp(sep->arg[1], "clear");
	const bool is_packet = !strcasecmp(sep->arg[1], "packet");
	const bool is_rotate = !strcasecmp(sep->arg[1], "rotate");
	const bool is_run    = !strcasecmp(sep->arg[1], "run");
	const bool is_stats  = !strcasecmp(sep->arg[1], "stats");
	const bool is_stop   = !strcasecmp(sep->arg[1], "stop");
	const bool is_walk   = !strcasecmp(sep->arg[1], "walk");

	if (
		!is_clear &&
		!is_packet &&
		!is_rotate &&
		!is_run &&
		!is_stats &&
		!is_stop &&
		!is_walk
	) {
		c->Message(Chat::White, "Usage: #movement [clear|packet|rotate|run|stats|stop|walk]");
		return;
	}

	auto &m = MobMovementManager::Get();

	if (is_clear) {
		m.ClearStats();
	} else if (is_packet) {
		Mob *t = c->GetTarget();
		if (!t) {
			c->Message(Chat::White, "You must have a target to use this command.");
			return;
		}

		const float x         = sep->IsNumber(2) ? Strings::ToFloat(sep->arg[2]) : 0.0f;
		const float y         = sep->IsNumber(3) ? Strings::ToFloat(sep->arg[3]) : 0.0f;
		const float z         = sep->IsNumber(4) ? Strings::ToFloat(sep->arg[4]) : 0.0f;
		const float heading   = sep->IsNumber(5) ? Strings::ToFloat(sep->arg[5]) : 0.0f;
		const int   animation = sep->IsNumber(6) ? Strings::ToInt(sep->arg[6]) : 0.0f;

		m.SendCommandToClients(t, x, y, z, heading, animation, ClientRangeAny);
	} else if (is_rotate) {
		Mob *t = c->GetTarget();
		if (!t) {
			c->Message(Chat::White, "You must have a target to use this command.");
			return;
		}

		t->RotateToWalking(t->CalculateHeadingToTarget(c->GetX(), c->GetY()));
	} else if (is_run) {
		Mob *t = c->GetTarget();
		if (!t) {
			c->Message(Chat::White, "You must have a target to use this command.");
			return;
		}

		t->RunTo(c->GetX(), c->GetY(), c->GetZ());
	} else if (is_stats) {
		m.DumpStats(c);
	} else if (is_stop) {
		Mob *t = c->GetTarget();
		if (!t) {
			c->Message(Chat::White, "You must have a target to use this command.");
			return;
		}

		t->StopNavigation();
	} else if (is_walk) {
		Mob *t = c->GetTarget();
		if (!t) {
			c->Message(Chat::White, "You must have a target to use this command.");
			return;
		}

		t->WalkTo(c->GetX(), c->GetY(), c->GetZ());
	}
}
