-- TOG Tools — Logs outer tab (UI)
-- Body is a nested AceGUI TabGroup whose sub-tabs come from
-- `addon.logCategories`. Each sub-category exposes `subKey`, `label`,
-- `configKey`, and `Draw(container)`. Disabled sub-categories drop out
-- of the strip the same way disabled outer modules drop out of the
-- main window's strip.
--
-- Deep linking: callers (slash commands, future minimap entries) set
-- `Tab.pendingSubTab = "<subKey>"` before opening; this Draw reads and
-- clears it, falling back to the last-viewed sub-tab (per-character SV
-- via `db.char.frames.logsActiveSubTab`).

local _, addon = ...
local AceGUI = LibStub("AceGUI-3.0")

local Tab = addon.modules["logs"]
Tab.tabKey      = "logs"
Tab.configKey   = "logs"
Tab.label       = "Logs"
-- Keep the Logs tab present for developers even when the Logs module is toggled
-- off, so the dev-gated Diagnostics sub-tab stays reachable (see MainWindow's
-- BuildTabDefs). Normal users who disable Logs still lose the tab.
Tab.showWhenDev = true
Tab.WINDOW_SIZE = { width = 820, height = 520, minWidth = 740, minHeight = 380 }
Tab.help = {
    title = "Logs",
    lines = {
        "Persistent history of activity across multiple log types. Each sub-tab is a different category — switch with the inner tab strip at the top.",
        "|cffffd700Mail|r — every mail received and sent: who, what, when, how much. Multi-item mails taken within a 5-second window are merged into one entry.",
        "|cffffd700Trade|r — every completed player-to-player trade (coming in a follow-on patch).",
        "|cffffd700Guild|r — guild roster events (joins / leaves / promotes) persisted beyond Blizzard's built-in ~100-entry cap.",
        "|cffffd700Guild Bank|r — guild bank transactions (deposits / withdraws / moves / repairs) snapshotted every time you open the bank, persisted beyond Blizzard's small rolling buffer. Each entry carries a stable cross-viewer id for future cross-addon sync.",
        "|cffffd700Whispers|r — every whisper sent or received (in-game and Battle.net), with substring search across the message body and the partner name, GM/BN type filters, and the same date-range picker every other sub-tab uses.",
        " ",
        "|cffffd700Filters:|r each sub-tab has its own character + date range filters above the table. Click a column header to sort; click again to reverse.",
        "|cffffd700Settings:|r turn the whole Logs feature on/off (or individual log types) via |cffffd700ESC > Options > AddOns > TOG Tools > Modules|r.",
    },
}

-- Per-character last-viewed sub-tab. Stored under db.char.frames so it
-- rides alongside the main window's other per-char UI state.
local function getActiveSubTab()
    local frames = addon.DB and addon.DB.char and addon.DB.char.frames
    return frames and frames.logsActiveSubTab
end
local function setActiveSubTab(key)
    local frames = addon.DB and addon.DB.char and addon.DB.char.frames
    if frames then frames.logsActiveSubTab = key end
end

local function BuildInnerTabDefs()
    local defs = {}
    for key, cat in pairs(addon.logCategories or {}) do
        -- A category may declare its own `gate()` (Diagnostics gates on the
        -- Developer Tools switch). A gated category is governed SOLELY by its
        -- gate — it never falls back to the Logs master + per-category toggles
        -- that drive the ordinary gameplay logs.
        local shown
        if cat.gate then shown = cat.gate() else shown = addon:IsLogCategoryEnabled(key) end
        if cat.label and shown then
            tinsert(defs, { value = key, text = cat.label, order = cat.order or 100 })
        end
    end
    -- Lower `order` first (Graphs declares order 0 to lead the strip); the
    -- capture logs have no order and fall back to 100, staying alphabetical
    -- among themselves.
    table.sort(defs, function(a, b)
        if a.order ~= b.order then return a.order < b.order end
        return a.text < b.text
    end)
    return defs
end

function Tab:Draw(container)
    container:SetLayout("Fill")

    local defs = BuildInnerTabDefs()
    if #defs == 0 then
        local note = AceGUI:Create("Label")
        note:SetFullWidth(true)
        note:SetText("|cffffaa55No log categories enabled.|r\n\nEnable Mail / Trade / Guild via |cffffd700ESC > Options > AddOns > TOG Tools > Modules|r.")
        container:AddChild(note)
        return
    end

    -- Resolution order: caller-supplied pending sub-tab → SV-cached last
    -- viewed → alphabetically first.
    local start = self.pendingSubTab or getActiveSubTab() or defs[1].value
    self.pendingSubTab = nil
    local valid = false
    for _, d in ipairs(defs) do if d.value == start then valid = true break end end
    if not valid then start = defs[1].value end

    local tg = AceGUI:Create("TabGroup")
    tg:SetTabs(defs)
    tg:SetLayout("Fill")
    tg:SetFullWidth(true)
    tg:SetFullHeight(true)
    tg:SetCallback("OnGroupSelected", function(widget, _, value)
        setActiveSubTab(value)
        widget:ReleaseChildren()
        local cat = addon.logCategories[value]
        if cat and cat.Draw then
            cat:Draw(widget)
        else
            local fs = AceGUI:Create("Label")
            fs:SetFullWidth(true)
            fs:SetText("Sub-tab \"" .. tostring(value) .. "\" — not yet implemented")
            widget:AddChild(fs)
        end
    end)
    container:AddChild(tg)
    tg:SelectTab(start)
end
