local mod	= DBM:NewMod("Huhuran", "DBM-AQ40", 1)
local L		= mod:GetLocalizedStrings()

mod:SetRevision("20220330215720")
mod:SetCreatureID(15509)
mod:SetEncounterID(714)
mod:SetModelID(15739)
mod:RegisterCombat("combat")

mod:RegisterEventsInCombat(
	"SPELL_AURA_APPLIED 26180 26053 26051 26068 26050",
	"SPELL_AURA_APPLIED_DOSE 26050",
	"SPELL_AURA_REMOVED 26180 26053 26050",
	"SPELL_CAST_SUCCESS 26053",
	"UNIT_HEALTH mouseover target"
)

local warnSting			= mod:NewTargetNoFilterAnnounce(26180, 2, nil, "RemovePoison")
local warnAcid			= mod:NewStackAnnounce(26050, 3, nil, "Tank", 3)
local warnPoison		= mod:NewSpellAnnounce(26053, 3)
local warnFrenzy		= mod:NewSpellAnnounce(26051, 2, nil, "Healer|Tank|RemoveEnrage", 4)
local warnBerserkSoon	= mod:NewSoonAnnounce(26068, 2)
local warnBerserk		= mod:NewSpellAnnounce(26068, 2)

local specWarnAcid		= mod:NewSpecialWarningStack(26050, nil, 10, nil, nil, 1, 6)
local specWarnAcidTaunt	= mod:NewSpecialWarningTaunt(26050, nil, nil, nil, 1, 2)
local specWarnFrenzy	= mod:NewSpecialWarningDispel(26051, "RemoveEnrage", nil, nil, 1, 6)

local timerSting		= mod:NewBuffFadesTimer(12, 26180, nil, nil, nil, 5, nil, DBM_COMMON_L.POISON_ICON..DBM_COMMON_L.DEADLY_ICON)
local timerStingCD		= mod:NewCDTimer(25, 26180, nil, nil, nil, 3, nil, DBM_COMMON_L.POISON_ICON..DBM_COMMON_L.DEADLY_ICON)
local timerPoisonCD		= mod:NewCDTimer(11, 26053, nil, nil, nil, 3)
local timerPoison		= mod:NewBuffFadesTimer(8, 26053)
local timerFrenzyCD		= mod:NewCDTimer(11.8, 26051, nil, false, 3, 5, nil, DBM_COMMON_L.TANK_ICON..DBM_COMMON_L.HEALER_ICON)--Off by default do to ridiculous variation
local timerAcid			= mod:NewTargetTimer(30, 26050, nil, "Tank", 3, 5, nil, DBM_COMMON_L.TANK_ICON)

mod:AddRangeFrameOption("18", nil, "-Melee")

mod.vb.prewarn_berserk = false
local StingTargets = {}

function mod:OnCombatStart(delay)
	self.vb.prewarn_berserk = false
	table.wipe(StingTargets)
	timerFrenzyCD:Start(9.6-delay)
	timerPoisonCD:Start(11-delay)
	timerStingCD:Start(20-delay)
	if self.Options.RangeFrame then
		DBM.RangeCheck:Show(18)
	end
end

function mod:OnCombatEnd(wipe)
	if self.Options.RangeFrame then
		DBM.RangeCheck:Hide()
	end
end

local function warnStingTargets()
	warnSting:Show(table.concat(StingTargets, "<, >"))
	timerStingCD:Start()
	table.wipe(StingTargets)
end

do
	local NoxiousPoison, WyvernSting, Frenzy, Berserk, AcidSpit = DBM:GetSpellInfo(26053), DBM:GetSpellInfo(26180), DBM:GetSpellInfo(26051), DBM:GetSpellInfo(26068), DBM:GetSpellInfo(26050)
	function mod:SPELL_CAST_SUCCESS(args)
		--if args.spellId == 26053 then
		if args.spellName == NoxiousPoison then
			warnPoison:Show()
			timerPoisonCD:Start()
		end
	end

	function mod:SPELL_AURA_APPLIED(args)
		--if args.spellId == 26180 then
		if args.spellName == WyvernSting and args:IsDestTypePlayer() then
			StingTargets[#StingTargets + 1] = args.destName
			self:Unschedule(warnStingTargets)
			self:Schedule(1, warnStingTargets)
			if args:IsPlayer() then
				timerSting:Start()
			end
		--elseif args.spellId == 26053 and args:IsPlayer() then
		elseif args.spellName == NoxiousPoison and args:IsPlayer() then
			timerPoison:Start()
		--elseif args.spellId == 26051 then
		elseif args.spellName == Frenzy and args:IsDestTypeHostile() then
			if self.Options.SpecWarn26051dispel then
				specWarnFrenzy:Show(args.destName)
				specWarnFrenzy:Play("enrage")
			else
				warnFrenzy:Show(args.destName)
			end
			timerFrenzyCD:Start()
		--elseif args.spellId == 26068 then
		elseif args.spellName == Berserk and args:IsDestTypeHostile() then
			warnBerserk:Show()
			timerStingCD:Stop()
			timerFrenzyCD:Stop()
			timerPoisonCD:Stop()
		--elseif args.spellId == 26050 and not self:IsTrivial(80) then
		elseif args.spellName == AcidSpit and args:IsPlayer() then
			local amount = args.amount or 1
			timerAcid:Start(args.destName)
			if amount >= 10 then
				if args:IsPlayer() then
					specWarnAcid:Show(amount)
					specWarnAcid:Play("stackhigh")
				elseif not DBM:UnitDebuff("player", args.spellName) and not UnitIsDeadOrGhost("player") then
					specWarnAcidTaunt:Show(args.destName)
					specWarnAcidTaunt:Play("tauntboss")
				else
					warnAcid:Show(args.destName, amount)
				end
			else
				warnAcid:Show(args.destName, amount)
			end
		end
	end
	mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED

	function mod:SPELL_AURA_REMOVED(args)
		--if args.spellId == 26180 and args:IsPlayer() then
		if args.spellName == WyvernSting and args:IsDestTypePlayer() then
			timerSting:Stop()
		--elseif args.spellId == 26053 and args:IsPlayer() then
		elseif args.spellName == NoxiousPoison and args:IsPlayer() then
			timerPoison:Stop()
		--elseif args.spellId == 26050 then
		elseif args.spellName == AcidSpit and args:IsPlayer() then
			timerAcid:Stop(args.destName)
		end
	end
end

function mod:UNIT_HEALTH(uId)
	if UnitHealthMax(uId) and UnitHealthMax(uId) > 0 and UnitHealth(uId) / UnitHealthMax(uId) <= 0.38 and self:GetUnitCreatureId(uId) == 15509 and not self.vb.prewarn_berserk then
		warnBerserkSoon:Show()
		self.vb.prewarn_berserk = true
	end
end
