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

-------------------------------------------------------------------------------------------------
--  FUNCTIONS --
-------------------------------------------------------------------------------------------------

function base.OnAddOnLoaded(_, addonName)
    base:LogInitialize("OnAddOnLoaded", addonName)
    if addonName == base.Addon.Name then
        base:SetAndUpdateAccountSettings()
        base:GenerateCategories()
        base:InitializeReverseBinding()
        base:InitializeCombineFrame()
        base:InitializeWithSavedData()
        base:InitializeBindings()
        base:InitializeSettingsSlash()

        EVENT_MANAGER:UnregisterForEvent(base.Addon.Name, EVENT_ADD_ON_LOADED)
    end
    base:Info("OnAddOnLoaded:end", addonName)
end

function base:InitializeWithSavedData()
    base:Debug("InitializeWithSavedData")
    for categoryId, category in pairs(base.Categories) do
        category.Saved = base.Saved.Categories[categoryId]
        if category.Saved.Enabled then base:InitializeCategory(category) end
    end

    base:InitializeCombine()
    base:RestoreCombine()
end

function base:InitializeCategory(category)
    base:Debug("InitializeCategory", category)
    base:CreateCategory(category)
    base:SetupLabel(category)
    base:RestoreFrame(category)
end

function base:InitializeCombineFrame()
    base:Debug("InitializeCombineFrame")
    base.Global.Combine.Frames.Frame = base:GetFrame(texts.CombineFrameName, texts.CombineFrameName)
    base.Global.Combine.Frames.HideAll = base:GetFrame(texts.CombineFrameNameHideAll, texts.CombineFrameNameHideAll)
end

function base:CreateCategory(category)
    base:Debug("CreateCategory", category)
    category.Collection = {}
    category.CollectionOrdered = {}
    category.Unlocked = GetTotalUnlockedCollectiblesByCategoryType(category.Type)

    if category.Unlocked > base.Global.HighestUnlocked then base.Global.HighestUnlocked = category.Unlocked end

    for index, collectibleData in ZO_CollectibleCategoryData.SortedCollectibleIterator(category.CategoryData, {ZO_CollectibleData.IsShownInCollection}) do
        local isUnlocked = collectibleData:IsUnlocked()
        -- TODO: Insert if new, update if exists...
        if isUnlocked or category.Saved.MenuShowDisabled then
            local collectibleId = collectibleData:GetId()
            -- TODO: IMPLEMENT BETTER TOOLTIPS...     function ZO_Tooltip:LayoutCollectible(collectibleId, deprecatedCollectionName, collectibleName, collectibleNickname, isPurchasable, description, hint, deprecatedArg, categoryType, showVisualLayerInfo, cooldownSecondsRemaining, showBlockReason)
            category.Collection[collectibleId] = {
                Id = collectibleId,
                Name = collectibleData:GetName(),
                EnabledTexture = collectibleData:GetIcon(),
                Disabled = not isUnlocked,
                Tooltip = string.format("%s\n%s", collectibleData:GetDescription(), collectibleData:GetHint()),
                CollectibleData = collectibleData
            }
            table.insert(category.CollectionOrdered, category.Collection[collectibleId])
        end
    end

    category.Frames.Frame = base:GetFrame(string.format(texts.FormatCategoryName, category.Id), string.format(texts.FormatAbbreviationLowDash, "Frame"))
end

function base:RestoreFrames()
    base:Debug("RestoreFrames")
    for _, category in pairs(base.Categories) do base:RestoreFrame(category) end
    base:RestoreCombine()
end

function base:HideOthers(newCategory)
    base:Debug("HideOthers", newCategory)
    for _, category in pairs(base.Categories) do
        if category.Saved.Enabled and category.Saved.Bar.IsCombined and not category.Saved.Bar.HideAll and category ~= newCategory then
            category.Saved.Bar.HideAll = not category.Saved.Bar.HideAll
            base:RestoreFrame(category)
        end
    end
end

function base:RestoreFrame(category)
    base:Debug("RestoreFrame", category)
    if category.Saved.Enabled then
        base:RestoreLabel(category)
        base:SetupButtons(category)
        base:SetFrameAndCombineSize(category)
        base:RestorePosition(category.Frames.Frame, category.Saved)
        base:UpdateToggleSettings(category)
        base:UpdateMoveFrame(category)
        base:UpdateFragment(category)
    else
        base:RemoveLabel(category)
        base:RemoveFrame(category)
    end
end

function base:RemoveFrame(category)
    base:Debug("RemoveFrame", category)
    base:RemoveFragments(category)
    for _, button in ipairs(category.Buttons) do if button ~= nil then button:SetHidden(true) end end

    if category.Frames.Frame ~= nil then
        base:Debug("RemoveFrame:hide", category.Frames.Frame)
        category.Frames.Frame:SetHidden(true)
    end
end

function base:InitializeCombine() base.Global.Combine.Saved = base.Saved.Combine end

function base:RestoreCombine()
    base:Debug("RestoreCombine")
    base:RestoreCombineLabels()
    base:RestorePosition(base.Global.Combine.Frames.Frame, base.Saved.Combine)
    base:UpdateMoveFrame(base.Global.Combine)
    base:UpdateFragment(base.Global.Combine)
end

-------------------------------------------------------------------------------------------------
-- FUNCTIONS --
-------------------------------------------------------------------------------------------------

EVENT_MANAGER:RegisterForEvent(base.Addon.Name, EVENT_ADD_ON_LOADED, base.OnAddOnLoaded)