local parent, ns = ...
local oUF = ns.oUF

-- sourced from Blizzard_ArenaUI/Blizzard_ArenaUI.lua
local MAX_ARENA_ENEMIES = MAX_ARENA_ENEMIES or 5

-- sourced from FrameXML/TargetFrame.lua
local MAX_BOSS_FRAMES = MAX_BOSS_FRAMES or 5

-- 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, doNotReparent)
	local frame
	if (type(baseName) == "string") then
		frame = _G[baseName]
	else
		frame = baseName
	end

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

		if (not doNotReparent) then
			frame:SetParent(hiddenParent)
		end

		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)

		-- For the damn vehicle support:
		PlayerFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
		PlayerFrame:RegisterEvent("UNIT_ENTERING_VEHICLE")
		PlayerFrame:RegisterEvent("UNIT_ENTERED_VEHICLE")
		PlayerFrame:RegisterEvent("UNIT_EXITING_VEHICLE")
		PlayerFrame:RegisterEvent("UNIT_EXITED_VEHICLE")

		-- User placed frames don't animate
		PlayerFrame:SetUserPlaced(true)
		PlayerFrame:SetDontSavePosition(true)
	elseif (unit == "pet") then
		handleFrame(PetFrame)
	elseif (unit == "target") then
		handleFrame(TargetFrame)
		handleFrame(ComboFrame)
	elseif (unit == "focus") then
		handleFrame(FocusFrame)
		handleFrame(TargetofFocusFrame)
	elseif (unit == "targettarget") then
		handleFrame(TargetFrameToT)
	elseif (unit:match("boss%d?$")) then
		local id = unit:match("boss(%d)")
		if (id) then
			handleFrame("Boss" .. id .. "TargetFrame")
		else
			for i = 1, MAX_BOSS_FRAMES do
				handleFrame(string.format("Boss%dTargetFrame", i))
			end
		end
	elseif (unit:match("party%d?$")) then
		local id = unit:match("party(%d)")
		if (id) then
			handleFrame("PartyMemberFrame" .. id)
		else
			for i = 1, MAX_PARTY_MEMBERS do
				handleFrame(string.format("PartyMemberFrame%d", i))
			end
		end
	elseif (unit:match("arena%d?$")) then
		local id = unit:match("arena(%d)")
		if (id) then
			handleFrame("ArenaEnemyFrame" .. id)
		else
			for i = 1, MAX_ARENA_ENEMIES do
				handleFrame(string.format("ArenaEnemyFrame%d", i))
			end
		end

		-- Blizzard_ArenaUI should not be loaded
		Arena_LoadUI = function() end
		SetCVar("showArenaEnemyFrames", "0", "SHOW_ARENA_ENEMY_FRAMES_TEXT")
	end
end