#include "../client.h"

void command_findspell(Client *c, const Seperator *sep)
{
	if (SPDAT_RECORDS <= 0) {
		c->Message(Chat::White, "Spells not loaded");
		return;
	}

	int arguments = sep->argnum;

	if (arguments == 0) {
		c->Message(Chat::White, "Command Syntax: #findspell [search criteria]");
		return;
	}

	if (sep->IsNumber(1)) {
		int spell_id = std::stoi(sep->arg[1]);
		if (!IsValidSpell(spell_id)) {
			c->Message(
				Chat::White,
				fmt::format(
					"Spell ID {} was not found.",
					spell_id
				).c_str()
			);
		}
		else {
			c->Message(
				Chat::White,
				fmt::format(
					"Spell {}: {}",
					spell_id,
					spells[spell_id].name
				).c_str()
			);
		}
	}
	else {
		std::string search_criteria = Strings::ToLower(sep->argplus[1]);
		int         found_count     = 0;
		for (int    spell_id        = 0; spell_id < SPDAT_RECORDS; spell_id++) {
			auto current_spell = spells[spell_id];
			if (current_spell.name[0] != 0) {
				std::string spell_name       = current_spell.name;
				std::string spell_name_lower = Strings::ToLower(spell_name);
				if (search_criteria.length() > 0 && spell_name_lower.find(search_criteria) == std::string::npos) {
					continue;
				}

				c->Message(
					Chat::White,
					fmt::format(
						"Spell {}: {}",
						spell_id,
						spell_name
					).c_str()
				);
				found_count++;

				if (found_count == 20) {
					break;
				}
			}
		}

		if (found_count == 20) {
			c->Message(Chat::White, "20 Spells found... max reached.");
		}
		else {
			auto spell_message = (
				found_count > 0 ?
					(
						found_count == 1 ?
							"A Spell was" :
							fmt::format("{} Spells were", found_count)
					) :
					"No Spells were"
			);

			c->Message(
				Chat::White,
				fmt::format(
					"{} found.",
					spell_message
				).c_str()
			);
		}
	}
}
