aUFBanzai = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceHook-2.1")

local _G = getfenv(0)

function aUFBanzai:SafeHook(object, method, handler) if not self:IsHooked(object, method) then self:Hook(object, method, handler) end end
function aUFBanzai:SafeUnhook(object, method) if self:IsHooked(object, method) then self:Unhook(object, method) end end

function aUFBanzai:OnEnable()
	self:RegisterEvent("Banzai_UnitGainedAggro")
	self:RegisterEvent("Banzai_UnitLostAggro")
end

function aUFBanzai:StyleUnit(unitId)
	self:SafeHook(aUF.units[unitId], "StatusBarsColor", "Noop")
	self:SafeHook(aUF.units[unitId], "StatusBarsOnValueChanged", "Noop")
	_G[unitId .. "_HealthBar"]:SetStatusBarColor(1, 0, 0)
end

function aUFBanzai:ResetUnit(unitId)
	self:SafeUnhook(aUF.units[unitId], "StatusBarsColor")
	self:SafeUnhook(aUF.units[unitId], "StatusBarsOnValueChanged")
	aUF.units[unitId]:StatusBarsColor()
end

function aUFBanzai:GetAUFId(unitId)
	if GetNumRaidMembers() > 0 and not aUF.db.profile.RaidHideParty then
		if UnitIsUnit(unitId, "player") then
			unitId = "player"
		elseif string.find(unitId, "raid(%d+)") then
			for i = 1, 5 do
				if UnitIsUnit(unitId, "party"..tostring(i)) then
					unitId = "party"..tostring(i)
					break
				end
			end
		end
	end
	local retVal = (aUF.units["aUF" .. unitId] and "aUF"..unitId) or (aUF.units[unitId] and unitId) or nil
	if not retVal then
		local _, _, num = string.find(unitId, "party(%d)")
		if not tostring(num) then return nil end
		retVal = aUF.units["aUFgrouppartyUnitButton" .. tostring(num)] and "aUFgrouppartyUnitButton" .. tostring(num) or nil
	end
	return retVal
end

function aUFBanzai:Banzai_UnitGainedAggro(unitId)
	local aUFunit = self:GetAUFId(unitId)
	if not aUFunit or not aUF.units[aUFunit] or type(aUF.units[aUFunit].StatusBarsColor) ~= "function" then return end
	self:StyleUnit(aUFunit)
end

function aUFBanzai:Banzai_UnitLostAggro(unitId)
	local aUFunit = self:GetAUFId(unitId)
	if not aUFunit or not aUF.units[aUFunit] or type(aUF.units[aUFunit].StatusBarsColor) ~= "function" then return end
	self:ResetUnit(aUFunit)
end

function aUFBanzai:Noop() return nil end

