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

-------------------------------------------------------------------------------------------------
-- FUNCTIONS --
-------------------------------------------------------------------------------------------------
function base.GetCharacterSettingsDisabledState()
    base:Debug("GetCharacterSettingsDisabledState")
    local result = BSTATE_DISABLED
    if base.Saved.UseAccountSettings and _G[texts.CharacterKey] ~= nil then result = BSTATE_NORMAL end

    return result == BSTATE_DISABLED
end

function base:GetLocationValue(value)
    base:Debug("GetLocationValue", value)
    local result

    if value == texts.Location.Bottom then
        result = BOTTOM
    elseif value == texts.Location.BottomLeft then
        result = BOTTOMLEFT
    elseif value == texts.Location.BottomRight then
        result = BOTTOMRIGHT
    elseif value == texts.Location.Center then
        result = CENTER
    elseif value == texts.Location.Left then
        result = LEFT
    elseif value == texts.Location.Right then
        result = RIGHT
    elseif value == texts.Location.Top then
        result = TOP
    elseif value == texts.Location.TopLeft then
        result = TOPLEFT
    elseif value == texts.Location.TopRight then
        result = TOPRIGHT
    end

    return result
end

function base:GetLocationText(value)
    base:Debug("GetLocationText", value)
    local result

    if value == BOTTOM then
        result = texts.Location.Bottom
    elseif value == BOTTOMLEFT then
        result = texts.Location.BottomLeft
    elseif value == BOTTOMRIGHT then
        result = texts.Location.BottomRight
    elseif value == CENTER then
        result = texts.Location.Center
    elseif value == LEFT then
        result = texts.Location.Left
    elseif value == RIGHT then
        result = texts.Location.Right
    elseif value == TOP then
        result = texts.Location.Top
    elseif value == TOPLEFT then
        result = texts.Location.TopLeft
    elseif value == TOPRIGHT then
        result = texts.Location.TopRight
    end

    return result
end

function base:RestorePosition(frame, saved)
    base:Debug("RestorePosition", frame, frame.Name, saved)
    frame:ClearAnchors()
    local combineFrame = base.Global.Combine.Frames.Frame
    if not saved.Bar.IsCombined or not combineFrame then
        frame:SetAnchor(saved.Label.PositionTarget, GuiRoot, TOPLEFT, saved.Bar.Offset.X, saved.Bar.Offset.Y)
    elseif saved.Bar.IsCombined then
        if not saved.Bar.HideAll then
            frame:SetAnchorFill(combineFrame)
        else
            frame:SetAnchor(TOPLEFT, combineFrame, TOPLEFT, 0, 0)
        end
    end
end

function base:GetLabelPostFix(category)
    base:Debug("GetLabelPostFix", category)
    local postFix = ""
    if category.Saved.Label.EnableHideAll then
        if not category.Saved.Bar.HideAll then
            postFix = " -"
        else
            postFix = " +"
        end
    end
    return postFix
end

function base:IsAllSelected(category)
    base:Debug("IsAllSelected", category)
    local isAllSelected = true
    for _, collectible in pairs(category.Collection) do
        if category.Saved.Selected[collectible.Id] == nil then
            isAllSelected = false
            break
        end
    end

    return isAllSelected
end

function base:AutoSelectAll(category, newValue)
    base:Debug("AutoSelectAll", category, newValue)

    if newValue then category.Saved.Selected = {} end

end

function base:SelectAll(category, newValue)
    base:Debug("SelectAll", category, newValue)
    for _, collectible in pairs(category.Collection) do
        if newValue == true then
            category.Saved.Selected[collectible.Id] = newValue
        else
            category.Saved.Selected[collectible.Id] = nil
        end
    end
end

function base:GetAccountsettings()
    base:Debug("GetAccountsettings")
    return ZO_SavedVars:NewAccountWide(texts.AccountKey, base.Addon.Version, nil, base.Default)
end

function base:GetCharactersettings(useAccountSettings)
    base:Debug("GetCharactersettings", useAccountSettings)
    local characterSettings = nil

    if not useAccountSettings then
        characterSettings = ZO_SavedVars:NewCharacterNameSettings(texts.CharacterKey, base.Addon.Version, nil, base.Default)
        characterSettings.UseAccountSettings = false
    end

    return characterSettings
end

function base:SetSavedSettings()
    base:Debug("SetSavedSettings")
    local accountSettings = base:GetAccountsettings()
    local characterSettings = base:GetCharactersettings(accountSettings.UseAccountSettings)
    base.Saved = characterSettings or accountSettings
end

function base:UpdateUseAccountSettings(useAccountSettings)
    base:Debug("UpdateUseAccountSettings", useAccountSettings)
    local accountSettings = base:GetAccountsettings()
    accountSettings.UseAccountSettings = useAccountSettings
    local characterSettings = base:GetCharactersettings(accountSettings.UseAccountSettings)
    base.Saved = characterSettings or accountSettings
end

function base:ResetSavedSettings()
    base:Debug("ResetSavedSettings")
    local useAccountSettings = base.Saved.UseAccountSettings
    if useAccountSettings then
        _G[texts.AccountKey] = nil
        base.Saved = base:GetAccountsettings()
    else
        _G[texts.CharacterKey] = nil
        base.Saved = base:GetCharactersettings(useAccountSettings)
    end
end

function base:RemoveCharacterSettings()
    base:Debug("RemoveCharacterSettings")
    if base.Saved.UseAccountSettings then _G[texts.CharacterKey] = nil end
end

function base:GetMaxBarSize(category, constraint, count)
    local maxBarSize
    if category.Saved.Bar.IsCombined then
        maxBarSize = base.Saved.Combine.Bar[constraint]
    else
        maxBarSize = category.Saved.Bar[constraint]
    end

    if maxBarSize == 0 then maxBarSize = base.Saved.Bar[constraint] end
    if count < maxBarSize then maxBarSize = count end

    return maxBarSize
end

function base:GetBarWidthHeight(category)
    base:Debug("GetBarWidthHeight", category)
    local width, height, count = 0, 0, 0

    if not category.Saved.Bar.HideAll then for key, button in pairs(category.Buttons) do if not button:IsHidden() then count = count + 1 end end end

    if count > 0 then
        category.Bar.Depth, category.Bar.Width = base:GetMaxBarSize(category, "Depth", count), base:GetMaxBarSize(category, "Width", count)

        local barWidth = zo_ceil(count / category.Bar.Depth)
        local maxBarWidth = category.Bar.Width

        if maxBarWidth > 0 and maxBarWidth < barWidth then barWidth = maxBarWidth end

        local isHorizontal = category.Saved.Bar.Horizontal
        width = base.Saved.Button.Size * (not isHorizontal and barWidth or category.Bar.Depth)
        height = base.Saved.Button.Size * (isHorizontal and barWidth or category.Bar.Depth)
    end

    return width, height
end

function base:SetFrameSizeIfExists(frame, width, height)
    base:Debug("SetFrameSizeIfExists", frame, width, height)
    if frame ~= nil then
        frame:SetWidth(width)
        frame:SetHeight(height)
    end
end

function base:HasAny(array)
    base:Debug("HasAny", array)
    for _ in pairs(array) do return true end
    return false
end

function base:SetControlText(control, text)
    base:Debug("SetControlText", control, text)
    control.SetText(control, text)
end