local Azurah		= _G['Azurah'] -- grab addon table from global
local LMP			= LibStub('LibMediaProvider-1.0')

-- UPVALUES --
local DoesUnitExist	= DoesUnitExist
local GetUnitPower	= GetUnitPower
local strformat		= string.format

local overlayBossbar
local FormatBossbar
local db
local bossUnitTags = {}
local bossHealthValues = {}

local function RefreshBossOverlay()
	local totalHealth		= 0
	local totalMaxHealth	= 0

	for unitTag, bossEntry in pairs(bossHealthValues) do
		totalHealth = totalHealth + bossEntry.health
		totalMaxHealth = totalMaxHealth + bossEntry.maxHealth
	end

	overlayBossbar:SetText(FormatBossbar(totalHealth, totalMaxHealth, totalMaxHealth))
end

local function RefreshBossHealth(unitTag)
	local health, maxHealth = GetUnitPower(unitTag, POWERTYPE_HEALTH)
	local bossEntry = bossHealthValues[unitTag]
	bossEntry.health = health
	bossEntry.maxHealth = maxHealth
end

local function AddBoss(unitTag)
	bossHealthValues[unitTag] = {}
	RefreshBossHealth(unitTag)
end

local function RefreshAllBosses()
	--if there are multiple bosses and one of them dies and despawns in the middle of the fight we
	--still want to show them as part of the boss bar (otherwise it will reset to 100%).
	local currentBossCount = 0
	for unitTag in pairs(bossUnitTags) do
		if (DoesUnitExist(unitTag)) then
			AddBoss(unitTag)
			currentBossCount = currentBossCount + 1
		end
	end

	--if there are no bosses left it's safe to reset everything
	if (currentBossCount == 0 and next(bossHealthValues) ~= nil) then
		bossHealthValues = {}
	end

	RefreshBossOverlay()
end

local function OnPowerUpdate(_, unitTag, _, powerType)
	if (bossUnitTags[unitTag] and powerType == POWERTYPE_HEALTH) then
		RefreshBossHealth(unitTag)
		RefreshBossOverlay()
	end
end

function Azurah:ConfigureBossbarOverlay()
	if (not IsInGamepadPreferredMode() and db.overlay > 1) then -- showing overlay, enabled tracking
		EVENT_MANAGER:RegisterForEvent(self.name .. 'Bossbar', EVENT_POWER_UPDATE,		OnPowerUpdate)
		EVENT_MANAGER:RegisterForEvent(self.name .. 'Bossbar', EVENT_BOSSES_CHANGED,	RefreshAllBosses)
--		EVENT_MANAGER:RegisterForEvent(self.name .. 'Bossbar', EVENT_PLAYER_ACTIVATED,	RefreshAllBosses)
	else -- no overlay being shown, disable tracking
		EVENT_MANAGER:UnregisterForEvent(self.name .. 'Bossbar', EVENT_POWER_UPDATE)
		EVENT_MANAGER:UnregisterForEvent(self.name .. 'Bossbar', EVENT_BOSSES_CHANGED)
--		EVENT_MANAGER:UnregisterForEvent(self.name .. 'Bossbar', EVENT_PLAYER_ACTIVATED)
	end

	local fontStr, value, max, maxEff

	if (db.overlay > 1 and not IsInGamepadPreferredMode()) then
		fontStr = strformat('%s|%d|%s', LMP:Fetch('font', db.fontFace), db.fontSize, db.fontOutline)

		overlayBossbar:SetFont(fontStr)
		overlayBossbar:SetColor(db.fontColour.r, db.fontColour.g, db.fontColour.b, db.fontColour.a)
		overlayBossbar:SetHidden(false)

		FormatBossbar = self.overlayFuncs[db.overlay + ((db.overlayFancy) and 10 or 0)]

		RefreshAllBosses()
	else -- not showing
		overlayBossbar:SetHidden(true)
	end
end


-- ------------------------
-- INITIALIZATION
-- ------------------------
function Azurah:InitializeBossbar()
	db = self.db.bossbar

	-- create overlay
	overlayBossbar = self:CreateOverlay(ZO_BossBarHealth, CENTER, CENTER, 0, -0.5)

	-- set 'dummy' display function
	FormatTarget = self.overlayFuncs[1]

	for i = 1, MAX_BOSSES do
		bossUnitTags["boss"..i] = true
	end
end