-- ══════════════════════════════════════════════════════════════
-- MODUL: Logbook — persistentes, zeitgenaues Logbuch / Logbook
-- ══════════════════════════════════════════════════════════════
-- Schreibt zeitgestempelte Eintraege (was / warum / Fehler) in die
-- SavedVariables, damit man Probleme spaeter nachverfolgen kann.
-- DE + ENG (automatische Client-Erkennung). Persistent ueber Reloads.
--
-- API:
--   GDL:Log(category, message)   -- ein Eintrag (Kategorie + Text)
--   GDL:LogError(context, err)   -- Fehler-Eintrag
--   /gdl log [n]                 -- letzte n Eintraege im Chat
--   /gdl log export              -- Copy-Fenster mit allem
--   /gdl log clear               -- Logbuch leeren
-- ══════════════════════════════════════════════════════════════

local addonName, addon = ...
local GDL = _G["GuildDeathLog"]
local Logbook = {}

local MAX_ENTRIES = 600          -- Ringpuffer-Groesse
local DE = (GetLocale and GetLocale() == "deDE")

local function L(de, en) return DE and de or en end

local function store()
    GuildDeathLogDB = GuildDeathLogDB or {}
    GuildDeathLogDB.logbook = GuildDeathLogDB.logbook or {}
    return GuildDeathLogDB.logbook
end

-- ── Schreib-API (am GDL-Objekt, von ueberall nutzbar) ─────────────────────────
function GDL:Log(category, message)
    -- Aufruf GDL:Log("nur text") -> Kategorie INFO
    if message == nil then category, message = "INFO", category end
    local log = store()
    log[#log + 1] = {
        t   = time(),
        cat = tostring(category or "INFO"),
        msg = tostring(message or ""),
    }
    -- Ringpuffer: aelteste raus
    while #log > MAX_ENTRIES do table.remove(log, 1) end
end

function GDL:LogError(context, err)
    self:Log("ERROR", (context and (context .. ": ") or "") .. tostring(err))
end

-- ── Lese-/Pflege-API ──────────────────────────────────────────────────────────
function Logbook:GetRecent(n)
    local log = store()
    n = n or 30
    local out = {}
    for i = math.max(1, #log - n + 1), #log do out[#out + 1] = log[i] end
    return out
end

function Logbook:Count()
    return #store()
end

function Logbook:Clear()
    GuildDeathLogDB.logbook = {}
    GDL:Log("LOGBOOK", L("Logbuch geleert.", "Logbook cleared."))
end

function Logbook:Export()
    local log = store()
    local lines = {
        L("=== Logbuch — Buch der Gefallenen ===", "=== Logbook — Book of the Fallen ==="),
        L("Exportiert: ", "Exported: ") .. date("%Y-%m-%d %H:%M:%S") ..
            "  |  v" .. (GDL.version or "?") .. "  |  " .. (GDL.expansionLabel or "Classic"),
        "",
    }
    for _, e in ipairs(log) do
        lines[#lines + 1] = string.format("[%s] [%s] %s",
            date("%Y-%m-%d %H:%M:%S", e.t), e.cat, e.msg)
    end
    return table.concat(lines, "\n")
end

-- Faerbung je Kategorie (nur Kosmetik im Chat)
local CAT_COLOR = {
    ERROR   = "ff5555",
    DEATH   = "ff8866",
    SYNC    = "66aaff",
    CALENDAR= "ffcc55",
    BULLETIN= "ffcc55",
    SESSION = "88dd88",
    LOGBOOK = "aaaaaa",
    DEBUG   = "888888",
    INFO    = "cccccc",
}

-- ── Chat-Ausgabe der letzten n Eintraege ──────────────────────────────────────
function Logbook:Print(n)
    n = n or 25
    local entries = self:GetRecent(n)
    GDL:Print(L("Logbuch — letzte ", "Logbook — last ") .. #entries ..
        L(" Eintraege (von ", " entries (of ") .. self:Count() .. "):")
    if #entries == 0 then
        GDL:Print(L("  (leer)", "  (empty)"))
        return
    end
    for _, e in ipairs(entries) do
        local col = CAT_COLOR[e.cat] or "cccccc"
        print(string.format("|cff888888%s|r |cff%s[%s]|r %s",
            date("%H:%M:%S", e.t), (col:gsub("%s","")), e.cat, e.msg))
    end
    GDL:Print(L("Alles kopieren: /gdl log export", "Copy all: /gdl log export"))
end

-- Copy-Fenster (nutzt das generische Feld der MemorialCard, sonst Chat-Hinweis)
function Logbook:ShowExportWindow()
    local MC = GDL:GetModule("MemorialCard")
    if MC and MC.ShowCopyText then
        MC:ShowCopyText(self:Export())
    else
        GDL:Print(L("Copy-Fenster nicht verfuegbar.", "Copy window unavailable."))
    end
end

function Logbook:Initialize()
    -- Session-Marker beim Login
    GDL:Log("SESSION", L("Login", "Login") .. " — " ..
        (GDL.expansionLabel or "Classic") .. " — v" .. (GDL.version or "?"))
end

GDL:RegisterModule("Logbook", Logbook)
