---@type Message[]
aura_env.messageQueue = {}
aura_env.separator = "\\"
aura_env.addonprefix = "STINKY_DETECTOR"
RegisterAddonMessagePrefix(aura_env.addonprefix)

---@type string[]
local toNotify = { "Succpotato", "Extazyk", "Smokefire", "Smokemantra", "Хихихантер", "Муркот", "Растафаркрай" }
local toNotify = { "Succpotato", "Totleta" }

---@class Message
---@field message string
---@field to string
---@field channel string
---@field addon boolean
Message = {
	message = "",
	to = "",
	channel = "",
	addon = false,

	---@param message string
	---@param to string
	---@param channel string
	---@param addon? boolean
	---@return Message
	new = function(message, to, channel, addon)
		local self = setmetatable({}, {
			__index = Message
		})
		self.message = message
		self.to = to
		self.channel = channel
		self.addon = addon or false
		return self
	end,

	---@param stinky Stinky
	QueueNotifyGuild = function(stinky)
		if not aura_env.config.stinkyNotifyGuild then return end
		if stinky.threat < aura_env.config.threatThreshold then
			if aura_env.config.debug then
				print(string.format("Skipping notify guild due to low threat (%d < %d)",
					stinky.threat, aura_env.config.threatThreshold))
			end
			return
		end

		if aura_env.config.debug then print("Queueing notify guild:") end
		local message = Message.new(stinky:FormMessage(), nil, "GUILD")
		if aura_env.config.debug then DevTools_Dump(message) end
		table.insert(aura_env.messageQueue, message)
	end,
	---@param stinky Stinky
	QueueNotifyWhisper = function(stinky)
		if not aura_env.config.stinkyNotifyWhisper then return end
		if stinky.threat < aura_env.config.threatThreshold then
			if aura_env.config.debug then
				print(string.format("Skipping notify whisper due to low threat (%d < %d)",
					stinky.threat, aura_env.config.threatThreshold))
			end
			return
		end

		if aura_env.config.debug then print("Queueing notify whisper:") end
		local text = stinky:FormMessage()
		for _, to in ipairs(toNotify) do
			local message = Message.new(text, to, "WHISPER")
			if aura_env.config.debug then DevTools_Dump(message) end
			table.insert(aura_env.messageQueue, message)
		end
	end,

	---@param stinky Stinky
	QueueNotifyAddonGuild = function(stinky)
		if not aura_env.config.stinkyNotifyAddonGuild then return end
		if stinky.threat < aura_env.config.threatThreshold then
			if aura_env.config.debug then
				print(string.format("Skipping notify addon guild due to low threat (%d < %d)",
					stinky.threat, aura_env.config.threatThreshold))
			end
			return
		end

		if aura_env.config.debug then print("Queueing notify addon guild:") end
		local message = Message.new(stinky:FormAddonMessage(), nil, "GUILD", true)
		if aura_env.config.debug then DevTools_Dump(message) end
		table.insert(aura_env.messageQueue, message)
	end,
	---@param stinky Stinky
	QueueNotifyAddonWhisper = function(stinky)
		if not aura_env.config.stinkyNotifyAddonWhisper then return end
		if stinky.threat < aura_env.config.threatThreshold then
			if aura_env.config.debug then
				print(string.format("Skipping notify addon whisper due to low threat (%d < %d)",
					stinky.threat, aura_env.config.threatThreshold))
			end
			return
		end

		if aura_env.config.debug then print("Queueing notify addon whisper:") end
		local text = stinky:FormMessage()
		for _, to in ipairs(toNotify) do
			local message = Message.new(text, to, "WHISPER", true)
			if aura_env.config.debug then DevTools_Dump(message) end
			table.insert(aura_env.messageQueue, message)
		end
	end,

	---@param faction string
	---@param source string
	---@param destination string
	---@param spellName string
	QueueNotifyKilledAddonGuild = function(faction, source, destination, spellName)
		if not aura_env.config.killNotifyAddonGuild then return end
		if aura_env.config.debug then print("Queueing notify addon guild:") end
		local text = string.format("%s%s%s%s%s%s%s", faction, aura_env.separator, source, aura_env.separator, destination,
			aura_env.separator, spellName)
		local message = Message.new(text, nil, "GUILD", true)
		if aura_env.config.debug then DevTools_Dump(message) end
		table.insert(aura_env.messageQueue, message)
	end,
	---@param faction string
	---@param source string
	---@param destination string
	---@param spellName string
	QueueNotifyKilledAddonWhisper = function(faction, source, destination, spellName)
		if not aura_env.config.killNotifyAddonWhisper then return end
		if aura_env.config.debug then print("Queueing notify addon whisper:") end
		local text = string.format("%s%s%s%s%s%s%s", faction, aura_env.separator, source, aura_env.separator, destination,
			aura_env.separator, spellName)
		for _, to in ipairs(toNotify) do
			local message = Message.new(text, to, "WHISPER", true)
			if aura_env.config.debug then DevTools_Dump(message) end
			table.insert(aura_env.messageQueue, message)
		end
	end,

	---@param faction string
	---@param source string
	---@param destination string
	---@param spellName string
	QueueNotifyKilledGuild = function(faction, source, destination, spellName)
		if not aura_env.config.killNotifyGuild then return end
		if aura_env.config.debug then print("Queueing notify guild:") end
		local text = string.format("%s %s убил %s с помощью %s", faction, source, destination, spellName)
		local message = Message.new(text, nil, "GUILD", true)
		if aura_env.config.debug then DevTools_Dump(message) end
		table.insert(aura_env.messageQueue, message)
	end,
	---@param faction string
	---@param source string
	---@param destination string
	---@param spellName string
	QueueNotifyKilledWhisper = function(faction, source, destination, spellName)
		if not aura_env.config.killNotifyWhisper then return end
		if aura_env.config.debug then print("Queueing notify whisper:") end
		local text = string.format("%s %s убил %s с помощью %s", faction, source, destination, spellName)
		for _, to in ipairs(toNotify) do
			local message = Message.new(text, to, "WHISPER", true)
			if aura_env.config.debug then DevTools_Dump(message) end
			table.insert(aura_env.messageQueue, message)
		end
	end
}

---@class Stinky
---@field name string
---@field threat number 1-10 10 being maxima threat
---@field note string|nil
Stinky = {
	name = "",
	threat = 0,
	note = "",

	---@param name string
	---@param threat number
	---@param note string|nil
	---@return Stinky
	new = function(name, threat, note)
		local self = setmetatable({}, {
			__index = Stinky
		})
		self.name = name
		self.threat = threat
		self.note = note
		return self
	end,

	---@param self Stinky
	---@return string
	FormMessage = function(self)
		return string.format("%s в Оргриммаре!", self.name)
	end,
	---@param self Stinky
	---@return string
	FormAddonMessage = function(self)
		return string.format("%s%s%s%s%s", self.name, aura_env.separator, self.threat, aura_env.separator, self.note)
	end,
}

if not WeakAurasSaved.Cyka then WeakAurasSaved.Cyka = {} end
if not WeakAurasSaved.Cyka.PlayerFactionCache then WeakAurasSaved.Cyka.PlayerFactionCache = {} end
WeakAurasSaved.Cyka.Stinkies = {
	["Totleta"] = Stinky.new("Totleta", 1),

	["Redbulka"] = Stinky.new("Redbulka", 5),
	["Курлык"] = Stinky.new("Курлык", 5),
	["Riener"] = Stinky.new("Riener", 5),
	["Unwashed"] = Stinky.new("Unwashed", 5),
	["Ловилуну"] = Stinky.new("Ловилуну", 5),
	["Фоська"] = Stinky.new("Фоська", 5,
		"if she comes here to orgrimmar. then she will be with 1 or 2 friends. they can be killed. but it may be difficult"),
	["Korovadura"] = Stinky.new("Korovadura", 5),
	["Pizdosorkam"] = Stinky.new("Pizdosorkam", 3, "Horde"),
	["Неонанируй"] = Stinky.new("Неонанируй", 5),
	["Bunkkeer"] = Stinky.new("Bunkkeer", 5),
	["Dewdew"] = Stinky.new("Dewdew", 4),
	["Психопаточка"] = Stinky.new("Психопаточка", 5),
	["Empanao"] = Stinky.new("Empanao", 3, "Horde"),
	["Стелсон"] = Stinky.new("Стелсон", 1, "Apyr"),
	["Trafik"] = Stinky.new("Trafik", 1, "Has agreed to behave, is french (also horde)"),
	["Aye"] = Stinky.new("Aye", 8, "Actually a pretty good player, sadly... Part of DNF, says murkot"),
	["Paskoo"] = Stinky.new("Paskoo", 2, "Really stinky but he's horde..."),
	["Армагид"] = Stinky.new("Армагид", 3),
	["Паладийпал"] = Stinky.new("Паладийпал", 5, "Possibly related to Oakskin"),
	["Hmor"] = Stinky.new("Hmor", 4, "Horde"),
	["Oakskin"] = Stinky.new("Oakskin", 5),
	["Шпек"] = Stinky.new("Шпек", 5),
	["Yunami"] = Stinky.new("Yunami", 5, "He is a loser but he's also horde... So I can't kill him even if I wanted to"),
	["Joule"] = Stinky.new("Joule", 5),
	["Rattenfenger"] = Stinky.new("Rattenfenger", 8, "Possibly related to DNF, he is a sign of trouble"),
	["Blessly"] = Stinky.new("Blessly", 8, "Possibly related to DNF, he is a sign of trouble"),
	["Ramáladni"] = Stinky.new("Ramáladni", 7,
		"Does not cause trouble and the guy is a behemoth... It is a lot of effort to remove him"),
	["Асталабиста"] = Stinky.new("Асталабиста", 5),
	["Srakonyh"] = Stinky.new("Srakonyh", 5, "Agreed to leave him alone until he kills someone again"),
	["Залупотряс"] = Stinky.new("Залупотряс", 2,
		"Муркот: I understand if one of them killed the newbies. then you did everything right. they seem friendly but I also warned them not to hit the newbies"),
	["Чмодвенк"] = Stinky.new("Чмодвенк", 5,
		"Муркот: I understand if one of them killed the newbies. then you did everything right. they seem friendly but I also warned them not to hit the newbies"),
}

aura_env.raceFactions = {
	["Orc"] = "Horde",
	["Undead"] = "Horde",
	["Tauren"] = "Horde",
	["Troll"] = "Horde",
	["BloodElf"] = "Horde",
	["Goblin"] = "Horde",
	["Human"] = "Alliance",
	["Dwarf"] = "Alliance",
	["NightElf"] = "Alliance",
	["Gnome"] = "Alliance",
	["Draenei"] = "Alliance",
	["Worgen"] = "Alliance",
}

local killSpamTime = 30
local recentlyKilled = {}
aura_env.RegisterKill = function(source, destination, spellName, overkill)
	if recentlyKilled[source] and recentlyKilled[source] > GetTime() - killSpamTime then
		print("Death already reported")
	end
	if overkill <= 0 then return end

	local faction = "Неизвестная фракция"
	if WeakAurasSaved.Cyka.PlayerFactionCache[source] then
		faction = WeakAurasSaved.Cyka.PlayerFactionCache[source]
	end

	Message.QueueNotifyKilledGuild(faction, source, destination, spellName)
	Message.QueueNotifyKilledWhisper(faction, source, destination, spellName)
	Message.QueueNotifyKilledAddonGuild(faction, source, destination, spellName)
	Message.QueueNotifyKilledAddonWhisper(faction, source, destination, spellName)

	recentlyKilled[source] = GetTime()
end

aura_env.stinkies = WeakAurasSaved.Cyka.Stinkies
aura_env.localStinkies = {}

---@param name string
aura_env.StinkyDetected = function(name)
	if not aura_env.localStinkies[name] or aura_env.localStinkies[name] <
		GetTime() - 60 then
		local stinky = aura_env.stinkies[name]
		PlaySoundFile("Interface\\Sounds\\Domination.ogg", "Master")
		Message.QueueNotifyGuild(stinky)
		Message.QueueNotifyWhisper(stinky)
		Message.QueueNotifyAddonGuild(stinky)
		Message.QueueNotifyAddonWhisper(stinky)
	end
	aura_env.localStinkies[name] = GetTime()
end

local friends = {}
local numfriends = GetNumFriends()
for i = 1, numfriends do
	local name = GetFriendInfo(i)
	friends[name] = true
end
for k, v in pairs(WeakAurasSaved.Cyka.Stinkies) do
	if not friends[k] then
		AddFriend(k)
	end
end
C_Timer.After(1, function()
	local numfriends = GetNumFriends()
	for i = 1, numfriends do
		local name = GetFriendInfo(i)
		if WeakAurasSaved.Cyka.Stinkies[name] then
			C_Timer.After(1, function()
				-- print(name .. " " .. i .. " Stinky!")
				SetFriendNotes(i, "STINKY")
			end)
		else
			C_Timer.After(1, function()
				-- print(name .. " " .. i .. " Not stinky")
				SetFriendNotes(i, "Not stinky?")
			end)
		end
	end
end)

--/run WeakAurasSaved.Cyka.Stinkies["Totleta"] = true
-- /dump WeakAurasSaved.Cyka.Stinkies
