local mod	= DBM:NewMod(2409, "DBM-Party-Shadowlands", 7, 1188)
local L		= mod:GetLocalizedStrings()

mod:SetRevision("20240629024545")
mod:SetCreatureID(164555, 164556)
mod:SetEncounterID(2394)
mod:SetBossHPInfoToHighest()

mod:RegisterCombat("combat")

mod:RegisterEventsInCombat(
	"SPELL_CAST_START 320008 320787 320141 320168 321061 320132 320823",
	"SPELL_CAST_SUCCESS 324047 320132",
	"SPELL_AURA_APPLIED 320786 320147 323877 342905",
	"SPELL_AURA_APPLIED_DOSE 320786 320147",
	"SPELL_AURA_REMOVED 320786 342905",
	"SPELL_AURA_REMOVED_DOSE 320786"
--	"SPELL_PERIODIC_DAMAGE",
--	"SPELL_PERIODIC_MISSED",
--	"UNIT_DIED"
--	"UNIT_SPELLCAST_SUCCEEDED boss1 boss2"
)

--TODO, find a good stack count to warn for soaking.
--TODO, timer for any of buzz saws or warnings for them? It just seems like something that is spammed so for now they are excluded
--TODO, review some of normal warnings if they need to be special
--TODO, shadowfury has splash damage and stun, so figure out how to direct ONE player to hit millificent with it, not all of them
--[[
(ability.id = 320787 or ability.id = 320132 or ability.id = 320823 or ability.id = 320141 or ability.id = 321061) and type = "begincast"
 or ability.id = 324047 and type = "cast"
 or ability.id = 342905
--]]
--General
--local specWarnGTFO					= mod:NewSpecialWarningGTFO(257274, nil, nil, nil, 1, 8)

local timerPhaseCD						= mod:NewStageTimer(30)
--Stage One: Millhouse's Magics
mod:AddTimerLine(DBM:EJ_GetSectionInfo(22026))
local warnSummonPowerCrystal			= mod:NewSpellAnnounce(320787, 3)
local warnThrowBuzzSaw					= mod:NewSpellAnnounce(320168, 3, nil, false)
local warnBleeding						= mod:NewStackAnnounce(320147, 2, nil, "Tank|Healer")

local specWarnDoom						= mod:NewSpecialWarningSpell(320141, nil, 226243, nil, 2, 2, 4)--Mythic only
local specWarnFrostbolt					= mod:NewSpecialWarningInterruptCount(320008, "HasInterrupt", nil, nil, 1, 2)
local specWarnBleeding					= mod:NewSpecialWarningStack(320147, nil, 12, nil, nil, 1, 6)
local specWarnLaser						= mod:NewSpecialWarningMoveTo(323877, nil, 182908, nil, 2, 8, 4)--Mythic only
local yellLaser							= mod:NewYell(323877)

local timerSummonPowerCrystalCD			= mod:NewCDTimer(7.4, 320787, nil, nil, nil, 5)--Usually 8 (sometimes a cast is skipped if it perfectly lines up with a laser, do to this variation
local timerDoomCD						= mod:NewNextTimer(15.8, 320141, 226243, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)--Shortname Doom!!!
local timerLaserCD						= mod:NewNextCountTimer(15, 323877, 182908, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)--Shortname Laser

mod:AddInfoFrameOption(320786, true)
--Stage Two: Millificent's Gadgets
mod:AddTimerLine(DBM:EJ_GetSectionInfo(21798))
--local warnMechanicalBombSquirrel		= mod:NewSpellAnnounce(320825, 3)--Spammed

local specWarnAerialRocketChicken		= mod:NewSpecialWarningDefensive(321061, nil, 45255, nil, 2, 2, 4)--Mythic only
local specWarnShadowfury				= mod:NewSpecialWarningMoveTo(320132, nil, nil, nil, 2, 8, 4)--Mythic only

--local timerMechanicalBombSquirrelCD	= mod:NewCDTimer(13, 320825, nil, nil, nil, 3)
local timerExperimentalSquirrelBombCD	= mod:NewCDTimer(7.9, 320823, nil, nil, nil, 5)
local timerAerialRocketChickenCD		= mod:NewNextTimer(13, 321061, 45255, nil, nil, 3)--Shortname Rocket Chicken
local timerShadowfuryCD					= mod:NewNextCountTimer(13, 320132, nil, nil, nil, 3)

mod:AddRangeFrameOption(8, 320132)

local millHouse, millificent = DBM:EJ_GetSectionInfo(22027), DBM:EJ_GetSectionInfo(22031)
local VulnerabilityStacks = {}
mod.vb.furyCount = 0
mod.vb.laserCount = 0
mod.vb.interruptCount = 0
mod.vb.activeBoss = 1--1-Millhouse, 2-Millificent

function mod:OnCombatStart(delay)
	table.wipe(VulnerabilityStacks)
	self.vb.activeBoss = 1
	--First timers triggered on chilled heart event
	if self.Options.InfoFrame then
		DBM.InfoFrame:SetHeader(DBM:GetSpellName(320786))
		DBM.InfoFrame:Show(5, "table", VulnerabilityStacks, 1)
	end
end

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

function mod:SPELL_CAST_START(args)
	local spellId = args.spellId
	if spellId == 320787 then
		warnSummonPowerCrystal:Show()
		timerSummonPowerCrystalCD:Start()
	elseif spellId == 320008 and self.vb.activeBoss == 1 then
		self.vb.interruptCount = self.vb.interruptCount + 1
		if self:CheckInterruptFilter(args.sourceGUID, false, true) then
			local count = self.vb.interruptCount
			specWarnFrostbolt:Show(args.sourceName, count)
			if count == 1 then
				specWarnFrostbolt:Play("kick1r")
			elseif count == 2 then
				specWarnFrostbolt:Play("kick2r")
			elseif count == 3 then
				specWarnFrostbolt:Play("kick3r")
			elseif count == 4 then
				specWarnFrostbolt:Play("kick4r")
			elseif count == 5 then
				specWarnFrostbolt:Play("kick5r")
			else
				specWarnFrostbolt:Play("kickcast")
			end
		end
	elseif spellId == 320141 then
		specWarnDoom:Show()
		specWarnDoom:Play("aesoon")
--		timerDoomCD:Start()--Not cast more than once per rotation
	elseif spellId == 320168 then
		warnThrowBuzzSaw:Show()
--	elseif spellId == 320825 and self:AntiSpam(5, 3) then
--		warnMechanicalBombSquirrel:Show()
--		timerMechanicalBombSquirrelCD:Start()
	elseif spellId == 321061 then
		specWarnAerialRocketChicken:Show()
		specWarnAerialRocketChicken:Play("defensive")
--		timerAerialRocketChickenCD:Start()--Not cast more than once per rotation
	elseif spellId == 320132 then
		self.vb.furyCount = self.vb.furyCount + 1
		specWarnShadowfury:Show(millificent)
		specWarnShadowfury:Play("behindboss")
		local timer = self.vb.furyCount == 1 and 15 or self.vb.furyCount == 2 and 11 or 8--8 is guessed, since these timers were nerfed to match milhouse
		timerShadowfuryCD:Start(timer, self.vb.furyCount+1)
		if self.Options.RangeFrame then
			DBM.RangeCheck:Show(8)
		end
	elseif spellId == 320823 then
		timerExperimentalSquirrelBombCD:Start()
	end
end

function mod:SPELL_CAST_SUCCESS(args)
	local spellId = args.spellId
	if spellId == 324047 then
		self.vb.laserCount = self.vb.laserCount
		local timer = self.vb.laserCount == 1 and 15 or self.vb.laserCount == 2 and 12 or 8--8 is guessed based on pattern of other boss
		timerLaserCD:Start(timer, self.vb.laserCount+1)
	elseif spellId == 320132 then
		if self.Options.RangeFrame then
			DBM.RangeCheck:Hide()
		end
	end
end

function mod:SPELL_AURA_APPLIED(args)
	local spellId = args.spellId
	if spellId == 320786 then
		local amount = args.amount or 1
		VulnerabilityStacks[args.destName] = amount
		--if args:IsPlayer() and (amount == 12 or amount >= 15 and amount % 2 == 1) then--12, 15, 17, 19
		--	specWarnVulnerabilityStack:Show(amount)
		--	specWarnVulnerabilityStack:Play("stackhigh")
		--end
		if self.Options.InfoFrame then
			DBM.InfoFrame:UpdateTable(VulnerabilityStacks)
		end
	elseif spellId == 320147 then
		local amount = args.amount or 1
		if amount >= 12 then--Guesswork
			if args:IsPlayer() then
				specWarnBleeding:Show(amount)
				specWarnBleeding:Play("stackhigh")
			else
				warnBleeding:Show(args.destName, amount)
			end
		end
	elseif spellId == 323877 then
		if args:IsPlayer() then
			specWarnLaser:Show(millHouse)
			specWarnLaser:Play("behindboss")
		end
	elseif spellId == 342905 then--Millhouse activating
		self.vb.activeBoss = 1
		self.vb.laserCount = 0
		self.vb.interruptCount = 0
		timerExperimentalSquirrelBombCD:Stop()
		timerAerialRocketChickenCD:Stop()
		timerShadowfuryCD:Stop()
		timerSummonPowerCrystalCD:Start(5.9)
		if self:IsMythic() then
			timerLaserCD:Start(22, 1)
			timerDoomCD:Start(45.5)
			--timerPhaseCD:Start(51.2)--Boss pushes when hit with other bosses ability 3x, this is roughly 51-52 if you don't screw up
		else
			timerPhaseCD:Start(30)--Non mythic is just timer, no shadowfury or lasers to push boss
		end
	end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED

function mod:SPELL_AURA_REMOVED(args)
	local spellId = args.spellId
	if spellId == 320786 then
		VulnerabilityStacks[args.destName] = nil
		if self.Options.InfoFrame then
			DBM.InfoFrame:UpdateTable(VulnerabilityStacks)
		end
	elseif spellId == 342905 then--Millhouse Leaving
		self.vb.activeBoss = 2
		self.vb.furyCount = 0
		self.vb.interruptCount = 0
		timerSummonPowerCrystalCD:Stop()
		timerDoomCD:Stop()
		timerLaserCD:Stop()
		timerExperimentalSquirrelBombCD:Start(8.5)
		if self:IsMythic() then
			timerShadowfuryCD:Start(18, 1)
			timerAerialRocketChickenCD:Start(43)
			--timerPhaseCD:Start(51.2)--Boss pushes when hit with other bosses ability 3x, this is roughly 51-52 if you don't screw up
		else
			--On non mythic they swap on a timer, on mythic they seem to swap based on pushing phase with damage? saw pushes between 52.8 and 65
			timerPhaseCD:Start(30)
		end
	end
end

function mod:SPELL_AURA_REMOVED_DOSE(args)
	local spellId = args.spellId
	if spellId == 320786 then
		VulnerabilityStacks[args.destName] = args.amount or 1
		if self.Options.InfoFrame then
			DBM.InfoFrame:UpdateTable(VulnerabilityStacks)
		end
	end
end

--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
	if spellId == 309991 and destGUID == UnitGUID("player") and self:AntiSpam(2, 2) then
		specWarnGTFO:Show(spellName)
		specWarnGTFO:Play("watchfeet")
	end
end
mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE

function mod:UNIT_DIED(args)
	local cid = self:GetCIDFromGUID(args.destGUID)
	if cid == 164555 then

	elseif cid == 164556 then

	end
end

--No longer needed now that chilled heart was added to combat log. Keeping around as backup just in case though
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
	if self.vb.activeBoss == 1 and (spellId == 326804 or spellId == 326684) then--Teleport (326684) no longer seems used, using Millificent's returning rocket jump ID (326804) instead
		self.vb.activeBoss = 2
		timerSummonPowerCrystalCD:Stop()
		timerDoomCD:Stop()
		timerLaserCD:Stop()
		timerExperimentalSquirrelBombCD:Start(6)
		if self:IsMythic() then
			timerShadowfuryCD:Start(17.6)
			timerAerialRocketChickenCD:Start(40.5)
		end
		timerPhaseCD:Start(30)
	elseif self.vb.activeBoss == 2 and spellId == 326799 then--Rocket Jump (unique spell for Millificent leaving) (not to be confused with 326804)
		self.vb.activeBoss = 1
		timerExperimentalSquirrelBombCD:Stop()
		timerAerialRocketChickenCD:Stop()
		timerShadowfuryCD:Stop()
		timerSummonPowerCrystalCD:Start(7)
		if self:IsMythic() then
			timerLaserCD:Start(18.8)
			timerDoomCD:Start(42.3)
		end
		timerPhaseCD:Start(30)
	end
end
--]]

