#include "../client.h"

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

	if (!arguments) {
		c->Message(Chat::White, "Usage: #entityvariable clear - Clear all entity variables on yourself or your target");
		c->Message(Chat::White, "Usage: #entityvariable delete [Variable Name] - Delete an entity variable from yourself or your target");
		c->Message(Chat::White, "Usage: #entityvariable set [Variable Name] [Variable Value] - Set an entity variable for yourself or your target");
		c->Message(Chat::White, "Usage: #entityvariable view [Variable Name] - View an entity variable on yourself or your target");
		c->Message(Chat::White, "Note: You can have spaces in variable names and values by wrapping in double quotes like this");
		c->Message(Chat::White, "Example: #entityvariable set \"Test Variable\" \"Test Value\"");
		c->Message(Chat::White, "Note: Variable Value is optional and can be set to empty by not providing a value");
		return;
	}

	const bool is_clear  = !strcasecmp(sep->arg[1], "clear");
	const bool is_delete = !strcasecmp(sep->arg[1], "delete");
	const bool is_set    = !strcasecmp(sep->arg[1], "set");
	const bool is_view   = !strcasecmp(sep->arg[1], "view");

	if (
		!is_clear &&
		!is_delete &&
		!is_set &&
		!is_view
	) {
		c->Message(Chat::White, "Usage: #entityvariable clear - Clear all entity variables on yourself or your target");
		c->Message(Chat::White, "Usage: #entityvariable delete [Variable Name] - Delete an entity variable from yourself or your target");
		c->Message(Chat::White, "Usage: #entityvariable set [Variable Name] [Variable Value] - Set an entity variable for yourself or your target");
		c->Message(Chat::White, "Usage: #entityvariable view [Variable Name] - View an entity variable on yourself or your target");
		c->Message(Chat::White, "Note: You can have spaces in variable names and values by wrapping in double quotes like this");
		c->Message(Chat::White, "Example: #entityvariable set \"Test Variable\" \"Test Value\"");
		c->Message(Chat::White, "Note: Variable Value is optional and can be set to empty by not providing a value");
		return;
	}

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

	if (is_clear) {
		const auto cleared = t->ClearEntityVariables();

		if (!cleared) {
			c->Message(
				Chat::White,
				fmt::format(
					"{} {} not have any entity variables to clear.",
					c->GetTargetDescription(t, TargetDescriptionType::UCYou),
					c == t ? "do" : "does"
				).c_str()
			);

			return;
		}

		c->Message(
			Chat::White,
			fmt::format(
				"Cleared all entity variables for {}.",
				c->GetTargetDescription(t)
			).c_str()
		);
	} else if (is_delete) {
		const std::string variable_name = sep->argplus[2];

		if (!t->EntityVariableExists(variable_name)) {
			c->Message(
				Chat::White,
				fmt::format(
					"{} {} not have an entity variable named '{}'.",
					c->GetTargetDescription(t, TargetDescriptionType::UCYou),
					c == t ? "do" : "does",
					variable_name
				).c_str()
			);

			return;
		}

		t->DeleteEntityVariable(variable_name);

		c->Message(
			Chat::White,
			fmt::format(
				"Deleted an entity variable named '{}' from {}.",
				variable_name,
				c->GetTargetDescription(t)
			).c_str()
		);

		return;
	} else if (is_set) {
		const std::string variable_name  = sep->arg[2];
		const std::string variable_value = sep->arg[3];

		t->SetEntityVariable(variable_name, variable_value);

		c->Message(
			Chat::White,
			fmt::format(
				"Set an entity variable named '{}' to a value of '{}' for {}.",
				variable_name,
				variable_value,
				c->GetTargetDescription(t)
			).c_str()
		);
	} else if (is_view) {
		const auto &l = t->GetEntityVariables();

		uint32 variable_count  = 0;
		uint32 variable_number = 1;
		const std::string search_criteria = arguments ? sep->argplus[2] : "";

		for (const auto &e: l) {
			if (
				search_criteria.empty() ||
				Strings::Contains(Strings::ToLower(e), Strings::ToLower(search_criteria))
			) {
				c->Message(
					Chat::White,
					fmt::format(
						"Variable {} | Name: {} Value: {} | {}",
						variable_number,
						e,
						t->GetEntityVariable(e),
						Saylink::Silent(
							fmt::format(
								"#entityvariable delete {}",
								e
							),
							"Delete"
						)
					).c_str()
				);

				variable_count++;
				variable_number++;
			}
		}

		if (!variable_count) {
			c->Message(
				Chat::White,
				fmt::format(
					"{} {} no entity variables{}.",
					c->GetTargetDescription(t, TargetDescriptionType::UCYou),
					c == t ? "have" : "has",
					(
						!search_criteria.empty() ?
							fmt::format(
								" matching '{}'",
								search_criteria
							) :
							""
					)
				).c_str()
			);

			return;
		}

		c->Message(
			Chat::White,
			fmt::format(
				"{} {} {} entity variable{}{}, would you like to {} all of {} entity variables?",
				c->GetTargetDescription(t, TargetDescriptionType::UCYou),
				c == t ? "have" : "has",
				variable_count,
				variable_count != 1 ? "s" : "",
				(
					!search_criteria.empty() ?
						fmt::format(
							" matching '{}'",
							search_criteria
						) :
						""
				),
				Saylink::Silent(
					"#entityvariable clear",
					"clear"
				),
				c == t ? "your" : "their"
			).c_str()
		);
	}
}
