aura_env.challengeNameMap = {
	[165] = "Graimrail Depot",
	[166] = "Shadowmoon Burial Grounds",
	[197] = "Eye of Azshara",
	[198] = "Darkheart Thicket",
	[199] = "Black Rook Hold",
	[200] = "Halls of Valor",
	[206] = "Neltharion's Lair",
	[207] = "Vault of the Wardens",
	[208] = "Maw of Souls",
	[209] = "The Arcway",
	[210] = "Court of Stars",
	[227] = "Return to Karazhan: Lower",
	[233] = "Cathedral of Eternal Night",
	[234] = "Return to Karazhan: Upper",
	[239] = "Seat of the Triumvirate",
}

---@class Key
---@field name string
---@field role string
---@field level string
---@field time string
---@field score number
aura_env.Key = {
	---@return Key
	---@param name string
	---@param role string
	---@param level string
	---@param time string
	---@param score string
	new = function(name, role, level, time, score)
		local self = setmetatable({}, {
			__index = Key,
			__tostring = function(self)
				local score = self.score
				local keyLevel = tonumber(self.level:match("%d+$")) or 0

				local formattedScore, err = aura_env.ScoreColorer.Interpolate(self.score)
				if not err then
					score = string.format(
						"|cff%02x%02x%02x%d|r",
						formattedScore.r * 255,
						formattedScore.g * 255,
						formattedScore.b * 255,
						self.score
					)
				end

				local formattedLevel, err = aura_env.KeyLevel.Interpolate(keyLevel)
				if not err then
					level = string.format(
						"|cff%02x%02x%02x%s|r",
						formattedLevel.r * 255,
						formattedLevel.g * 255,
						formattedLevel.b * 255,
						self.level
					)
				end

				return string.format("%-30s %-8s %-8s %-10s %-10s", self.name, self.role, level, self.time, score)
			end,
		})
		self.name = name
		self.role = role
		self.level = level
		self.time = time
		self.score = tonumber(score) or 0
		return self
	end,
	---@return string
	hash = function(self) return table.concat({ self.name, self.role, self.level, self.time, self.score }, "/") end,

	---@param self Key
	---@param other Key
	---@return boolean
	compareTo = function(self, other)
		if not self then return true end
		if not other then return false end
		if self.name <= other.name then return true end
		return false
	end,
	---@param self Key
	register = function(self)
		if not WeakAurasSaved.Cyka then WeakAurasSaved.Cyka = {} end
		if not WeakAurasSaved.Cyka.MData then WeakAurasSaved.Cyka.MData = {} end
		WeakAurasSaved.Cyka.MData[self:hash()] = self
	end,
}
