#include "../client.h"

void command_goto(Client *c, const Seperator *sep)
{
	const uint16 arguments = sep->argnum;

	const bool goto_player   = arguments > 0 && !sep->IsNumber(1);
	const bool goto_position = sep->IsNumber(1) && sep->IsNumber(2) && sep->IsNumber(3);
	const bool goto_target   = !arguments && c->GetTarget();

	if (!goto_player && !goto_position && !goto_target) {
		c->Message(Chat::White, "Usage: #goto [x y z] [h]");
		c->Message(Chat::White, "Usage: #goto [player_name]");
		c->Message(Chat::White, "Usage: #goto (Target required)");
		return;
	}

	if (goto_player) {
		const std::string& name = sep->arg[1];
		Client* t = entity_list.GetClientByName(name.c_str());
		if (t) {
			c->MovePC(
				zone->GetZoneID(),
				zone->GetInstanceID(),
				t->GetX(),
				t->GetY(),
				t->GetZ(),
				t->GetHeading()
			);

			c->Message(
				Chat::White,
				fmt::format(
					"Going to player {} in the same zone.",
					name
				).c_str()
			);
		} else if (c->GotoPlayer(name)) {
			c->Message(
				Chat::White,
				fmt::format(
					"Going to player {} in a different zone.",
					name
				).c_str()
			);
		} else {
			c->Message(
				Chat::White,
				fmt::format(
					"Player {} could not be found.",
					name
				).c_str()
			);
		}
	} else if (goto_position) {
		const glm::vec4& position = glm::vec4(
			Strings::ToFloat(sep->arg[1]),
			Strings::ToFloat(sep->arg[2]),
			Strings::ToFloat(sep->arg[3]),
			sep->arg[4] && Strings::IsFloat(sep->arg[4]) ? Strings::ToFloat(sep->arg[4]) : c->GetHeading()
		);
		c->MovePC(
			zone->GetZoneID(),
			zone->GetInstanceID(),
			position.x,
			position.y,
			position.z,
			position.w
		);
	} else if (goto_target) {
		Mob* t = c->GetTarget();

		c->MovePC(
			zone->GetZoneID(),
			zone->GetInstanceID(),
			t->GetX(),
			t->GetY(),
			t->GetZ(),
			t->GetHeading()
		);

		c->Message(
			Chat::White,
			fmt::format(
				"Going to {} in the same zone.",
				c->GetTargetDescription(t)
			).c_str()
		);
	}
}

