-- Globals
KB = KB or {}

-- Defaults setzen
local dbDefaults = {
    enableRLCommand = true,
    enableGoldTracking = true,
    enableLevelUpSound = true,
    showFrameAtLogin = false,
    enableDebugLogs = true,
    enableLoginMessage = true,
    announceBuildVersion = true,
    enalbeMobKills = true
}

local dbCharDefaults = {
    mobKills = 0,
    Logins = 0,
    lootedGold = 0,
    lootedSilber = 0,
    lootedKupfer = 0
}

if not KevsBasicsDB then
    KevsBasicsDB = CopyTable(dbDefaults)
end

if not KevsBasicsCharDB then
    KevsBasicsCharDB = CopyTable(dbCharDefaults)
end

-- Hauptfenster initialisieren
local mainFrame = CreateFrame("Frame", "KBMain", UIParent, "BasicFrameTemplateWithInset");
mainFrame:SetSize(500, 350)
mainFrame:SetPoint("CENTER", UIParent, "CENTER", 0, 0)

-- Titel setzen
mainFrame.TitleBg:SetHeight(30)
mainFrame.title = mainFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
mainFrame.title:SetPoint("TOPLEFT", mainFrame.TitleBg, "TOPLEFT", 5, -5);
mainFrame.title:SetText("Kevs Basics");
mainFrame:Hide()

-- Spielernamen setzen
mainFrame.playerName = mainFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
mainFrame.playerName:SetPoint("TOPLEFT", mainFrame, "TOPLEFT", 15, -35)
mainFrame.playerName:SetText("Charakter: ".. UnitName("player") .. " (Level: " .. UnitLevel("player") .. ")")

-- Spielerkills anzeigen
mainFrame.totalPlayerKills = mainFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
mainFrame.totalPlayerKills:SetPoint("TOPLEFT", mainFrame.playerName, "BOTTOMLEFT", 0, -10)
mainFrame.totalPlayerKills:SetText("Insgesamt Mobs getötet: " .. (KevsBasicsCharDB.mobKills or "0"))

-- Spielergold anzeigen
mainFrame.totalGold = mainFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
mainFrame.totalGold:SetPoint("TOPLEFT", mainFrame.totalPlayerKills, "BOTTOMLEFT", 0, -10)
mainFrame.totalGold:SetText("Gold gesamt gelootet: " .. (KevsBasicsCharDB.lootedGold or "0") .. " Gold, " .. (KevsBasicsCharDB.lootedSilber or "0") .. " Silber, " .. (KevsBasicsCharDB.lootedKupfer or "0") .. " Kupfer")

-- Funktionen für das Fenster aktivieren
mainFrame:EnableMouse(true)
mainFrame:SetMovable(true)
mainFrame:RegisterForDrag("LeftButton")

mainFrame:SetScript("OnDragStart", function(self)
    self:StartMoving()
end)

mainFrame:SetScript("OnDragStop", function(self)
    self:StopMovingOrSizing()
end)

mainFrame:SetScript("OnHide", function()
    PlaySound(808)
end)

mainFrame:SetScript("OnShow", function()
    PlaySound(809)
    mainFrame.totalGold:SetText("Gold gesamt gelootet: " .. (KevsBasicsCharDB.lootedGold or "0") .. " Gold, " .. (KevsBasicsCharDB.lootedSilber or "0") .. " Silber, " .. (KevsBasicsCharDB.lootedKupfer or "0") .. " Kupfer")
    mainFrame.totalPlayerKills:SetText("Insgesamt Mobs getötet: " .. (KevsBasicsCharDB.mobKills or "0"))
end)

-- Unsichtbares Frame für Funktionen / Events
local eventListenerFrame = CreateFrame("Frame", "KBEvents", UIParent)

local function eventHandler(self, event, ...)
    local _, eventType = CombatLogGetCurrentEventInfo()

    if event == "COMBAT_LOG_EVENT_UNFILTERED" then
        if eventType and eventType == "PARTY_KILL" then
            KevsBasicsCharDB.mobKills = KevsBasicsCharDB.mobKills + 1

            if KevsBasicsDB.enalbeMobKills then
                print("[KB] Insgesamte Mobs getötet: "..KevsBasicsCharDB.mobKills)
            end
        end
    elseif event == "CHAT_MSG_MONEY" then
        local msg = ...
        local gold = tonumber(string.match(msg, "(%d+) Gold")) or 0
        local silber = tonumber(string.match(msg, "(%d+) Silber")) or 0
        local kupfer = tonumber(string.match(msg, "(%d+) Kupfer")) or 0

        KevsBasicsCharDB.lootedGold = (KevsBasicsCharDB.lootedGold or 0) + gold
        KevsBasicsCharDB.lootedSilber = (KevsBasicsCharDB.lootedSilber or 0) + silber
        KevsBasicsCharDB.lootedKupfer = (KevsBasicsCharDB.lootedKupfer or 0) + kupfer

        if KevsBasicsCharDB.lootedKupfer >= 100 then
            KevsBasicsCharDB.lootedKupfer = KevsBasicsCharDB.lootedKupfer % 100
            KevsBasicsCharDB.lootedSilber = KevsBasicsCharDB.lootedSilber + math.floor(KevsBasicsCharDB.lootedKupfer / 100)
        end

        if KevsBasicsCharDB.lootedSilber >= 100 then
            KevsBasicsCharDB.lootedSilber = KevsBasicsCharDB.lootedSilber % 100
            KevsBasicsCharDB.lootedGold = KevsBasicsCharDB.lootedGold + math.floor(KevsBasicsCharDB.lootedSilber / 100)
        end
    elseif event == "PLAYER_LOGIN" then
        KevsBasicsCharDB.Logins = KevsBasicsCharDB.Logins + 1

        if KevsBasicsDB.enableLoginMessage then
            print("[KB] Du hast dich bereits ".. self.chardb.Logins .. " mal auf diesem Charakter eingeloggt.")
        end
    elseif event == "PLAYER_LEVEL_UP" then
        if KevsBasicsDB.enableLevelUpSound then
            PlaySoundFile(567528)
        end
        print("[KB] Herzlichen Glückwunsch! Du hast Level " .. UnitLevel("player") .. " erreicht!")
    elseif event == "ADDON_LOADED" then
        KevsBasicsDB = KevsBasicsDB or CopyTable(dbDefaults)
        self.db = KevsBasicsDB

        KevsBasicsCharDB = KevsBasicsCharDB or CopyTable(dbCharDefaults)
        self.chardb = KevsBasicsCharDB

        DebugLog("KevsBasics erfolgreich geladen!")

        if self.db.announceBuildVersion then
            local version, build, _, tocVersion = GetBuildInfo()
            print(format("[KB] WoW Version: %s (%d). Addon Version: %d", version, build, tocVersion))
        end
    end

    if mainFrame:IsShown() then
        mainFrame.totalGold:SetText("Gold gesamt gelootet: " .. (KevsBasicsCharDB.lootedGold or "0") .. " Gold, " .. (KevsBasicsCharDB.lootedSilber or "0") .. " Silber, " .. (KevsBasicsCharDB.lootedKupfer or "0") .. " Kupfer")
        mainFrame.totalPlayerKills:SetText("Insgesamt Mobs getötet: " .. (KevsBasicsCharDB.mobKills or "0"))
    end
end

eventListenerFrame:SetScript("OnEvent", eventHandler)
eventListenerFrame:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
eventListenerFrame:RegisterEvent("ADDON_LOADED")
eventListenerFrame:RegisterEvent("CHAT_MSG_MONEY")
eventListenerFrame:RegisterEvent("PLAYER_LOGIN")
eventListenerFrame:RegisterEvent("PLAYER_LEVEL_UP")

-- SLash Commands
SLASH_Reload1 = "/rl"
SLASH_KB1 = "/kb"
SLASH_KB2 = "/kevsbasics"

SlashCmdList["Reload"] = function()
    if KevsBasicsDB.enableRLCommand then
        ReloadUI()
    end
end

SlashCmdList["KB"] = function(msg)
    if msg == "open" then
        if mainFrame:IsVisible() then
            mainFrame:Hide()
        else
            mainFrame:Show()
        end
    elseif msg == "clear" then
        for i = 1, NUM_CHAT_WINDOWS do
            _G["ChatFrame"..i]:Clear()
        end
    elseif msg == "reset" then
        KevsBasicsCharDB.Logins = 0
        print("[KB] Deine Logins wurden zurückgesetzt.")
    elseif msg == "logins" then
        print("[KB] Du hast dich bereits ".. KevsBasicsCharDB.Logins .. " mal auf diesem Charakter eingeloggt.")
    else
        print("[KB] Verfügbare Befehle:")
        print("[KB] /kb open - Zeigt das Addon-Fenster an")
        print("[KB] /kb logins - Zeigt an, wie oft du dich bereits eingeloggt hast")
        print("[KB] /kb reset - Setzt deine Logins zurück")
    end
end

-- Frame auch mit ESC schließen
table.insert(UISpecialFrames, "KBMain")

-- Allgemeine Funktionen
function DebugLog(msg)
    if KevsBasicsDB and KevsBasicsDB.enableDebugLogs then
        print("[KB] "..msg)
    end
end

function KB:ToggleMainFrame()
    if not mainFrame:IsShown() then
        mainFrame:Show()
    else
        mainFrame:Hide()
    end
end