local pairs = pairs;
local UnitExists = UnitExists;
local UnitIsUnit = UnitIsUnit;
local _;


local VUHDO_RAID = { };
local VUHDO_INTERNAL_TOGGLES = { };

local VUHDO_updateBouquetsForEvent;
local VUHDO_clParserSetCurrentTarget;
local VUHDO_setHealth;
local VUHDO_removeHots;
local VUHDO_removeAllDebuffIcons;
local VUHDO_updateTargetBars;
local VUHDO_updateHealthBarsFor;
local VUHDO_getUnitButtonsSafe;
local VUHDO_getPlayerTargetFrame;

--
function VUHDO_playerTargetEventHandlerInitLocalOverrides()
	VUHDO_RAID = _G["VUHDO_RAID"];
	VUHDO_INTERNAL_TOGGLES = _G["VUHDO_INTERNAL_TOGGLES"];

	VUHDO_updateBouquetsForEvent = _G["VUHDO_updateBouquetsForEvent"];
	VUHDO_clParserSetCurrentTarget = _G["VUHDO_clParserSetCurrentTarget"];
	VUHDO_setHealth = _G["VUHDO_setHealth"];
	VUHDO_removeHots = _G["VUHDO_removeHots"];
	VUHDO_removeAllDebuffIcons = _G["VUHDO_removeAllDebuffIcons"];
	VUHDO_updateTargetBars = _G["VUHDO_updateTargetBars"];
	VUHDO_updateHealthBarsFor = _G["VUHDO_updateHealthBarsFor"];
	VUHDO_getUnitButtonsSafe = _G["VUHDO_getUnitButtonsSafe"];
	VUHDO_getPlayerTargetFrame = _G["VUHDO_getPlayerTargetFrame"];
end



--
local VUHDO_CURR_PLAYER_TARGET = nil;
local tTargetUnit;
local tOldTarget;
local tEmptyInfo = { };
function VUHDO_updatePlayerTarget()
	tTargetUnit = nil;
	for tUnit, tInfo in pairs(VUHDO_RAID) do
		if UnitIsUnit("target", tUnit) and tUnit ~= "focus" and tUnit ~= "target" and not VUHDO_isBossUnit(tUnit) then 
			if tInfo["isPet"] and (VUHDO_RAID[tInfo["ownerUnit"]] or tEmptyInfo)["isVehicle"] then
				tTargetUnit = tInfo["ownerUnit"];
			else
				tTargetUnit = tUnit;
			end
			break;
		end
	end

	if VUHDO_RAID["target"] then
		VUHDO_determineIncHeal("target");
		VUHDO_updateHealth("target", 9); -- VUHDO_UPDATE_INC
	end

	tOldTarget = VUHDO_CURR_PLAYER_TARGET;
	VUHDO_CURR_PLAYER_TARGET = tTargetUnit; -- Wg. callback erst umkopieren
	VUHDO_updateBouquetsForEvent(tOldTarget, 8); -- VUHDO_UPDATE_TARGET
	VUHDO_updateBouquetsForEvent(tTargetUnit, 8); -- VUHDO_UPDATE_TARGET
	VUHDO_clParserSetCurrentTarget(tTargetUnit);

	if VUHDO_INTERNAL_TOGGLES[27] then -- VUHDO_UPDATE_PLAYER_TARGET
		if UnitExists("target") then
			VUHDO_setHealth("target", 1); -- VUHDO_UPDATE_ALL
		else
			VUHDO_removeHots("target");
			VUHDO_resetDebuffsFor("target");
			VUHDO_removeAllDebuffIcons("target");
			VUHDO_updateTargetBars("target");
			table.wipe(VUHDO_RAID["target"] or tEmptyInfo);
			VUHDO_RAID["target"] = nil;
		end

		VUHDO_updateHealthBarsFor("target", 1); -- VUHDO_UPDATE_ALL
		VUHDO_initEventBouquetsFor("target");
	end
end



--
local tBorder;
function VUHDO_barBorderBouquetCallback(aUnit, anIsActive, anIcon, aTimer, aCounter, aDuration, aColor, aBuffName, aBouquetName, anImpact)
	for _, tButton in pairs(VUHDO_getUnitButtonsSafe(aUnit)) do
		if aColor then
			tBorder = VUHDO_getPlayerTargetFrame(tButton);
			tBorder:SetFrameLevel(tButton:GetFrameLevel() + (anImpact or 0) + 2);
			tBorder:SetBackdropBorderColor(VUHDO_backColor(aColor));
			tBorder:Show();
		else
			VUHDO_getPlayerTargetFrame(tButton):Hide();
		end
	end
end



--
function VUHDO_getCurrentPlayerTarget()
	return VUHDO_CURR_PLAYER_TARGET;
end