local mod	= DBM:NewMod(2566, "DBM-Party-WarWithin", 3, 1268)
local L		= mod:GetLocalizedStrings()

mod:SetRevision("20240609071744")
mod:SetCreatureID(209230)
mod:SetEncounterID(2816)
--mod:SetHotfixNoticeRev(20220322000000)
--mod:SetMinSyncRevision(20211203000000)
--mod.respawnTime = 29
mod.sendMainBossGUID = true

mod:RegisterCombat("combat")

mod:RegisterEventsInCombat(
	"SPELL_CAST_START 424148 420739 444123 419870 444324",
	"SPELL_CAST_SUCCESS 444034",
	"SPELL_AURA_APPLIED 420739",
	"SPELL_AURA_REMOVED 420739"
--	"SPELL_PERIODIC_DAMAGE",
--	"SPELL_PERIODIC_MISSED"
--	"UNIT_SPELLCAST_SUCCEEDED boss1"
)

--NOTE, it's currently possible to detect direction of beam by checking target of spell due to stalker not yet being hidden. DBM puposely avoids this since I expect this to be fixed
--TODO, verify Dash target scanning
--TODO, what to do with stormheart
--[[
(ability.id = 424148 or ability.id = 420739 or ability.id = 444123 or ability.id = 419870 or ability.id = 444324) and type = "begincast"
 or ability.id = 444034 and type = "cast"
 or type = "dungeonencounterstart" or type = "dungeonencounterend"
--]]
local warnUnstableCharge					= mod:NewTargetNoFilterAnnounce(420739, 4)
local warnChainLightning					= mod:NewTargetCountAnnounce(424148, 3, nil, nil, nil, nil, nil, nil, true)--Might be spammy, uncertain cast frequency
local warnLightningDash						= mod:NewTargetNoFilterAnnounce(419870, 3)
local warnStormheart						= mod:NewCountAnnounce(444324, 3)

local specWarnUnstableCharge				= mod:NewSpecialWarningYou(420739, nil, nil, nil, 1, 7)
local yellUnstableCharge					= mod:NewYell(420739)
local yellUnstableChargeFades				= mod:NewShortFadesYell(420739)
local specWarnLightningTorrent				= mod:NewSpecialWarningDodgeCount(444123, nil, nil, nil, 1, 2)
local specWarnLightningDash					= mod:NewSpecialWarningDodgeCount(419870, nil, nil, nil, 1, 2)
--local yellSLightningDash					= mod:NewYell(419870)
--local specWarnGTFO						= mod:NewSpecialWarningGTFO(372820, nil, nil, nil, 1, 8)

local timerChainLightningCD					= mod:NewCDCountTimer(15.7, 424148, nil, nil, nil, 3)--Lowest priority, 15-18, or longer if delayed by torrent
local timerUnstableChargeCD					= mod:NewCDCountTimer(31.6, 420739, nil, nil, nil, 3)--Timer confirmed by bugging out torrent to disable delays
local timerLightningTorrentCD				= mod:NewCDCountTimer(30.3, 444123, nil, nil, nil, 2, nil, DBM_COMMON_L.DEADLY_ICON)--always 30, unless boss is out of range of middle, then it'll be delayed til boss is back in range (i'm sure this will be fixed, cause you can keep boss out of range and disable ability entirely)
local timerLightningDashCD					= mod:NewCDCountTimer(31.6, 419870, nil, nil, nil, 3)--Timer confirmed by bugging out torrent to disable delays
local timerStormheartCD						= mod:NewAITimer(33.9, 444324, nil, nil, nil, 3, nil, DBM_COMMON_L.MYTHIC_ICON)

--local castsPerGUID = {}

mod.vb.chainCount = 0
mod.vb.chargeCount = 0
mod.vb.torrentCount = 0
mod.vb.dashCount = 0
mod.vb.stormheartCount = 0

--function mod:DashTarget(targetname)
--	if not targetname then return end
--	if targetname == UnitName("player") then
--		specWarnLightningDash:Show()
--		specWarnLightningDash:Play("targetyou")
--		yellSLightningDash:Yell()
--	else
--		warnLightningDash:Show(targetname)
--	end
--end

function mod:ChargeTarget(targetname)
	if not targetname then return end
	if targetname == UnitName("player") then
		if self:AntiSpam(5, 1) then
			specWarnUnstableCharge:Show()
			specWarnUnstableCharge:Play("bombyou")
			yellUnstableCharge:Yell()
			--Other voice schedule and countdown yell still triggered by debuff application)
		end
	elseif self:AntiSpam(5, 3) then
		warnUnstableCharge:Show(targetname)
	end
end

function mod:ChainTarget(targetname)
	if not targetname then return end
	warnChainLightning:Show(self.vb.chainCount, targetname)
end

--Update all timers for the Lightning Torrent Delay
local function updateAllTimers(self, ICD)
	DBM:Debug("updateAllTimers running", 3)
	if timerLightningDashCD:GetRemaining(self.vb.dashCount+1) < ICD then
		local elapsed, total = timerLightningDashCD:GetTime(self.vb.dashCount+1)
		local extend = ICD - (total-elapsed)
		DBM:Debug("timerLightningDashCD extended by: "..extend, 2)
		timerLightningDashCD:Update(elapsed, total+extend, self.vb.dashCount+1)
	end
	if timerChainLightningCD:GetRemaining(self.vb.chainCount+1) < ICD then
		local elapsed, total = timerChainLightningCD:GetTime(self.vb.chainCount+1)
		local extend = ICD - (total-elapsed)
		DBM:Debug("timerChainLightningCD extended by: "..extend, 2)
		timerChainLightningCD:Update(elapsed, total+extend, self.vb.chainCount+1)
	end
	if timerUnstableChargeCD:GetRemaining(self.vb.chargeCount+1) < ICD then
		local elapsed, total = timerUnstableChargeCD:GetTime(self.vb.chargeCount+1)
		local extend = ICD - (total-elapsed)
		DBM:Debug("timerUnstableChargeCD extended by: "..extend, 2)
		timerUnstableChargeCD:Update(elapsed, total+extend, self.vb.chargeCount+1)
	end
end

function mod:OnCombatStart(delay)
	self.vb.chainCount = 0
	self.vb.chargeCount = 0
	self.vb.torrentCount = 0
	self.vb.dashCount = 0
	self.vb.stormheartCount = 0
	timerLightningDashCD:Start(2.1, 1)
	timerChainLightningCD:Start(8.2, 1)
	timerUnstableChargeCD:Start(15.5, 1)
	timerLightningTorrentCD:Start(31.3, 1)
	if self:IsMythic() then
		timerStormheartCD:Start(1)
	end
end

--function mod:OnCombatEnd()

--end

function mod:SPELL_CAST_START(args)
	local spellId = args.spellId
	if spellId == 424148 then
		self.vb.chainCount = self.vb.chainCount + 1
		timerChainLightningCD:Start(nil, self.vb.chainCount+1)
		self:ScheduleMethod(0.1, "BossTargetScanner", args.sourceGUID, "ChainTarget", 0.1, 7, true)
	elseif spellId == 420739 then
		self.vb.chargeCount = self.vb.chargeCount + 1
		timerUnstableChargeCD:Start(nil, self.vb.chargeCount+1)
		self:ScheduleMethod(0.1, "BossTargetScanner", args.sourceGUID, "ChargeTarget", 0.1, 7, true, nil, nil, nil, true)--Pre warn for non tanks
	elseif spellId == 444123 and self:AntiSpam(5, 2) then
		self.vb.torrentCount = self.vb.torrentCount + 1
		specWarnLightningTorrent:Show(self.vb.torrentCount)
		specWarnLightningTorrent:Play("watchstep")
		timerLightningTorrentCD:Start(nil, self.vb.torrentCount+1)
		updateAllTimers(self, 8.5)
	elseif spellId == 419870 then
		self.vb.dashCount = self.vb.dashCount + 1
		specWarnLightningDash:Show(self.vb.dashCount)
		specWarnLightningDash:Play("watchstep")
		timerLightningDashCD:Start(nil, self.vb.dashCount+1)
--		self:ScheduleMethod(0.1, "BossTargetScanner", args.sourceGUID, "DashTarget", 0.1, 7, true)
	elseif spellId == 444324 then
		self.vb.stormheartCount = self.vb.stormheartCount + 1
		warnStormheart:Show(self.vb.stormheartCount)
		timerStormheartCD:Start()
	end
end

function mod:SPELL_CAST_SUCCESS(args)
	local spellId = args.spellId
	if spellId == 444034 and self:AntiSpam(5, 2) then--Faster than SPELL_CAST_START but may be hidden later so SCS backup remains
		self.vb.torrentCount = self.vb.torrentCount + 1
		specWarnLightningTorrent:Show(self.vb.torrentCount)
		specWarnLightningTorrent:Play("watchstep")
		timerLightningTorrentCD:Start(nil, self.vb.torrentCount+1)
	end
end

function mod:SPELL_AURA_APPLIED(args)
	local spellId = args.spellId
	if spellId == 420739 then
		if args:IsPlayer() then
			if self:AntiSpam(5, 1) then--Already warned by pre scan
				specWarnUnstableCharge:Show()
				specWarnUnstableCharge:Play("bombyou")
				yellUnstableCharge:Yell()
			end
			specWarnUnstableCharge:ScheduleVoice(2.5, "jumpinpit")
			yellUnstableChargeFades:Countdown(spellId)
		elseif self:AntiSpam(5, 3) then
			warnUnstableCharge:Show(args.destName)
		end
	end
end
--mod.SPELL_AURA_APPLIED_DOSE = mod.SPELL_AURA_APPLIED

function mod:SPELL_AURA_REMOVED(args)
	local spellId = args.spellId
	if spellId == 420739 then
		if args:IsPlayer() then
			yellUnstableChargeFades:Cancel()
		end
	end
end

--[[
function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
	if spellId == 372820 and destGUID == UnitGUID("player") and self:AntiSpam(3, 4) 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 == 193435 then

	end
end
--]]

--[[
function mod:UNIT_SPELLCAST_SUCCEEDED(uId, _, spellId)
	if spellId == 74859 then

	end
end
--]]
