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

-- UPVALUES --
local POWERTYPE_ULTIMATE	= POWERTYPE_ULTIMATE
local GetSlotAbilityCost	= GetSlotAbilityCost
local math_min				= math.min
local math_max				= math.max
local strformat				= string.format

local ultFuncs = {
	[1] = function(current) -- plain number
		return strformat('%d', current)
	end,
	[2] = function(current) -- value / ultimate cost
		local cost = GetSlotAbilityCost(8)
		return strformat('%d / %d', current, cost)
	end,
	[3] = function(current) -- value / ultimate cost ("no overshoot")
		local cost = GetSlotAbilityCost(8)
		return strformat('%d / %d', math_min(current, cost), cost)
	end
}

local ultPercentFuncs = {
	[1] = function(current, max, effMax) -- relative percent
		effMax = math_max(1, GetSlotAbilityCost(8))
		return strformat('%d%%', (current / effMax) * 100)
	end,
	[2] = function(current, max, effMax) -- total percent
		effMax = effMax > 0 and effMax or 1 -- ensure we don't do a divide by 0
		return strformat('%d%%', (current / effMax) * 100)
	end
}

local overlayUltValue, overlayUltPercent
local FormatUlt, FormatUltPercent
local db

local function OnPowerUpdate(_, unit, _, powerType, powerValue, powerMax, powerEffMax)
	if (unit ~= 'player') then return end -- only care about the player
	if (powerType ~= POWERTYPE_ULTIMATE) then return end -- only care about ultimate

	overlayUltValue:SetText(FormatUlt(powerValue))
	overlayUltPercent:SetText(FormatUltPercent(powerValue, powerMax, powerEffMax))
end

function Azurah:ConfigureUltimateOverlays()
	if (db.ultValueShow or db.ultPercentShow) then -- showing overlay, enable tracking\
		EVENT_MANAGER:RegisterForEvent(self.name .. 'Ultimate', EVENT_POWER_UPDATE, OnPowerUpdate)
	else -- no overlay being shown, disable tracking
		EVENT_MANAGER:UnregisterForEvent(self.name .. 'Ultimate', EVENT_POWER_UPDATE)
	end

	local fontStr, value, max, maxEff

	if (db.ultValueShow) then
		fontStr = strformat('%s|%d|%s', LMP:Fetch('font', db.ultValueFontFace), db.ultValueFontSize, db.ultValueFontOutline)

		overlayUltValue:SetFont(fontStr)
		overlayUltValue:SetColor(db.ultValueFontColour.r, db.ultValueFontColour.g, db.ultValueFontColour.b, db.ultValueFontColour.a)
		overlayUltValue:SetHidden(false)

		FormatUlt = ultFuncs[db.ultValueShowCost and 2 or 1]

		overlayUltValue:SetText(FormatUlt(GetUnitPower('player', POWERTYPE_ULTIMATE)))
	else
		overlayUltValue:SetHidden(true)
	end

	if (db.ultPercentShow) then
		fontStr = strformat('%s|%d|%s', LMP:Fetch('font', db.ultPercentFontFace), db.ultPercentFontSize, db.ultPercentFontOutline)

		overlayUltPercent:SetFont(fontStr)
		overlayUltPercent:SetColor(db.ultPercentFontColour.r, db.ultPercentFontColour.g, db.ultPercentFontColour.b, db.ultPercentFontColour.a)
		overlayUltPercent:SetHidden(false)

		FormatUltPercent = ultPercentFuncs[(db.ultPercentRelative) and 1 or 2]

		overlayUltPercent:SetText(FormatUltPercent(GetUnitPower('player', POWERTYPE_ULTIMATE)))
	else
		overlayUltPercent:SetHidden(true)
	end
end

function Azurah:ConfigureActionBarElements()
	ZO_ActionBar1WeaponSwap:SetAlpha(db.hideWeaponSwap and 0 or 1)
	ZO_ActionBar1WeaponSwapLock:SetAlpha(db.hideWeaponSwap and 0 or 1)

	ZO_ActionBar1KeybindBG:SetAlpha(db.hideBindBG and 0 or 1)

	for x = 3, 9 do
		_G['ActionButton' .. x .. 'ButtonText']:SetAlpha(db.hideBindText and 0 or 1)
	end
end


-- ------------------------
-- INITIALIZATION
-- ------------------------
function Azurah:InitializeActionBar()
	db = self.db.actionBar

	-- create overlays
	overlayUltValue		= self:CreateOverlay(ActionButton8, BOTTOM, TOP, -1, 0)
	overlayUltPercent	= self:CreateOverlay(ActionButton8, BOTTOM, BOTTOM, 0, -2, 60)

	-- set 'dummy' display function
	FormatUlt			= ultFuncs[1]
	FormatUltPercent	= ultPercentFuncs[2]

	-- Fix for scaling issue
	ActionButton8Decoration:SetAnchor(CENTER, ActionButton8, CENTER, 0, 0)

	self:ConfigureActionBarElements()
end