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

-------------------------------------------------------------------------------------------------
-- FUNCTIONS --
-------------------------------------------------------------------------------------------------
function base.InitializeSettingsSlash() SLASH_COMMANDS[base.Addon.SettingsSlash] = function() base.ShowSettings() end end

function base.ToggleEnableSettings()
    base.Global.EnableSettings = not base.Global.EnableSettings
    base.RestoreFrames()
    base.RestoreCombineLabels()
end

function base.SetupToggleSettings(category)
    local toggleSettings = GetControl(base.Addon.Abbreviation .. texts.Helpers.Lowdash .. texts.Components.HideAll .. category.Name .. texts.Components.Toggle .. texts.Components.Settings)
    if toggleSettings then
        local hideAllSettingsFunc = function() base.ShowSettings(category) end
        toggleSettings:SetHandler(texts.Action.OnClicked, hideAllSettingsFunc)
    end
end

function base.UpdateToggleSettings(category)
    local offsetX = 0
    if base.Global.EnableSettings then offsetX = -19 end

    if category.FrameLabel and category.FrameToggleSettings then
        category.FrameToggleSettings:ClearAnchors()
        category.FrameToggleSettings:SetAnchor(TOPLEFT, category.FrameLabel, TOPRIGHT, offsetX, 0)
        category.FrameToggleSettings:SetAnchor(BOTTOMRIGHT, category.FrameLabel, BOTTOMRIGHT, 0, 0)
    end
    if category.FrameLabel and category.FrameLabelButton then
        category.FrameLabelButton:ClearAnchors()
        category.FrameLabelButton:SetAnchor(TOPLEFT, category.FrameLabel, TOPLEFT, 0, 0)
        category.FrameLabelButton:SetAnchor(BOTTOMRIGHT, category.FrameLabel, BOTTOMRIGHT, offsetX, 0)
    end
end

function base.SetupSettingsFrameHandlers(control, text, onClicked)
    control.tooltipText = text
    control:SetHandler(texts.Action.OnClicked, onClicked)
    control:SetHandler(texts.Action.OnMouseEnter, function(_control) ZO_Tooltips_ShowTextTooltip(_control, BOTTOM, _control.tooltipText) end)
    control:SetHandler(texts.Action.OnMouseExit, function() ZO_Tooltips_HideTextTooltip() end)
end

function base.SetupSetttingsFrame(category)
    local selector = base.Addon.Abbreviation .. texts.Helpers.Lowdash .. texts.Components.Settings
    base.Global.SettingsFrame = base.WM:CreateControlFromVirtual(selector, GuiRoot, selector)
    base.Global.SettingsLabel = GetControl(selector .. texts.Components.Label)
    base.Global.SettingsList = CBs_Settings_List:New(category, base.Global.SettingsFrame)

    local titleControl = GetControl(selector .. texts.Components.Title)
    titleControl:SetText(base.Addon.DisplayName .. texts.Helpers.Space .. texts.Components.Settings)

    if base.Global.SettingsFrame.closeFrame == nil then base.Global.SettingsFrame.closeFrame = GetControl(base.Global.SettingsFrame, texts.Components.Close) end
    if base.Global.SettingsFrame.closeFrame then
        base.SetupSettingsFrameHandlers(base.Global.SettingsFrame.closeFrame, texts.Components.Close, function(buttonControl) buttonControl:GetParent():SetHidden(true) end)
    end

    if base.Global.SettingsFrame.moveFrame == nil then base.Global.SettingsFrame.moveFrame = GetControl(base.Global.SettingsFrame, texts.Components.Move) end
    if base.Global.SettingsFrame.moveFrame then
        base.SetupSettingsFrameHandlers(base.Global.SettingsFrame.moveFrame, texts.Settings.ToggleMoveFrameText, function()
            base.Global.IsMoveEnabled = not base.Global.IsMoveEnabled
            base.Global.SettingsList:RefreshData()
            base.RestoreFrames()
        end)
    end

    if base.Global.SettingsFrame.refreshFrame == nil then base.Global.SettingsFrame.refreshFrame = GetControl(base.Global.SettingsFrame, texts.Components.Refresh) end
    if base.Global.SettingsFrame.refreshFrame then
        base.SetupSettingsFrameHandlers(base.Global.SettingsFrame.refreshFrame, texts.Settings.ReloadText, function()
            if base.Global.SettingsList.category ~= nil then
                base.CreateCategory(base.Global.SettingsList.category)
                base.RestoreFrame(base.Global.SettingsList.category)
            end
            base.RestoreCombineLabels()
            base.Global.SettingsList:RefreshData()
        end)
    end

    for controlName, displayName in pairs(base.Global.SettingsFilters) do base.SetupSettingsFilter(base.Global.SettingsFrame, controlName, displayName) end
end

function base.SetupSettingsFilter(control, controlName, displayName)
    local filterControl = GetControl(control, controlName)
    if filterControl then
        base.SetControlText(filterControl, displayName)
        filterControl:SetHandler(texts.Action.OnClicked, function()
            base.Global.SettingsList.masterListType = controlName
            base.Global.SettingsList:RefreshFilters()
        end)
    end
end

function base.ShowSettings(category)
    local show = base.Global.SettingsFrame == nil
    if show then base.SetupSetttingsFrame(category) end

    show = show or base.Global.SettingsFrame:IsHidden() or category ~= base.Global.SettingsList.category
    base.Global.SettingsFrame:SetHidden(not show)
    base.UpdateSettingsType(show, category)
    if show then
        base.Global.SettingsList.category = show and category or nil
        base.Global.SettingsList:RefreshData()
    end
end

function base.UpdateSettingsType(show, category)
    if base.Global.SettingsList ~= nil then base.Global.SettingsList.category = category end

    if base.Global.SettingsLabel ~= nil then base.Global.SettingsLabel:SetText(show and category and category.Name or texts.Components.Global) end
end