local mod	= DBM:NewMod(2455, "DBM-Party-Shadowlands", 9, 1194)
local L		= mod:GetLocalizedStrings()

mod:SetRevision("20240808043723")
mod:SetCreatureID(177269)
mod:SetEncounterID(2442)
mod:SetHotfixNoticeRev(20220405000000)

mod:RegisterCombat("combat")

mod:RegisterEventsInCombat(
	"SPELL_CAST_START 350796 355922 353635 351119 350875 351096 351646",
	"SPELL_CAST_SUCCESS 181089 351124",
	"SPELL_AURA_APPLIED 357190 350804 351086",
	"SPELL_AURA_APPLIED_DOSE 350804",
	"SPELL_AURA_REMOVED 350804 351086"
--	"SPELL_PERIODIC_DAMAGE",
--	"SPELL_PERIODIC_MISSED"
)

--TODO, figure out right P1 hyperlight id
--TODO, verify the kind of mechanics that nova and fragmentation are
--[[
(ability.id = 350796 or ability.id = 355922 or ability.id = 353635 or ability.id = 350875 or ability.id = 351096) and type = "begincast"
 or ability.id = 351646 and source.id = 180863 and type = "begincast"
 or (ability.id = 181089 or ability.id = 351124) and type = "cast"
 or ability.id = 351086 and (type = "applybuff" or type = "removebuff")
 or type = "dungeonencounterstart" or type = "dungeonencounterend"
 or ability.id = 351119 and type = "begincast"
--]]
--Stage One: Final Preparations
mod:AddTimerLine(DBM:EJ_GetSectionInfo(23344))
local warnCollapsingStar			= mod:NewCountAnnounce(353635, 3)
local warnCollapsingEnergy			= mod:NewStackAnnounce(353635, 2)
local warnCollapsingEnergyOver		= mod:NewFadesAnnounce(353635, 1)

local specWarnHyperlightSpark		= mod:NewSpecialWarningCount(350796, nil, nil, nil, 2, 2)
local specWarnSummonAssassins		= mod:NewSpecialWarningSwitch(351124, "Dps", nil, nil, 1, 2)
local specWarnShurikenBlitz			= mod:NewSpecialWarningInterruptCount(351119, "HasInterrupt", nil, nil, 1, 2)

local timerHyperlightSparkCD		= mod:NewCDTimer(15.7, 350796, nil, nil, nil, 3)
local timerCollapsingStarCD			= mod:NewNextTimer(60, 353635, nil, nil, nil, 5)
local timerSummonAssassinsCD		= mod:NewCDTimer(41.1, 351124, nil, nil, nil, 1, nil, DBM_COMMON_L.DAMAGE_ICON)

mod:AddInfoFrameOption(357190, true)
--Stage Two: Power Overwhelming
mod:AddTimerLine(DBM:EJ_GetSectionInfo(23340))
local warnPhase2					= mod:NewPhaseAnnounce(2, 2, nil, nil, nil, nil, nil, 2)
local warnPowerOverwhelmingEnded	= mod:NewEndAnnounce(351086, 1)
local warnHyperlightJolt			= mod:NewCountAnnounce(350875, 3)

local specWarnPowerOverwhelming		= mod:NewSpecialWarningSpell(351086, nil, nil, nil, 2, 2)
local specWarnEnergyFragmentation	= mod:NewSpecialWarningDodge(351096, nil, nil, nil, 2, 2)
local specWarnHyperlightNova		= mod:NewSpecialWarningDodge(351646, nil, nil, nil, 2, 2)

local timerPowerOverwhelmingCD		= mod:NewNextTimer(65, 351086, nil, nil, nil, 6)
local timerEnergyFragmentationCD	= mod:NewCDTimer(38.8, 351096, nil, nil, nil, 3)
local timerHyperlightNovaCD			= mod:NewCDTimer(38.8, 351646, nil, nil, nil, 3)

mod.vb.hyperlightCount = 0
mod.vb.starCount = 0
local castsPerGUID = {}

function mod:OnCombatStart(delay)
	self:SetStage(1)
	self.vb.hyperlightCount = 0
	self.vb.starCount = 0
	table.wipe(castsPerGUID)
	timerSummonAssassinsCD:Start(6.9-delay)
	timerHyperlightSparkCD:Start(12.1-delay)
	timerCollapsingStarCD:Start(20.6-delay)
end

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

function mod:SPELL_CAST_START(args)
	local spellId = args.spellId
	if spellId == 350796 or spellId == 355922 then--350796 confirmed, maybe 355922 used on heroic or hard mode?
		self.vb.hyperlightCount = self.vb.hyperlightCount + 1
		specWarnHyperlightSpark:Show(self.vb.hyperlightCount)
		specWarnHyperlightSpark:Play("specialsoon")
		timerHyperlightSparkCD:Start()
	elseif spellId == 353635 then
		self.vb.starCount = self.vb.starCount + 1
		warnCollapsingStar:Show(self.vb.starCount)
		if self:GetStage(1) then
			timerCollapsingStarCD:Start(60)
		end
	elseif spellId == 351119 then
		if not castsPerGUID[args.sourceGUID] then
			castsPerGUID[args.sourceGUID] = 0
		end
		castsPerGUID[args.sourceGUID] = castsPerGUID[args.sourceGUID] + 1
		local count = castsPerGUID[args.sourceGUID]
		if self:CheckInterruptFilter(args.sourceGUID, false, false) then
			specWarnShurikenBlitz:Show(args.sourceName, count)
			if count == 1 then
				specWarnShurikenBlitz:Play("kick1r")
			elseif count == 2 then
				specWarnShurikenBlitz:Play("kick2r")
			elseif count == 3 then
				specWarnShurikenBlitz:Play("kick3r")
			elseif count == 4 then
				specWarnShurikenBlitz:Play("kick4r")
			elseif count == 5 then
				specWarnShurikenBlitz:Play("kick5r")
			else
				specWarnShurikenBlitz:Play("kickcast")
			end
		end
	elseif spellId == 350875 then
		self.vb.hyperlightCount = self.vb.hyperlightCount + 1
		warnHyperlightJolt:Show(self.vb.hyperlightCount)
	elseif spellId == 351096 then
		specWarnEnergyFragmentation:Show()
		specWarnEnergyFragmentation:Play("watchwave")--wave or orb?
		timerEnergyFragmentationCD:Start()
	elseif spellId == 351646 and self:AntiSpam(3, 2) then
		specWarnHyperlightNova:Show()
		specWarnHyperlightNova:Play("watchstep")
		timerHyperlightNovaCD:Start()
	end
end

function mod:SPELL_CAST_SUCCESS(args)
	local spellId = args.spellId
	if spellId == 181089 then
		self:SetStage(2)
		self.vb.starCount = 0
		warnPhase2:Show()
		warnPhase2:Play("ptwo")
		timerHyperlightSparkCD:Stop()
		timerCollapsingStarCD:Stop()
		timerSummonAssassinsCD:Stop()
		timerEnergyFragmentationCD:Stop()
		timerHyperlightNovaCD:Stop()

		timerEnergyFragmentationCD:Start(19.4)
		timerHyperlightNovaCD:Start(40)
	elseif spellId == 351124 then
		specWarnSummonAssassins:Show()
		specWarnSummonAssassins:Play("mobsoon")
		timerSummonAssassinsCD:Start()
	end
end

function mod:SPELL_AURA_APPLIED(args)
	local spellId = args.spellId
	if spellId == 357190 then
		if self.Options.InfoFrame and not DBM.InfoFrame:IsShown() then
			DBM.InfoFrame:SetHeader(args.spellName)
			DBM.InfoFrame:Show(5, "playerbaddebuff", 357190)
		end
	elseif spellId == 350804 then
		if args:IsPlayer() then
			warnCollapsingEnergy:Show(args.destName, args.amount or 1)
		end
	elseif spellId == 351086 then
		self.vb.hyperlightCount = 0
		specWarnPowerOverwhelming:Show()
		specWarnPowerOverwhelming:Play("specialsoon")
		--Below timers are 38 unless overwhelming happens, then at least 12 seconds added to both because of the two 6 second jolt casts
		--However there is still a 50-57 variance once time is added. This is just spell queuing
		--Could probably further correct by detecting when either of these will collide with collapsing star, but it's a 5 man boss so meh
		timerEnergyFragmentationCD:AddTime(12)
		timerHyperlightNovaCD:AddTime(12)
	end
end
mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED

function mod:SPELL_AURA_REMOVED(args)
	local spellId = args.spellId
	if spellId == 350804 and args:IsPlayer() then
		warnCollapsingEnergyOver:Show()
	elseif spellId == 351086 then
		warnPowerOverwhelmingEnded:Show()
		timerCollapsingStarCD:Start(25)
		timerPowerOverwhelmingCD:Start(65.2)
	end
end

--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
	if spellId == 320366 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
--]]
