#include "../client.h"

void command_appearanceeffects(Client *c, const Seperator *sep)
{
	const auto arguments = sep->argnum;
	if (!arguments) {
		c->Message(Chat::White, "Usage: #appearanceeffects help - Display appearance effects help menu");
		c->Message(Chat::White, "Usage: #appearanceeffects remove - Remove all appearance effects saved to your target");
		c->Message(Chat::White, "Usage: #appearanceeffects set [Effect ID] [Slot ID] - Set an appearance effect saved to your target");
		c->Message(Chat::White, "Usage: #appearanceeffects view - Display all appearance effects saved to your target");
		return;
	}

	const bool is_help   = !strcasecmp(sep->arg[1], "help");
	const bool is_remove = !strcasecmp(sep->arg[1], "remove");
	const bool is_set    = !strcasecmp(sep->arg[1], "set");
	const bool is_view   = !strcasecmp(sep->arg[1], "view");

	if (is_help) {
		c->Message(Chat::White, "Usage: #appearanceeffects help - Display appearance effects help menu");
		c->Message(Chat::White, "Usage: #appearanceeffects remove - Remove all appearance effects saved to your target");
		c->Message(Chat::White, "Usage: #appearanceeffects set [Effect ID] [Slot ID] - Set an appearance effect saved to your target");
		c->Message(Chat::White, "Usage: #appearanceeffects view - Display all appearance effects saved to your target");
		return;
	}

	Mob* t = c;
	if (c->GetTarget()) {
		t = c->GetTarget();
	}

	if (is_set) {
		if (arguments != 3 || !sep->IsNumber(2) || !sep->IsNumber(3)) {
			c->Message(Chat::White, "Usage: #appearanceeffects set [Effect ID] [Slot ID] - Set an appearance effect saved to your target");
			return;
		}

		const auto effect_id = Strings::ToUnsignedInt(sep->arg[2]);
		const auto slot_id   = Strings::ToUnsignedInt(sep->arg[3]);

		t->SendAppearanceEffect(
			effect_id,
			0,
			0,
			0,
			0,
			nullptr,
			slot_id,
			0,
			0,
			0,
			0,
			0,
			0,
			0,
			0,
			0
		);
		c->Message(
			Chat::White,
			fmt::format(
				"Appearance Effect ID {} in slot ID {} has been set for {}.",
				effect_id,
				slot_id,
				c->GetTargetDescription(t)
			).c_str()
		);
	} else if (is_remove) {
		t->SendIllusionPacket(
			AppearanceStruct{
				.beard = t->GetBeard(),
				.beard_color = t->GetBeardColor(),
				.drakkin_details = t->GetDrakkinDetails(),
				.drakkin_heritage = t->GetDrakkinHeritage(),
				.drakkin_tattoo = t->GetDrakkinTattoo(),
				.eye_color_one = t->GetEyeColor1(),
				.eye_color_two = t->GetEyeColor2(),
				.face = t->GetLuclinFace(),
				.gender_id = t->GetGender(),
				.hair = t->GetHairStyle(),
				.hair_color = t->GetHairColor(),
				.helmet_texture = t->GetHelmTexture(),
				.race_id = t->GetRace(),
				.send_effects = false,
				.size = t->GetSize(),
				.texture = t->GetTexture(),
			}
		);
		t->ClearAppearanceEffects();
		c->Message(
			Chat::White,
			fmt::format(
				"Appearance Effects have been removed for {}.",
				c->GetTargetDescription(t)
			).c_str()
		);
	} else if (is_view) {
		t->ListAppearanceEffects(c);
	}
}
