local mod	= DBM:NewMod(1208, "DBM-Party-WoD", 5, 556)
local L		= mod:GetLocalizedStrings()
local wowToc = DBM:GetTOC()

mod.statTypes = "normal,heroic,mythic,challenge,timewalker"

if (wowToc >= 100200) then
	mod.upgradedMPlus = true
end

mod:SetRevision("20240219232547")
mod:SetCreatureID(82682)
mod:SetEncounterID(1751)
mod:SetHotfixNoticeRev(20231020000000)
--mod:SetMinSyncRevision(20211203000000)

mod:RegisterCombat("combat")

if (wowToc >= 100200) then
	--Patch 10.2 or later
	mod:RegisterEventsInCombat(
		"SPELL_CAST_START 428139 427863",
		"SPELL_AURA_APPLIED 427899 428082",
		"SPELL_PERIODIC_DAMAGE 426991",
		"SPELL_PERIODIC_MISSED 426991"
	)

	--[[
	(ability.id = 428139) and type = "begincast"
	 or (ability.id = 428177 or ability.id = 427899 or ability.id = 428082) and type = "applybuff"
	 or type = "dungeonencounterstart" or type = "dungeonencounterend"
	 or (ability.id = 427899 or ability.id = 428082) and type = "begincast"
	--NOTE, You can detect cinder and glacial earlier on main boss with cast start, BUT spore image only has applied.
	--NOTE, sometimes boss bugs and starts casting random shit at random times (ie breaks order)
	--For consistency sake, applied is used for both. Spacial has cast start for both so that's used for both
	--TODO, visit warning types for each type, just to avoid double special alerts for overlaps which basically
	--TODO, target scan who the boss is targetting during arcane to see who furthest distance is?
	--]]
	local warnCinderboltStorm							= mod:NewSpellAnnounce(427899, 4)

	local specWarnGlacialFusion							= mod:NewSpecialWarningDodge(428082, nil, nil, nil, 2, 2)
	local specWarnSpetialCompression					= mod:NewSpecialWarningCount(428139, nil, nil, nil, 2, 13)
	local specWarnFrostbolt								= mod:NewSpecialWarningInterrupt(427863, "HasInterrupt", nil, nil, 1, 2)--Prio frostbolt interrupts over other two, because of slow
	local specWarnGTFO									= mod:NewSpecialWarningGTFO(426991, nil, nil, nil, 1, 8)

	local timerCinderboltStormCD						= mod:NewCDTimer(60, 427899, nil, nil, nil, 2)
	local timerGlacialFusionCD							= mod:NewCDTimer(60, 428082, nil, nil, nil, 3)
	local timerSpetialCompressionCD						= mod:NewCDTimer(60, 428139, nil, nil, nil, 5)
--	local timerComboCD									= mod:NewCDComboTimer(20)--Use on mythic instead?

	mod.vb.pullCount = 0
	mod.vb.comboCount = 0

	--local grip = DBM:GetSpellInfo(56689)

	--Fire alone (no previos yet, arcane in future combos)
	--Frost + Previous (fire)
	--Arcane + Previous (frost)
	--Repeats
	--This hardcoded function is required because sometimes boss and add invert who casts what (ie it's right combo, but the previous and current are inverted)
	local function comboHandler(self)
		self.vb.comboCount = self.vb.comboCount + 1
		--Fire alone first time (fire + arcane for 4)
		if self.vb.comboCount % 3 == 1 then
			--So next is Frost + Fire
			timerGlacialFusionCD:Start(18.4)
			timerCinderboltStormCD:Start(18.4)
			--timerComboCD:Start(DBM_COMMON_L.AOEDAMAGE, DBM_COMMON_L.ORBS)
		--Frost + Previous (fire)
		elseif self.vb.comboCount % 3 == 2 then
			--So next is Arcane + Frost
			timerSpetialCompressionCD:Start(18.4)
			timerGlacialFusionCD:Start(18.4)
			--timerComboCD:Start(grip, DBM_COMMON_L.ORBS)
		--Arcane + Previous (frost)
		else
			--So next is fire + arcane
			timerCinderboltStormCD:Start(19.4)
			timerSpetialCompressionCD:Start(19.4)
			--timerComboCD:Start(DBM_COMMON_L.AOEDAMAGE, grip)
		end
	end

	function mod:OnCombatStart(delay)
		self.vb.pullCount = 0
		self.vb.comboCount = 0
		timerCinderboltStormCD:Start(3)
		if not self:IsMythic() then--Mythic schedulers timers differently
			timerGlacialFusionCD:Start(24.1)
			timerSpetialCompressionCD:Start(43.7)
		end
		--Haven't seen bug in a while, guess print did it's job. Will remove if no one reports further problems with this boss for a while.
		--DBM:AddMsg("This boss is very buggy and blizzard has ignored bug reports on the bugs. Sol sometimes resets her rotation back to cinder at random. Now, I've decided to reinstate showing what next rotation is SUPPOSED TO BE but if it's wrong don't complain to me, complain to blizzard for not fixing rotation bug")
	end

	function mod:OnCombatEnd(wipe, secondRun)
		if not wipe and not secondRun then
			DBM:GetModByName("EverBloomTrash"):PortalRP()
		end
	end

	--Another great log with variances
	--https://www.warcraftlogs.com/reports/79WcKGf4znd8qgj2#pins=2%24Off%24%23244F4B%24expression%24%09(ability.id%20%3D%20428139)%20and%20type%20%3D%20%22begincast%22%0A%09%20or%20(ability.id%20%3D%20428177%20or%20ability.id%20%3D%20427899%20or%20ability.id%20%3D%20428082)%20and%20type%20%3D%20%22applybuff%22%0A%09%20or%20type%20%3D%20%22dungeonencounterstart%22%20or%20type%20%3D%20%22dungeonencounterend%22&view=events&boss=61279&difficulty=10&wipes=2

	--boss first / add second
	--expected:
	--fire alone
	--ice and fire
	--arcane and ice
	--fire and arcane

	--wtf:
	--Fire alone
	--ice and fire
	--fire and arcane
	--ice and fire
	--https://www.warcraftlogs.com/reports/4ftYFxqJajW3PvVb#fight=6&pins=2%24Off%24%23244F4B%24expression%24%09(ability.id%20%3D%20428139)%20and%20type%20%3D%20%22begincast%22%0A%09%20or%20(ability.id%20%3D%20428177%20or%20ability.id%20%3D%20427899%20or%20ability.id%20%3D%20428082)%20and%20type%20%3D%20%22applybuff%22%0A%09%20or%20type%20%3D%20%22dungeonencounterstart%22%20or%20type%20%3D%20%22dungeonencounterend%22&view=events
	function mod:SPELL_CAST_START(args)
		local spellId = args.spellId
		if spellId == 428139 then
			self.vb.pullCount = self.vb.pullCount + 1
			specWarnSpetialCompression:Show(self.vb.pullCount)
			specWarnSpetialCompression:Play("pullin")
			if self:IsMythic() then
				if args:GetSrcCreatureID() == 82682 then--Source is Boss
					comboHandler(self)
				end
			else
				timerSpetialCompressionCD:Start(60)
			end
		elseif spellId == 427863 then
			if self:CheckInterruptFilter(args.sourceGUID, false, true) then
				specWarnFrostbolt:Show(args.sourceName)
				specWarnFrostbolt:Play("kickcast")
			end
		end
	end

	function mod:SPELL_AURA_APPLIED(args)
		local spellId = args.spellId
		if spellId == 427899 then
			warnCinderboltStorm:Show()
			if self:IsMythic() then
				if args:GetSrcCreatureID() == 82682 then--Source is Boss
					comboHandler(self)
				end
			else
				timerCinderboltStormCD:Start(60)
			end
		elseif spellId == 428082 then
			specWarnGlacialFusion:Show()
			specWarnGlacialFusion:Play("watchorb")
			if self:IsMythic() then
				if args:GetSrcCreatureID() == 82682 then--Source is Boss
					comboHandler(self)
				end
			else
				timerGlacialFusionCD:Start(60)
			end
		end
	end

	function mod:SPELL_PERIODIC_DAMAGE(_, _, _, _, destGUID, _, _, _, spellId, spellName)
		if spellId == 426991 and destGUID == UnitGUID("player") and self:AntiSpam(3, 2) then
			specWarnGTFO:Show(spellName)
			specWarnGTFO:Play("watchfeet")
		end
	end
	mod.SPELL_PERIODIC_MISSED = mod.SPELL_PERIODIC_DAMAGE
else
	mod:RegisterEventsInCombat(
		"SPELL_CAST_START 168885",
		"SPELL_AURA_APPLIED 166492 166572 166726 166475 166476 166477",
		"SPELL_INTERRUPT"
	)

	--10.1.7 on retail, and classic if it happens (if it doesn't happen old version of mod will be retired)
	local warnFrostPhase			= mod:NewSpellAnnounce(166476, 2, nil, nil, nil, nil, nil, 2)
	local warnArcanePhase			= mod:NewSpellAnnounce(166477, 2, nil, nil, nil, nil, nil, 2)

	local specWarnParasiticGrowth	= mod:NewSpecialWarningCount(168885, "Tank")--No voice ideas for this
	--local specWarnFireBloom			= mod:NewSpecialWarningSpell(166492, nil, nil, nil, 2)
	local specWarnFrozenRainMove	= mod:NewSpecialWarningMove(166726, nil, nil, nil, 1, 8)

	local timerParasiticGrowthCD	= mod:NewCDCountTimer(11.5, 168885, nil, "Tank|Healer", 2, 5, nil, DBM_COMMON_L.TANK_ICON)--Every 12 seconds unless comes off cd during fireball/frostbolt, then cast immediately after.

	mod.vb.ParasiteCount = 0

	function mod:OnCombatStart(delay)
		self.vb.ParasiteCount = 0
		timerParasiticGrowthCD:Start(32.5-delay, 1)
	end

	function mod:SPELL_CAST_START(args)
		local spellId = args.spellId
		if spellId == 168885 then
			self.vb.ParasiteCount = self.vb.ParasiteCount + 1
			specWarnParasiticGrowth:Show(self.vb.ParasiteCount)
			timerParasiticGrowthCD:Stop()
			timerParasiticGrowthCD:Start(nil, self.vb.ParasiteCount+1)
		end
	end

	function mod:SPELL_AURA_APPLIED(args)
		local spellId = args.spellId
		--if args:IsSpellID(166492, 166572) and self:AntiSpam(12) then--Because the dumb spell has no cast Id, we can only warn when someone gets hit by one of rings.
			--specWarnFireBloom:Show()
			--specWarnFireBloom:Play("firecircle")
		if spellId == 166726 and args:IsPlayer() and self:AntiSpam(2) then--Because dumb spell has no cast Id, we can only warn when people get debuff from standing in it.
			specWarnFrozenRainMove:Show()
			specWarnFrozenRainMove:Play("watchfeet")
		elseif spellId == 166476 then
			warnFrostPhase:Show()
			warnFrostPhase:Play("ptwo")
		elseif spellId == 166477 then
			warnArcanePhase:Show()
			warnArcanePhase:Play("pthree")
		end
	end

	function mod:SPELL_INTERRUPT(args)
		if type(args.extraSpellId) == "number" and args.extraSpellId == 168885 then
			timerParasiticGrowthCD:Stop()
			self.vb.ParasiteCount = 0
			timerParasiticGrowthCD:Start(30, 1)
		end
	end
end
