local mod = BigWigs:NewBoss("얼음왕관 성채 부가 경고", "Icecrown Citadel")
if not mod then return end
mod:RegisterEnableMob(37955, 36597, 36853, 37533, 37534, 36678, 36626, 36627, 37813, 37200, 37830, 37187, 37920, 37217, 37025, 36855, 37949, 38010, 37890, 38009, 38135)
mod.toggleOptions = {"impaleicon", 70674, "dmicon", 72378, "boiling", "beasticon", 71123, 71159, "sporeicon", {"gasicon", "FLASHSHAKE"}, 70341, {"unbound", "SAY"}, 70352, 70353, {71473, "FLASHSHAKE"}, "beaconicon", "unchainedicon", "valkyricon"}

mod.optionHeaders = {
	impale = "군주 매로우가르",
	[70674] = "여교주 데스위스퍼",
	[72378] = "죽음의 인도자 사울팽",
	[71123] = "구리구리& 예삐",
	sporeicon = "구린내 & 썩은 얼굴",
	[70341] = "교수 퓨트리사이드",
	[71473] = "피의 여왕 라나텔",
	beaconicon = "신드라고사",
	valkyricon = "리치왕",
}
--------------------------------------------------------------------------------
-- Locals
--

local phase = 0
local boilingTargets = mod:NewTargetList()
local gassTargets = mod:NewTargetList()
local IconsTargets = mod:NewTargetList()
local unchainedTargets = mod:NewTargetList()
local essenceTargets = mod:NewTargetList()
local biTargets = mod:NewTargetList()
local counter = 1
local beasts = {}
local valkyrs = {}
local difficulty = 0
local time = 10
local handle_Time = nil
local current = 0

--------------------------------------------------------------------------------
-- Localization
--

local L = mod:NewLocale("koKR", true)
if L then
	--매로우가르
	L.impaleicon = "꿰뚫기 전술"
	L.impaleicon_desc = "꿰뚫기에 대상에게 별, 원 & 다이아몬드 전술을 지정합니다 (승급된 사람만 가능)."
	
	--데스위스퍼
	L.vampiric_message = "흡혈의 힘!"
	
	L.dmicon = "정신 지배 대상 전술"
	L.dmicon_desc = "정신 지배 대상에게 별, 원 & 다이아몬드 전술을 지정합니다 (승급된 사람만 가능)."
	
	--싸울팽
	L.engage_trigger1 = "리치 왕의 힘으로!"
	
	L.boiling = "끓는 피 전술"
	L.boiling_desc = "끓는 피 대상에게 가위, 네모 & 달 전술을 지정합니다 (승급된 사람만 가능)."
	
	L.nova_bar = "~다음 피 폭발"
	
	L.beasticon = "피의 괴물 전술"
	L.beasticon_desc = "피의 괴물에 별, 원 & 다이아몬드 & 세모 전술을 지정합니다."
	
	--구리구리, 예삐
	L.decimate_bar = "~다음 척살"
	L.zombies_bar = "~다음 좀비"
	
	--구린속, 썩은 얼굴
	L.sporeicon = "가스 포자 대상 전술 및 타이머"
	L.sporeicon_desc = "가스 포자 대상에게 별, 원 & 다이아몬드 전술을 지정(승급된 사람만 가능)하고 다음 예상 타이머를 표시합니다."
	
	L.gas_bar = "~다음 가스"
	L.gasicon = "치명 가스 대상 전술"
	L.gasicon_desc = "치명적인 가스 대상에게 해골, 가위 & 네모순으로 전술을 지정합니다 (승급된 사람만 가능)."
	
	--퓨트리사이드
	L.engage_trigger2 = "좋은 소식이에요, 여러분!"
	
	L.puddle_bar = "다음 웅덩이"
	
	L.unbound = "고삐 풀린 역병 공략 타이머"
	L.unbound_desc = "고삐 풀린 역병에 걸린 플레이어 전이를 도우기 위한 타이머 입니다."
	L.unbound_say = "역병! 전이 필요 %s 초전!"
	L.unboundend_say = "역병에 죽어가요! 전이촘!"
	L.unbound_bar = "나의 고삐 역병"
	
	L.oozev_message = "녹색 수액을 공격하세요!"
	L.gasv_message = "붉은 수액를 공격하세요!"
	
	--라나텔
	L.essence_message = "당신은 피의 여왕의 정수 획득!"
	
	--신드라고사
	L.beaconicon = "봉화 대상 전술"
	L.beaconicon_desc = "봉화 대상에게 별, 원 & 다이아몬드 & 세모 & 달 & 네모 전술을 지정합니다 (승급된 사람만 가능)."
	
	L.unchainedicon = "해방된 마법 대상 전술 및 알림"
	L.unchainedicon_desc = "해방된 마법 대상에게 해골, 가위표 & 네모 전술을 지정(승급된 사람만 가능)하고 공격대 경보로\n대상자를 알립니다."
	
	--리치왕
	L.engage_trigger3 = "폴드링, 너는 살려서 최후를 지켜보게 하겠다."
	
	L.valkyricon = "발키리 전술"
	L.valkyricon_desc = "발키리에 별, 원 & 다이아몬드 전술을 지정합니다."
end
L = mod:GetLocale()

--------------------------------------------------------------------------------
-- Initialization
--

function mod:OnBossEnable()
	self:Log("SPELL_AURA_APPLIED", "Vampiric", 70674)
	
	self:Log("SPELL_CAST_START", "BloodNova", 72378, 72379, 72380, 72438, 72439, 72440, 73058)
	self:Log("SPELL_SUMMON", "Beast", 72172, 72173, 72356, 72357, 72358)
	self:Log("SPELL_AURA_APPLIED", "Boiling", 72385, 72442, 72441, 72443)
	
	self:Log("SPELL_CAST_START", "Decimate", 71123)
	self:Log("SPELL_SUMMON", "Zombies", 71159)
	
	self:Log("SPELL_AURA_APPLIED", "Gas", 69240, 71218, 73020, 73019, 72272, 72273)
	
	self:Log("SPELL_CAST_START", "VE", 72840, 72841, 72842, 72843)
	self:Log("SPELL_AURA_APPLIED", "TearGasGo", 71615)
	self:Log("SPELL_AURA_REMOVED", "TearGasEnd", 71615)
	self:Log("SPELL_CAST_SUCCESS", "Puddle", 70341, 70343)
	self:Log("SPELL_AURA_APPLIED", "UPlague", 72855, 72856)
	self:Log("SPELL_AURA_REMOVED", "UPremoved", 72855, 72856)
	self:Log("SPELL_AURA_APPLIED", "OozeVariable", 70352, 74118)
	self:Log("SPELL_AURA_APPLIED", "GasVariable", 70353, 74119)
		
	self:Log("SPELL_AURA_APPLIED", "Unchainedicon", 69762)
	self:Log("SPELL_AURA_APPLIED", "Beaconicon", 70126)
	
	self:Log("SPELL_AURA_APPLIED", "Essence", 71473, 71525, 70867, 71533, 71532)
	
	self:Log("SPELL_SUMMON", "Valkyr", 69037)
	
	self:Log("SPELL_AURA_APPLIED", "Icons", 69065, 69279, 71289)
	self:Log("SPELL_AURA_REMOVED", "Removed", 69065, 71289, 72385, 72442, 72441, 72443, 69279, 69240, 71218, 73020, 73019, 72272, 72273, 70127, 72528, 72529, 72530)
	self:Log("SPELL_AURA_REMOVED", "BeaconRemoved", 70126)
	
	self:Death("Disable", 36626, 36627, 37813, 37217, 37025, 36855, 36678, 36853, 36597)
	
	self:RegisterEvent("PLAYER_REGEN_ENABLED", "CheckForWipe")
	self:Yell("Engage1", L["engage_trigger1"])
	self:Yell("Engage2", L["engage_trigger2"])
	self:Yell("Engage3", L["engage_trigger3"])
end

function mod:Engage1(msg)
	self:Bar(72378, L["nova_bar"], 20, 72378)
end

function mod:Engage2(msg)
	phase = 1
	self:Bar(70341, L["puddle_bar"], 10, 70341)
end

function mod:Engage3(msg)
	counter = 1
    wipe(valkyrs)
end

--------------------------------------------------------------------------------
-- Event Handlers
--

do
	local scheduled = nil
	local current = 8
	local function beaconWarn(spellName)
		scheduled = nil
	end
	function mod:Beaconicon(player, spellId, _, _, spellName)
		current = 8
		biTargets[#biTargets + 1] = player
		if self.db.profile.beaconicon then
			current = current + 1
			SetRaidTarget(player, current)
		end
		if not scheduled then
			scheduled = true
			self:ScheduleTimer(beaconWarn, 0.2, spellName)
		end
	end
end

do
	local function BRemove(player)
		SetRaidTarget(player, 0)
	end

	function mod:BeaconRemoved(player, spellId)
		if self.db.profile.beaconicon then
			handle_Time = self:ScheduleTimer(BRemove, 7, player)
		end
	end
end

do
	local scheduled = nil
	local num = 8
	local function unchainedWarn(spellName)
		mod:TargetMessage("unchainedicon", spellName, unchainedTargets, "Urgent", 69762)
		scheduled = nil
	end
	function mod:Unchainedicon(player, spellId, _, _, spellName)
		num = 8
		unchainedTargets[#unchainedTargets + 1] = player
		if self.db.profile.unchainedicon then
			SetRaidTarget(player, num)
			num = num - 1
		end
		if not scheduled then
			scheduled = true
			self:ScheduleTimer(unchainedWarn, 0.3, spellName)
		end
	end
end

do
	local scheduled = nil
	local num = 7
	local function boilingWarn(spellName)
		scheduled = nil
		num = 7
	end
	function mod:Boiling(player, spellId, _, _, spellName)
		boilingTargets[#boilingTargets + 1] = player
		if self.db.profile.boiling then
			SetRaidTarget(player, num)
			num = num - 1
		end
		if not scheduled then
			scheduled = true
			self:ScheduleTimer(boilingWarn, 0.3, spellName)
		end
	end
end

do
	local scheduled = nil
	local num = 1
	local function iconTargets()
		scheduled = nil
		num = 1
	end
	function mod:Icons(player, spellId)
		IconsTargets[#IconsTargets + 1] = player
		if self.db.profile.impaleicon or self.db.profile.dmicon or self.db.profile.sporeicon then
			SetRaidTarget(player, num)
			num = num + 1
		end
		if not scheduled then
			scheduled = true
			self:ScheduleTimer(iconTargets, 0.2)
		end
	end
end

function mod:Removed(player, spellId)
	if self.db.profile.boiling or self.db.profile.impaleicon or self.db.profile.gasicon or self.db.profile.dmicon or self.db.profile.sporeicon then
		SetRaidTarget(player, 0)
	end
end

do
	local scheduled = nil
	local num = 8
	local function gasWarn(spellName)
		mod:TargetMessage("gasicon", spellName, gassTargets, "Urgent", 69240)
		mod:Bar("gasicon", L["gas_bar"], 20, 69240)
		scheduled = nil
		num = 8
	end
	function mod:Gas(player, spellId, _, _, spellName)
		gassTargets[#gassTargets + 1] = player
		if self.db.profile.gasicon then
			SetRaidTarget(player, num)
			num = num - 1
		end
		if UnitIsUnit(player, "player") then
			self:FlashShake("gasicon")
		end
		if not scheduled then
			scheduled = true
			self:ScheduleTimer(gasWarn, 0.8, spellName)
		end
	end
end

do
	local t = 0
	function mod:Vampiric(_, spellId, _, _, _, _, _, _, _, dGUID)
		local time = GetTime()
		local target = tonumber(dGUID:sub(-12, -7), 16)
		if target and target == 37890 then
			if (time - t) > 3 then
				t = time
				self:Message(70674, L["vampiric_message"], "Attention", spellId)
			end
		end
	end
end

function mod:BloodNova(_, spellId, _, _, spellName)
	self:Message(72378, spellName, "Attention", spellId, "Info")
	self:Bar(72378, L["nova_bar"], 18, spellId)
end

function mod:Decimate(_, spellId, _, _, spellName)
	self:Message(71123, spellName, "Attention", spellId, "Info")
	self:Bar(71123, L["decimate_bar"], 33, spellId)
end

do
	local t = 0
	function mod:Zombies(_, spellId, _, _, spellName)
		local time = GetTime()
		if (time - t) > 5 then
			t = time
			self:Message(71159, spellName, "Important", spellId)
			self:Bar(71159, L["zombies_bar"], 20, spellId)
		end
	end
end

do
	local t = 0
	function mod:Puddle(_, spellId, _, _, spellName)
		local time = GetTime()
		if (time - t) > 5 then
			t = time
			self:Message(70341, spellName, "Important", spellId)
			if phase == 3 then
				self:Bar(70341, L["puddle_bar"], 20, spellId)
			else
				self:Bar(70341, L["puddle_bar"], 35, spellId)
			end
		end
	end
end

function mod:VE(_, spellId)
	phase = phase + 1
	self:SendMessage("BigWigs_StopBar", self, L["puddle_bar"])
	self:ScheduleTimer("phaseNext", 53)
end

function mod:phaseNext()
	self:Bar(70341, L["puddle_bar"], 16, 70341)
end

function mod:TearGasGo(_, spellId, _, _, spellName)
	phase = phase + 1
	self:SendMessage("BigWigs_StopBar", self, L["puddle_bar"])
end

function mod:TearGasEnd()
	self:Bar(70341, L["puddle_bar"], 16, 70341)
end

local function UPwarn()
	time = time - 1
	if counter <= 9 then
		mod:Say("unbound", L["unbound_say"]:format(time))
		counter = counter + 1
	elseif counter > 9 then
		mod:Say("unbound", L["unboundend_say"])
	end
	handle_Time = mod:ScheduleTimer(UPwarn, 1.1)
end

function mod:UPlague(player, spellId, _, _, spellName)
	if self.db.profile.unbound then
		if UnitIsUnit(player, "player") then
			time = 10
			self:Bar("unbound", L["unbound_bar"], 10, spellId)
			self:Say("unbound", L["unbound_say"]:format(time))
			handle_Time = self:ScheduleTimer(UPwarn, 1)
		end
	end
end

function mod:UPremoved(player, spellId)
	if UnitIsUnit(player, "player") then
		self:SendMessage("BigWigs_StopBar", self, L["unbound_bar"])
		self:CancelTimer(handle_Time, true)
		counter = 1
	end
end

function mod:OozeVariable(player, spellId, _, _, spellName)
	if UnitIsUnit(player, "player") then
		self:LocalMessage(70352, L["oozev_message"], "Personal", 70352, "Info")
	end
end

function mod:GasVariable(player, spellId, _, _, spellName)
	if UnitIsUnit(player, "player") then
		self:LocalMessage(70353, L["gasv_message"], "Personal", 70353, "Info")
	end
end

do
	local scheduled = nil
	local function essenceWarn(spellName)
		mod:TargetMessage(71473, spellName, essenceTargets, "Urgent", 71473)
		scheduled = nil
	end
	function mod:Essence(player, spellId, _, _, spellName)
		essenceTargets[#essenceTargets + 1] = player
		if UnitIsUnit(player, "player") then
			self:LocalMessage(71473, L["essence_message"], "Personal", 71473, "Info")
			self:FlashShake(71473)
		end
		if not scheduled then
			scheduled = true
			self:ScheduleTimer(essenceWarn, 0.5, spellName)
		end
	end
end

do
    local f = CreateFrame("Frame")
    local total = 0
	f:SetScript("OnUpdate", function(self, elapsed)
        total = total + elapsed
        if total > 0.3 then
            for uid in pairs(beasts) do
                local mobId = mod:GetUnitIdByGUID(uid)
                if mobId then
                    beasts[uid] = nil
                    SetRaidTarget(mobId, counter)
                    counter = counter + 1
                end
            end
            if counter > 4 then counter = 1 end
            if not next(beasts) then
                self:Hide()
            end
            total = 0
        end
    end)
	f:Hide()
	
    function mod:Beast(_, _, _, _, _, _, _, _, _, dGUID)
        beasts[dGUID] = true
		if self.db.profile.beasticon then
			f:Show()
		end
    end
end

do
    local function Iconremove()
	self:Hide()
	end
	local f = CreateFrame("Frame")
    local total = 0
	f:SetScript("OnUpdate", function(self, elapsed)
        total = total + elapsed
        if total > 0.25 then
            for uid in pairs(valkyrs) do
                local mobId = mod:GetUnitIdByGUID(uid)
                if mobId then
                    valkyrs[uid] = nil
                    SetRaidTarget(mobId, counter)
                    counter = counter + 1
                end
            end
            if counter > 3 then counter = 1 end
            if not next(valkyrs) then
                self:Hide()
            end
            total = 0
        end
    end)
	f:Hide()
	
    function mod:Valkyr(_, _, _, _, _, _, _, _, _, dGUID)
		counter = 1
        valkyrs[dGUID] = true
		if self.db.profile.valkyricon then
			f:Show()
			if difficulty == 3 or difficulty == 4 then
				self:ScheduleTimer(Iconremove, 30)
			end
		end
    end
end
