local ns = oUF
local oUF = ns.oUF

local format, match = string.format, string.match

local hiddenParent = CreateFrame("Frame")

-- sourced from FrameXML/PartyMemberFrame.lua
local MAX_PARTY_MEMBERS = MAX_PARTY_MEMBERS or 4

local hiddenParent = CreateFrame("Frame", nil, UIParent)
hiddenParent:SetAllPoints()
hiddenParent:Hide()

local function handleFrame(baseName)
	local frame
	if type(baseName) == "string" then
		frame = _G[baseName]
	else
		frame = baseName
	end

	if frame then
		frame:UnregisterAllEvents()
		frame:Hide()

		-- Keep frame hidden without causing taint
		frame:SetParent(hiddenParent)

		local health = frame.healthBar or frame.healthbar
		if health then
			health:UnregisterAllEvents()
		end

		local power = frame.manabar
		if power then
			power:UnregisterAllEvents()
		end

		local spell = frame.castBar or frame.spellbar
		if spell then
			spell:UnregisterAllEvents()
		end

		local buffFrame = frame.BuffFrame
		if buffFrame then
			buffFrame:UnregisterAllEvents()
		end
	end
end

function oUF:DisableBlizzard(unit)
	if not unit then return end

	if unit == "player" then
		handleFrame(PlayerFrame)
	elseif unit == "pet" then
		handleFrame(PetFrame)
	elseif unit == "target" then
		handleFrame(TargetFrame)
		handleFrame(ComboFrame)
	elseif unit == "targettarget" then
		handleFrame(TargetofTargetFrame)
	elseif match(unit, "party%d?$") then
		local id = match(unit, "party(%d)")
		if id then
			handleFrame("PartyMemberFrame" .. id)
		else
			for i = 1, MAX_PARTY_MEMBERS do
				handleFrame(format("PartyMemberFrame%d", i))
			end
		end
	end
end