local mod	= DBM:NewMod("NeltharusTrash", "DBM-Party-Dragonflight", 4)
local L		= mod:GetLocalizedStrings()

mod:SetRevision("20240808043723")
--mod:SetModelID(47785)
--mod:SetZone(1234)--FIXME RIGHT ID
mod.isTrashMod = true
mod.isTrashModBossFightAllowed = true

mod:RegisterEvents(
	"SPELL_CAST_START 382708 376186 372566 372311 372201 381663 378282 384597 378847 372615 372561 395427 379406 384161 372262 372971 372223 373084 378827 384623",
	"SPELL_CAST_SUCCESS 376169 372296 374451 384597",
	"SPELL_AURA_APPLIED 384161 373089 371875 373540 372461 382791 383651",
--	"SPELL_AURA_APPLIED_DOSE 339528",
	"SPELL_AURA_REMOVED 382791 383651",
	"UNIT_DIED",
	"GOSSIP_SHOW"
)

--NOTE: Many alerts are drycodes from https://www.wowhead.com/guide/dungeons/neltharus-strategy and could have invalid IDs/events
--TODO, throw lava dodge at start or success? depends on when ground visual appears/locks on.
--TODO, add https://www.wowhead.com/spell=372538/melt ? mob packs have higher prio spells so that's why this one iffy interrupt
--TODO, off interrupt, CC alert for https://www.wowhead.com/spell=372225/dragonbone-axe ?
--TODO, auto gossip the cooking buff? (https://www.wowhead.com/spell=383376/qalashi-goulash)
--[[
(ability.id = 384623 or ability.id = 378827 or ability.id = 382708 or ability.id = 376186 or ability.id = 372566 or ability.id = 372311 or ability.id = 372201 or ability.id = 381663 or ability.id = 378282 or ability.id = 384597 or ability.id = 378847 or ability.id = 372615 or ability.id = 372561 or ability.id = 395427 or ability.id = 379406 or ability.id = 384161 or ability.id = 372262 or ability.id = 372971 or ability.id = 372223 or ability.id = 373084) and type = "begincast"
 or (ability.id = 376169 or ability.id = 372296) and type = "cast"
 or ability.id = 383654
--]]
local warnBlazingSlash						= mod:NewCastAnnounce(384597, 3, nil, nil, "Tank|Healer")
local warnBrutalStrike						= mod:NewCastAnnounce(378847, 3, nil, nil, "Tank|Healer")
local warnReverberatingSlam					= mod:NewCastAnnounce(372971, 3, nil, nil, "Tank|Healer")
local warnMoltencore						= mod:NewCastAnnounce(378282, 4)
local warnBurningRoar						= mod:NewCastAnnounce(395427, 4)
local warnMoteofCombustion					= mod:NewCastAnnounce(384161, 4)
local warnMendingClay						= mod:NewCastAnnounce(372223, 3)
local warnForgestomp						= mod:NewCastAnnounce(384623, 3)
local warnBoldAmbush						= mod:NewTargetNoFilterAnnounce(372566, 3)
local warnBindingSpear						= mod:NewTargetNoFilterAnnounce(372561, 3)
local warnMoltenBarrier						= mod:NewTargetNoFilterAnnounce(382791, 4)
local warnBurningChain						= mod:NewTargetNoFilterAnnounce(374451, 1)

local specWarnTempest						= mod:NewSpecialWarningSpell(381663, nil, nil, nil, 2, 13)--pushbackincoming
local specWarnVolcanicGuard					= mod:NewSpecialWarningDodge(382708, nil, nil, nil, 1, 2)
local specWarnEruptiveCrush					= mod:NewSpecialWarningDodge(376186, nil, nil, nil, 2, 2)
local specWarnMagmaFist						= mod:NewSpecialWarningDodge(372311, nil, nil, nil, 2, 2)
local specWarnExplosiveConcoction			= mod:NewSpecialWarningDodge(378827, nil, nil, nil, 2, 2)
local specWarnScorchingBreath				= mod:NewSpecialWarningDodge(372201, nil, nil, nil, 2, 2)
local specWarnThrowLava						= mod:NewSpecialWarningDodge(379406, nil, nil, nil, 2, 2)
local specWarnPierceMarrow					= mod:NewSpecialWarningDodge(372262, nil, nil, nil, 2, 2)
local specWarnBindingSpear					= mod:NewSpecialWarningDodge(372561, nil, nil, nil, 2, 2)
local specWarnConflagrantBattery			= mod:NewSpecialWarningDodge(372296, nil, nil, nil, 2, 2)
local yellBindingSpear						= mod:NewYell(372561)
local specWarnScorchingFusillade			= mod:NewSpecialWarningMoveAway(372543, nil, nil, nil, 1, 2)
local yellScorchingFusillade				= mod:NewYell(372543)
local specWarnMoteofCombustionYou			= mod:NewSpecialWarningYou(384161, nil, nil, nil, 1, 2)
local yellMoteofCombustion					= mod:NewYell(384161)
local specWarnBoldAmbush					= mod:NewSpecialWarningYou(372566, nil, nil, nil, 1, 2)
local yellBoldAmbush						= mod:NewYell(372566)
local specWarnImbuedMagma					= mod:NewSpecialWarningDispel(372461, "RemoveMagic", nil, nil, 1, 2)
local specWarnFiredUp						= mod:NewSpecialWarningDispel(371875, "RemoveEnrage", nil, nil, 2, 2)
local specWarnMoltenCore					= mod:NewSpecialWarningInterrupt(378282, "HasInterrupt", nil, nil, 1, 2)
local specWarnEmberReach					= mod:NewSpecialWarningInterrupt(372615, "HasInterrupt", nil, nil, 1, 2)
local specWarnBurningRoar					= mod:NewSpecialWarningInterrupt(395427, "HasInterrupt", nil, nil, 1, 2)
local specWarnMoteofCombustion				= mod:NewSpecialWarningInterrupt(384161, "HasInterrupt", nil, nil, 1, 2)
local specWarnMendingClay					= mod:NewSpecialWarningInterrupt(372223, "HasInterrupt", nil, nil, 1, 2)
local specWarnMoltenArmy					= mod:NewSpecialWarningInterrupt(383651, "HasInterrupt", nil, nil, 1, 2)

local timerMagmaFistCD						= mod:NewCDNPTimer(25.4, 372311, nil, nil, nil, 3)
local timerBrutalStrikeCD					= mod:NewCDNPTimer(15.1, 378847, nil, "Tank|Healer", nil, 5)
local timerBlazingSlashCD					= mod:NewCDNPTimer(12.4, 384597, nil, "Tank|Healer", nil, 5)--Doesn't go on cooldown if stunned
local timerVolcanicGuardCD					= mod:NewCDNPTimer(25.1, 382708, nil, nil, nil, 3)
local timerExplosiveConcoctionCD			= mod:NewCDNPTimer(18.2, 378827, nil, nil, nil, 3)
local timerBindingSpearCD					= mod:NewCDNPTimer(25.4, 372561, nil, nil, nil, 3)
local timerMendingClayCD					= mod:NewCDNPTimer(25.4, 372223, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)
local timerBurningRoarCD					= mod:NewCDNPTimer(20.5, 395427, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)
local timerMoltenCoreCD						= mod:NewCDNPTimer(8.1, 378282, nil, nil, nil, 4, nil, DBM_COMMON_L.INTERRUPT_ICON)
local timerEruptiveCrushCD					= mod:NewCDNPTimer(15.7, 376186, nil, nil, nil, 3)
local timerScorchingBreathCD				= mod:NewCDNPTimer(16.1, 372201, nil, nil, nil, 3)
local timerMoteofCombustionCD				= mod:NewCDNPTimer(18.2, 384161, nil, nil, nil, 3)
local timerThrowLavaCD						= mod:NewCDNPTimer(12.1, 379406, nil, nil, nil, 3)
local timerPierceMarrowCD					= mod:NewCDNPTimer(10.9, 372262, nil, nil, nil, 3)
local timerScorchingFusilladeCD				= mod:NewCDNPTimer(23, 372543, nil, nil, nil, 3)
local timerConflagrantBatteryCD				= mod:NewCDNPTimer(22.6, 372296, nil, nil, nil, 3)
--local timerReverbSlamCD					= mod:NewCDNPTimer(17, 372971, nil, nil, nil, 3)--8-17? needs further review
local timerCandescentTempestCD				= mod:NewCDNPTimer(27.5, 381663, nil, nil, nil, 2)
local timerForgestompCD						= mod:NewCDNPTimer(17.3, 384623, nil, nil, nil, 2)

mod:AddGossipOption(true, "Buff")

--local playerName = UnitName("player")

--Antispam IDs for this mod: 1 run away, 2 dodge, 3 dispel, 4 incoming damage, 5 you/role, 6 misc, 7 off interrupt

local magmaMod = DBM:GetModByName("2494")

local cachedGUIDS = {}

function mod:AmbushTarget(targetname)
	if not targetname then return end
	if targetname == UnitName("player") then
		if self:AntiSpam(4, 5) then
			specWarnBoldAmbush:Show()
			specWarnBoldAmbush:Play("targetyou")
		end
		yellBoldAmbush:Yell()
	else
		warnBoldAmbush:Show(targetname)
	end
end

function mod:SPELL_CAST_START(args)
	local spellId = args.spellId
	if not self:IsValidWarning(args.sourceGUID) then return end
	if spellId == 382708 then
		timerVolcanicGuardCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 2) then
			specWarnVolcanicGuard:Show()
			specWarnVolcanicGuard:Play("shockwave")
		end
	elseif spellId == 376186 then
		timerEruptiveCrushCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 2) then
			specWarnEruptiveCrush:Show()
			specWarnEruptiveCrush:Play("watchstep")
		end
	elseif spellId == 372561 then
		timerBindingSpearCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(2, 2) then
			specWarnBindingSpear:Show()
			specWarnBindingSpear:Play("watchstep")
		end
	elseif spellId == 379406 then
		timerThrowLavaCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 2) then
			specWarnThrowLava:Show()
			specWarnThrowLava:Play("watchstep")
		end
	elseif spellId == 372311 then
		timerMagmaFistCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 2) then
			specWarnMagmaFist:Show()
			specWarnMagmaFist:Play("shockwave")
		end
	elseif spellId == 372262 then
		timerPierceMarrowCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 2) then
			specWarnPierceMarrow:Show()
			specWarnPierceMarrow:Play("chargemove")
		end
	elseif spellId == 372201 then
		timerScorchingBreathCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 2) then
			specWarnScorchingBreath:Show()
			specWarnScorchingBreath:Play("shockwave")
		end
	elseif spellId == 381663 then
		timerCandescentTempestCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 6) then
			specWarnTempest:Show()
			specWarnTempest:Play("pushbackincoming")
		end
	elseif spellId == 372566 then
		self:ScheduleMethod(0.1, "BossTargetScanner", args.sourceGUID, "AmbushTarget", 0.1, 8)
	elseif spellId == 372615 and self:CheckInterruptFilter(args.sourceGUID, false, true) then
		specWarnEmberReach:Show(args.sourceName)
		specWarnEmberReach:Play("kickcast")
	elseif spellId == 372223 then
		timerMendingClayCD:Start(nil, args.sourceGUID)
		if self.Options.SpecWarn372223interrupt and self:CheckInterruptFilter(args.sourceGUID, false, true) then
			specWarnMendingClay:Show(args.sourceName)
			specWarnMendingClay:Play("kickcast")
		elseif self:AntiSpam(3, 7) then
			warnMendingClay:Show()
		end
	elseif spellId == 378282 then
		timerMoltenCoreCD:Start(nil, args.sourceGUID)
		if self.Options.SpecWarn378282interrupt and self:CheckInterruptFilter(args.sourceGUID, false, true) then
			specWarnMoltenCore:Show(args.sourceName)
			specWarnMoltenCore:Play("kickcast")
		elseif self:AntiSpam(3, 7) then
			warnMoltencore:Show()
		end
	elseif spellId == 395427 then
		timerBurningRoarCD:Start(nil, args.sourceGUID)
		if self.Options.SpecWarn395427interrupt and self:CheckInterruptFilter(args.sourceGUID, false, true) then
			specWarnBurningRoar:Show(args.sourceName)
			specWarnBurningRoar:Play("kickcast")
		elseif self:AntiSpam(3, 7) then
			warnBurningRoar:Show()
		end
	elseif spellId == 384161 then
		timerMoteofCombustionCD:Start(nil, args.sourceGUID)
		if self.Options.SpecWarn384161interrupt and self:CheckInterruptFilter(args.sourceGUID, false, true) then
			specWarnMoteofCombustion:Show(args.sourceName)
			specWarnMoteofCombustion:Play("kickcast")
		elseif self:AntiSpam(3, 7) then
			warnMoteofCombustion:Show()
		end
	elseif spellId == 384597 then
		if self:AntiSpam(3, 5) then
			warnBlazingSlash:Show()
		end
	elseif spellId == 378847 then
		timerBrutalStrikeCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 5) then
			warnBrutalStrike:Show()
		end
	elseif spellId == 372971 then
--		timerReverbSlamCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 5) then
			warnReverberatingSlam:Show()
		end
	elseif spellId == 373084 then--Scorching Fusillade cast (preferred for timer over debuff)
		timerScorchingFusilladeCD:Start(nil, args.sourceGUID)
	elseif spellId == 378827 then
		timerExplosiveConcoctionCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 2) then
			specWarnExplosiveConcoction:Show()
			specWarnExplosiveConcoction:Play("watchstep")
		end
	elseif spellId == 384623 then
		timerForgestompCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 4) then
			warnForgestomp:Show()
		end
	end
end

function mod:SPELL_CAST_SUCCESS(args)
	local spellId = args.spellId
	if spellId == 376169 and self:AntiSpam(5, 8) then--Throw Experimental Concoction
		---@diagnostic disable-next-line: dbm-sync-checker
		magmaMod:SendSync("TuskRP")
	elseif spellId == 372296 then
		timerConflagrantBatteryCD:Start(nil, args.sourceGUID)
		if self:AntiSpam(3, 2) then
			specWarnConflagrantBattery:Show()
			specWarnConflagrantBattery:Play("watchstep")
		end
	elseif spellId == 374451 then
		warnBurningChain:Show(args.destName)
	elseif spellId == 384597 then
		timerBlazingSlashCD:Start(nil, args.sourceGUID)
	end
end

function mod:SPELL_AURA_APPLIED(args)
	if not self.Options.Enabled then return end
	local spellId = args.spellId
	if spellId == 384161 then
		if args:IsPlayer() then
			specWarnMoteofCombustionYou:Show()
			specWarnMoteofCombustionYou:Play("targetyou")
			yellMoteofCombustion:Yell()
		end
	elseif spellId == 373089 then
		if args:IsPlayer() then
			specWarnScorchingFusillade:Show()
			specWarnScorchingFusillade:Play("scatter")
			yellScorchingFusillade:Yell()
		end
	elseif spellId == 371875 and self:AntiSpam(3, 3) then
		specWarnFiredUp:Show(args.destName)
		specWarnFiredUp:Play("enrage")
	elseif spellId == 373540 then
		warnBindingSpear:CombinedShow(0.3, args.destName)--Can it hit more than one?
		if args:IsPlayer() then
			yellBindingSpear:Yell()
		end
	elseif spellId == 372461 and args:IsDestTypePlayer() and self:CheckDispelFilter("magic") and self:AntiSpam(3, 3) then
		specWarnImbuedMagma:Show(args.destName)
		specWarnImbuedMagma:Play("helpdispel")
	elseif spellId == 382791 then
		warnMoltenBarrier:Show(args.destName)
	elseif spellId == 383651 then--Army Buff
		cachedGUIDS[args.destGUID] = true
	end
end
--mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED

function mod:SPELL_AURA_REMOVED(args)
	local spellId = args.spellId
	if spellId == 382791 then--Molten Barrier
		if cachedGUIDS[args.destGUID] then--still casting
			specWarnMoltenArmy:Show(args.destName)
			specWarnMoltenArmy:Play("kickcast")
		end
	elseif spellId == 383651 then--Army Buff
		cachedGUIDS[args.destGUID] = nil
	end
end

function mod:UNIT_DIED(args)
	local cid = self:GetCIDFromGUID(args.destGUID)
	if cid == 189266 then--Qalashi Trainee
		timerMagmaFistCD:Stop(args.destGUID)
	elseif cid == 192787 then--Qalashi Spinecrusher
		timerBrutalStrikeCD:Stop(args.destGUID)
	elseif cid == 193293 then--Qalashi Warden
		timerVolcanicGuardCD:Stop(args.destGUID)
		timerBlazingSlashCD:Stop(args.destGUID)
	elseif cid == 192786 then--Qalashi Plunderer
		timerExplosiveConcoctionCD:Stop(args.destGUID)
	elseif cid == 189227 then--Qalashi Hunter
		timerBindingSpearCD:Stop(args.destGUID)
	elseif cid == 189265 then--Qalashi Bonetender
		timerMendingClayCD:Stop(args.destGUID)
	elseif cid == 189235 then--Overseer Lahar
		timerBurningRoarCD:Stop(args.destGUID)
		timerEruptiveCrushCD:Stop(args.destGUID)
	elseif cid == 189464 then--Qalashi Irontorch
		timerScorchingBreathCD:Stop(args.destGUID)
		timerMoteofCombustionCD:Stop(args.destGUID)
	elseif cid == 193944 then--Qalashi Lavabearer
		timerThrowLavaCD:Stop(args.destGUID)
	elseif cid == 189467 then--Qalashi Bonesplitter
		timerPierceMarrowCD:Stop(args.destGUID)
	elseif cid == 189466 then--Irontorch Commander
		timerScorchingFusilladeCD:Stop(args.destGUID)
		timerConflagrantBatteryCD:Stop(args.destGUID)
	elseif cid == 189471 then--Qalashi Blacksmith
--		timerReverbSlamCD:Start(args.destGUID)
		timerForgestompCD:Stop(args.destGUID)
	elseif cid == 193291 then--Apex Blazewing
		timerCandescentTempestCD:Stop(args.destGUID)
	elseif cid == 192788 then--Qalashi Thaumaturge
		timerMoltenCoreCD:Stop(args.destGUID)
	end
end

function mod:GOSSIP_SHOW()
	local gossipOptionID = self:GetGossipID()
	if gossipOptionID then
		if self.Options.AutoGossipBuff and (gossipOptionID == 107310) then -- Blacksmith Buff
			self:SelectGossip(gossipOptionID)
		end
	end
end
