local Item = Rarity.Item

local DatabaseSchema = {}

function DatabaseSchema:IsValidItem(entry)
	if not Item:HasAllRequiredFields(entry) then
		Rarity:Print("Required fields are missing")
		return false
	end

	if not Item:IsPersonalLoot(entry) then
		Rarity:Print("Personal loot settings are inconsistent")
		return false
	end

	if not Item:HasOnlyValidFields(entry) then
		Rarity:Print("Unsupported fields are set")
		return false
	end

	if Item:IsHolidayItem(entry) and not Item:IsValidHolidayItem(entry) then
		Rarity:Print("Holiday event settings are inconsistent")
		return false
	end

	if not Item:IsHolidayItem(entry) and Item:IsUsingHolidayProperties(entry) then
		Rarity:Print("Found item using holiday properties, but it's not a holiday item")
		return false
	end

	if Item:IsCollectionItem(entry) and not Item:IsValidCollectionItem(entry) then
		Rarity:Print("Item is using Collection method, but the collectedItemId is not set correctly")
		return false
	end

	if Item:IsArchaeologyItem(entry) and not Item:IsValidArchaeologyItem(entry) then
		Rarity:Print("Archaeology settings are inconsistent")
		return false
	end

	if Item:HasUseMethod(entry) and not Item:IsValidUseMethodItem(entry) then
		Rarity:Print("Found item with use method, but the containers (field:items) are not set or are invalid.")
		return false
	end

	if Item:IsCovenantSpecificItem(entry) and not Item:IsValidCovenantItem(entry) then
		Rarity:Print("Covenant settings are inconsistent")
		return false
	end

	if Item:IsZoneItem(entry) and not Item:IsValidZoneItem(entry) then
		Rarity:Print("Item is using method for 'any mob in a zone' detection, but the Zones are not set correctly")
		return false
	end

	if Item:IsFishingItem(entry) and not Item:IsValidFishingItem(entry) then
		Rarity:Print("Found Fishing item, but the Zones to track in are not set correctly")
		return false
	end

	if Item:HasNPCMethod(entry) and not Item:IsValidNPCItem(entry) then
		Rarity:Print("Found item using NPC method, but the list of NPCs to track is invalid")
		return false
	end

	if Item:HasBossMethod(entry) and not Item:IsValidNPCItem(entry) then
		Rarity:Print("Found item using BOSS method, but the list of NPCs to track is invalid")
		return false
	end

	if Item:HasWaypointData(entry) and not Item:HasValidWaypoints(entry) then
		Rarity:Print("Waypoint data is inconsistent")
		return false
	end

	if not Item:HasWaypointData(entry) then
		Rarity:Print("Waypoint (zone) data is missing")
		return false
	end

	return true
end

function DatabaseSchema:IsValidPet(entry)
	if not Item:IsPet(entry) then
		Rarity:Print("Item is not of type PET")
		return false
	end

	if not entry.spellId then
		Rarity:Print("Expected field spellId is missing")
		return false
	end

	if not entry.creatureId then
		Rarity:Print("Expected field creatureId is missing")
		return false
	end

	return true
end

function DatabaseSchema:IsValidMount(entry)
	if not Item:IsMount(entry) then
		Rarity:Print("Item is not of type MOUNT")
		return false
	end

	if not entry.spellId then
		Rarity:Print("Expected field spellId is missing")
		return false
	end

	return true
end

Rarity.DatabaseSchema = DatabaseSchema
return DatabaseSchema
