#ifndef EQEMU_ZONE_STATE_SPAWNS_REPOSITORY_H
#define EQEMU_ZONE_STATE_SPAWNS_REPOSITORY_H

#include "../database.h"
#include "../strings.h"
#include "base/base_zone_state_spawns_repository.h"

class ZoneStateSpawnsRepository : public BaseZoneStateSpawnsRepository {
public:
	static void PurgeInvalidZoneStates(Database &database)
	{
		std::string query = R"(
			SELECT zone_id, instance_id
			FROM zone_state_spawns
			GROUP BY zone_id, instance_id
			HAVING COUNT(*) = SUM(
				CASE
					WHEN hp = 0
					 AND mana = 0
					 AND endurance = 0
					 AND (loot_data IS NULL OR loot_data = '')
					 AND (entity_variables IS NULL OR entity_variables = '')
					 AND (buffs IS NULL OR buffs = '')
					THEN 1 ELSE 0
				END
			);
		)";

		auto results = database.QueryDatabase(query);
		if (!results.Success()) {
			return;
		}

		for (auto row: results) {
			uint32 zone_id = std::stoul(row[0]);
			uint32 instance_id = std::stoul(row[1]);

			int rows = ZoneStateSpawnsRepository::DeleteWhere(
				database,
				fmt::format(
					"`zone_id` = {} AND `instance_id` = {}",
					zone_id,
					instance_id
				)
			);

			LogInfo(
				"Purged invalid zone state data for zone [{}] instance [{}] rows [{}]",
				zone_id,
				instance_id,
				Strings::Commify(rows)
			);
		}
	}

	static void PurgeOldZoneStates(Database &database)
	{
		int days = RuleI(Zone, StateSaveClearDays);

		std::string query = fmt::format(
			"DELETE FROM zone_state_spawns WHERE created_at < NOW() - INTERVAL {} DAY",
			days
		);

		auto results = database.QueryDatabase(query);
		if (!results.Success()) {
			LogError("Failed to purge old zone state data older than {} days.", days);
			return;
		}

		if (results.RowsAffected() > 0) {
			LogInfo(
				"Purged old zone state data older than days [{}] rows [{}]",
				days,
				Strings::Commify(results.RowsAffected())
			);
		}
	}

};

#endif //EQEMU_ZONE_STATE_SPAWNS_REPOSITORY_H
