--[[
Author: Jarth
Filename: CBs_Labels.lua
]] --
-------------------------------------------------------------------------------------------------
-- VARIABLES --
-------------------------------------------------------------------------------------------------
local base = CollectionBars
local texts = base.Texts

-------------------------------------------------------------------------------------------------
-- FUNCTIONS --
-------------------------------------------------------------------------------------------------
function base.SetupLabel(category)
    local hideAllId = base.Addon.Abbreviation .. texts.Helpers.Lowdash .. texts.Components.HideAll
    if category.FrameLabel == nil then
        category.FrameLabel = GetControl(hideAllId .. category.Name)
        if category.FrameLabel == nil then category.FrameLabel = base.WM:CreateControlFromVirtual(hideAllId, category.Frame, hideAllId, category.Name) end
    end

    category.FrameLabel:SetHidden(not category.Saved.LabelShow and not category.Saved.IsCombined)

    category.FrameToggleSettings = GetControl(hideAllId .. category.Name .. texts.Components.Toggle .. texts.Components.Settings)
    category.FrameLabelButton = GetControl(hideAllId .. category.Name .. texts.Components.Button)
    if category.FrameLabelButton ~= nil then
        category.FrameLabelButton:SetHandler(texts.Action.OnClicked, function(_, button)
            if button == MOUSE_BUTTON_INDEX_RIGHT then
                base.ToggleEnableSettings()
            elseif button == MOUSE_BUTTON_INDEX_LEFT and category.Saved.HideAllEnabled or category.Saved.IsCombined then
                category.Saved.HideAll = not category.Saved.HideAll
                if category.Saved.IsCombined then base.HideOthers(category) end
                base.RestoreFrame(category)
                base.RestoreCombine()
            end
        end)
    end

    base.SetupToggleSettings(category)
end

function base.RestoreLabel(category)
    local label = category.Saved.Label
    local frameLabel = category.FrameLabel

    if frameLabel ~= nil then
        frameLabel:ClearAnchors()
        frameLabel:SetHeight(label.Height)
        frameLabel:SetWidth(label.Width)
        if not category.Saved.IsCombined then frameLabel:SetAnchor(label.Position, category.Frame, label.PositionTarget, label.OffsetX, label.OffsetY) end
        frameLabel:SetHidden(not category.Saved.LabelShow and not category.Saved.IsCombined and not base.Global.EnableSettings)
    end

    local frameLabelButton = category.FrameLabelButton
    if frameLabelButton ~= nil then
        frameLabelButton:SetHidden(false)
        frameLabelButton:SetFont(label.Font)
        frameLabelButton:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
        frameLabelButton:SetVerticalAlignment(TOP)
        frameLabelButton:SetText(tostring(category.Saved.Display) .. base.GetLabelPostFix(category))
    end

    local frameLabelToggleSettings = category.FrameToggleSettings
    if frameLabelToggleSettings ~= nil then frameLabelToggleSettings:SetHidden(false) end
end

function base.RemoveLabel(category)
    if category.FrameLabel ~= nil then
        category.FrameLabel:ClearAnchors()
        category.FrameLabel:SetHidden(true)
    end

    if category.FrameLabelButton ~= nil then category.FrameLabelButton:SetHidden(true) end

    if category.FrameToggleSettings ~= nil then category.FrameToggleSettings:SetHidden(true) end
end

function base.RestoreCombineLabels()
    local combineLabel = base.Saved.Combine.Label
    local width = 0
    local height = 0
    for _, category in pairs(base.CategoriesOrdered) do
        if category.Saved.Enabled and category.Saved.IsCombined and category.FrameLabel then
            if (not category.IsEmpty or base.Global.EnableSettings) then
                local hasSelected = not base.HasAny(category.Saved.Selected)
                category.FrameLabel:ClearAnchors()
                category.FrameLabel:SetHidden(not hasSelected and not category.Saved.LabelShow and not base.Global.EnableSettings)
                if not category.FrameLabel:IsHidden() or (category.Saved.LabelShow and hasSelected) or base.Global.EnableSettings then
                    width = width + category.Saved.Label.OffsetX
                    local offsetY = category.Saved.Label.OffsetY + combineLabel.OffsetY
                    category.FrameLabel:SetAnchor(TOPLEFT, base.Global.Combine.HideAll, TOPLEFT, width, offsetY)
                    width = width + category.FrameLabel:GetWidth()
                    local labelHeight = category.FrameLabel:GetHeight()
                    if labelHeight > height then height = labelHeight end
                end
            end
        end
    end

    local frame = base.Global.Combine.HideAll
    if frame ~= nil and base.Global.Combine.Frame ~= nil then
        frame:ClearAnchors()
        frame:SetWidth(width)
        frame:SetHeight(height)
        frame:SetAnchor(combineLabel.Position, base.Global.Combine.Frame, combineLabel.PositionTarget, combineLabel.OffsetX, combineLabel.OffsetY)
    end
end