#include "../client.h"

void command_editmassrespawn(Client *c, const Seperator *sep)
{
	if (strcasecmp(sep->arg[1], "usage") == 0) {
		c->Message(Chat::White, "#editmassrespawn [exact_match: =]npc_type_name new_respawn_seconds (apply)");
		return;
	}

	std::string search_npc_type;
	if (sep->arg[1]) {
		search_npc_type = sep->arg[1];
	}

	int change_respawn_seconds = 0;
	if (sep->arg[2] && sep->IsNumber(2)) {
		change_respawn_seconds = Strings::ToInt(sep->arg[2]);
	}

	bool change_apply = false;
	if (sep->arg[3] && strcasecmp(sep->arg[3], "apply") == 0) {
		change_apply = true;
	}

	std::string search_encapsulator = "%";
	if (search_npc_type[0] == '=') {

		search_npc_type     = search_npc_type.substr(1);
		search_encapsulator = "";
	}

	std::string query = fmt::format(
		SQL(
			SELECT npc_types.id, spawn2.spawngroupID, spawn2.id, npc_types.name, spawn2.respawntime
			FROM spawn2
			INNER JOIN spawnentry ON spawn2.spawngroupID = spawnentry.spawngroupID
			INNER JOIN npc_types ON spawnentry.npcID = npc_types.id
			WHERE spawn2.zone LIKE '{}'
			AND spawn2.version = '{}'
			AND npc_types.name LIKE '{}{}{}'
			ORDER BY npc_types.id, spawn2.spawngroupID, spawn2.id
		),
		zone->GetShortName(),
		zone->GetInstanceVersion(),
		search_encapsulator,
		search_npc_type,
		search_encapsulator
	);

	std::string status = "(Searching)";
	if (change_apply) {
		status = "(Applying)";
	}

	int results_count = 0;

	auto results = content_db.QueryDatabase(query);
	if (results.Success() && results.RowCount()) {

		results_count = results.RowCount();

		for (auto row : results) {
			c->Message(
				Chat::Yellow,
				fmt::format(
					"NPC (npcid:{}) (sgid:{}) (s2id:{}) [{}] Respawn: Current [{}] New [{}] {}",
					row[0],
					row[1],
					row[2],
					row[3],
					row[4],
					change_respawn_seconds,
					status
				).c_str()
			);
		}

		c->Message(Chat::Yellow, "Found (%i) NPC's that match this search...", results_count);

		if (change_respawn_seconds > 0) {

			if (change_apply) {

				results = content_db.QueryDatabase(
					fmt::format(
						SQL(
							UPDATE spawn2
							SET    respawntime = '{}'
							WHERE id IN(
							SELECT spawn2.id
							FROM spawn2
							INNER JOIN spawnentry ON spawn2.spawngroupID = spawnentry.spawngroupID
							INNER JOIN npc_types ON spawnentry.npcID = npc_types.id
							WHERE spawn2.zone LIKE '{}'
							AND spawn2.version = '{}'
							AND npc_types.name LIKE '{}{}{}'
						)
						),
						change_respawn_seconds,
						zone->GetShortName(),
						zone->GetInstanceVersion(),
						search_encapsulator,
						search_npc_type,
						search_encapsulator
					)
				);

				if (results.Success()) {

					c->Message(Chat::Yellow, "Changes applied to (%i) NPC 'Spawn2' entries", results_count);
					zone->Repop();
				}
				else {

					c->Message(Chat::Yellow, "Found (0) NPC's that match this search...");
				}
			}
			else {

				std::string saylink = fmt::format(
					"#editmassrespawn {}{} {} apply",
					(search_encapsulator.empty() ? "=" : ""),
					search_npc_type,
					change_respawn_seconds
				);

				c->Message(
					Chat::Yellow, "To apply these changes, click <%s> or type [%s]",
					Saylink::Silent(saylink, "Apply").c_str(),
					saylink.c_str()
				);
			}
		}
	}
	else {

		c->Message(Chat::Yellow, "Found (0) NPC's that match this search...");
	}
}

