---@class StdUi
local StdUi = LibStub and LibStub('StdUi', true)
if not StdUi then return end

local module, version = 'Label', 3
if not StdUi:UpgradeNeeded(module, version) then return end

----------------------------------------------------
--- FontString
----------------------------------------------------
---@class StdUi.FontString : FontString, FontStringMethods

---@class FontStringMethods
local FontStringMethods = {
	SetFontSize = function(self, newSize)
		self:SetFont(self:GetFont(), newSize)
	end,
}

---@return StdUi.FontString
function StdUi:FontString(parent, text, inherit)
	local fs = parent:CreateFontString(nil, self.config.font.strata, inherit or 'GameFontNormal')

	fs:SetText(text)
	fs:SetJustifyH('LEFT')
	fs:SetJustifyV('MIDDLE')

	for k, v in pairs(FontStringMethods) do
		fs[k] = v
	end

	return fs
end

----------------------------------------------------
--- Label
----------------------------------------------------

---@return StdUi.FontString
function StdUi:Label(parent, text, size, inherit, width, height)
	local fs = self:FontString(parent, text, inherit)
	if size then fs:SetFontSize(size) end

	self:SetTextColor(fs, 'normal')
	self:SetObjSize(fs, width, height)

	return fs
end

----------------------------------------------------
--- Header
----------------------------------------------------

---@return StdUi.FontString
function StdUi:Header(parent, text, size, inherit, width, height)
	local fs = self:Label(parent, text, size, inherit or 'GameFontNormalLarge', width, height)

	self:SetTextColor(fs, 'header')

	return fs
end

----------------------------------------------------
--- AddLabel
----------------------------------------------------

---@return FontString
function StdUi:AddLabel(parent, object, text, labelPosition, labelWidth)
	local labelHeight = self.config.font.size + 4
	local label = self:Label(parent, text, self.config.font.size, nil, labelWidth, labelHeight)

	if labelPosition == 'TOP' or labelPosition == nil then
		self:GlueAbove(label, object, 0, 4, 'LEFT')
	elseif labelPosition == 'RIGHT' then
		self:GlueRight(label, object, 4, 0)
	else -- labelPosition == 'LEFT'
		label:SetWidth(labelWidth or label:GetStringWidth())
		self:GlueLeft(label, object, -4, 0)
	end

	object.label = label

	return label
end

StdUi:RegisterModule(module, version)
