-------------------------
-- AiB Profiles UI
-- v2.1.0.0 – Profil-Verwaltung über AceDB-3.0
-------------------------

AiB = AiB or {}
AiB.Profiles = {}

local FONT = "Fonts\\FRIZQT__.TTF"

-- Hilfsfunktion: Styled Button erstellen
local function MakeButton(parent, label, xOff, yOff, width, onClick)
    local btn = CreateFrame("Button", nil, parent, "BackdropTemplate")
    btn:SetSize(width or 170, 30)
    btn:SetPoint("TOPLEFT", parent, "TOPLEFT", xOff, yOff)
    btn:SetBackdrop(AiB.Utils:CreateBackdrop(btn))
    AiB.Themes:ApplyToFrame(btn, "tab_normal", "border_secondary")

    local text = btn:CreateFontString(nil, "OVERLAY")
    text:SetFont(FONT, 13)
    text:SetAllPoints()
    text:SetJustifyH("CENTER")
    text:SetText(label)
    AiB.Themes:ApplyToText(text, "text_primary")
    btn.label = text

    btn:SetScript("OnEnter", function(self)
        AiB.Themes:ApplyToFrame(self, "tab_hover", "border_accent")
    end)
    btn:SetScript("OnLeave", function(self)
        AiB.Themes:ApplyToFrame(self, "tab_normal", "border_secondary")
    end)
    btn:SetScript("OnClick", onClick)
    return btn
end

-- Hilfsfunktion: Abschnittüberschrift
local function MakeHeader(parent, text, xOff, yOff)
    local h = parent:CreateFontString(nil, "OVERLAY")
    h:SetFont(FONT, 14, "OUTLINE")
    h:SetPoint("TOPLEFT", parent, "TOPLEFT", xOff, yOff)
    h:SetText(text)
    h:SetTextColor(1, 0.8, 0, 1)
    return h
end

-- Hilfsfunktion: Beschreibungstext
local function MakeDesc(parent, text, xOff, yOff, width)
    local d = parent:CreateFontString(nil, "OVERLAY")
    d:SetFont(FONT, 11)
    d:SetPoint("TOPLEFT", parent, "TOPLEFT", xOff, yOff)
    d:SetWidth(width or 700)
    d:SetJustifyH("LEFT")
    d:SetWordWrap(true)
    d:SetText(text)
    d:SetTextColor(0.7, 0.7, 0.7, 1)
    return d
end

-- Hilfsfunktion: Trennlinie
local function MakeSeparator(parent, yOff)
    local line = parent:CreateTexture(nil, "ARTWORK")
    line:SetHeight(1)
    line:SetPoint("TOPLEFT",  parent, "TOPLEFT",  20, yOff)
    line:SetPoint("TOPRIGHT", parent, "TOPRIGHT", -20, yOff)
    line:SetColorTexture(1, 0.6, 0, 0.4)
    return line
end

-- =========================================================
-- HAUPT-FUNKTION: Profil-Tab Inhalt aufbauen
-- =========================================================
function AiB.Profiles.LoadTab(parent)
    local db = AiB.db
    if not db then
        local warn = parent:CreateFontString(nil, "OVERLAY")
        warn:SetFont(FONT, 13)
        warn:SetPoint("CENTER", parent, "CENTER")
        warn:SetText("|cFFFF4444AceDB noch nicht initialisiert.|r")
        return
    end

    local yOffset = -20

    -- === TITEL ===
    local title = parent:CreateFontString(nil, "OVERLAY")
    title:SetFont(FONT, 20, "OUTLINE")
    title:SetPoint("TOPLEFT", parent, "TOPLEFT", 20, yOffset)
    title:SetText("Profil-Verwaltung")
    title:SetTextColor(1, 0.8, 0, 1)
    yOffset = yOffset - 35

    MakeDesc(parent,
        "Profile speichern alle Addon-Einstellungen (Cursor, Fadenkreuz, Buff Watcher, usw.).\n" ..
        "Erstelle z.B. Profile für verschiedene Rollen oder teile Einstellungen zwischen Charakteren.\n" ..
        "Fenster-Positionen und der Raid/M+-Modus bleiben immer charakterspezifisch.",
        20, yOffset, 800)
    yOffset = yOffset - 55

    MakeSeparator(parent, yOffset)
    yOffset = yOffset - 20

    -- === AKTIVES PROFIL ===
    MakeHeader(parent, "Aktives Profil", 20, yOffset)
    yOffset = yOffset - 32

    local currentProfileName = db:GetCurrentProfile()

    -- activeBox not needed
    local activeTxt = parent:CreateFontString(nil, "OVERLAY")
    activeTxt:SetFont(FONT, 14)
    activeTxt:SetPoint("TOPLEFT", parent, "TOPLEFT", 30, yOffset)
    activeTxt:SetText("|cFFFFD700" .. currentProfileName .. "|r")
    yOffset = yOffset - 40

    MakeSeparator(parent, yOffset)
    yOffset = yOffset - 20

    -- === PROFIL WECHSELN ===
    MakeHeader(parent, "Profil wechseln / auswählen", 20, yOffset)
    yOffset = yOffset - 32

    -- Profil-Dropdown
    local profiles = {}
    db:GetProfiles(profiles)

    local selectedProfile = currentProfileName
    local ddLabel = parent:CreateFontString(nil, "OVERLAY")
    ddLabel:SetFont(FONT, 12)
    ddLabel:SetPoint("TOPLEFT", parent, "TOPLEFT", 30, yOffset + 2)
    ddLabel:SetText("Profil:")
    ddLabel:SetTextColor(1, 1, 1, 1)

    local profileDD = CreateFrame("Frame", "AiBProfileSelectDropdown_" .. GetTime(), parent, "UIDropDownMenuTemplate")
    profileDD:SetPoint("TOPLEFT", parent, "TOPLEFT", 75, yOffset + 5)
    UIDropDownMenu_SetWidth(profileDD, 220)
    UIDropDownMenu_SetText(profileDD, selectedProfile)

    UIDropDownMenu_Initialize(profileDD, function(self, level)
        local current = db:GetCurrentProfile()
        local list = {}
        db:GetProfiles(list)
        for _, name in ipairs(list) do
            local info = UIDropDownMenu_CreateInfo()
            info.text = (name == current) and ("|cFFFFD700" .. name .. "|r  (aktiv)") or name
            info.checked = (name == selectedProfile)
            info.notCheckable = false
            info.func = function()
                selectedProfile = name
                UIDropDownMenu_SetText(profileDD, name)
                CloseDropDownMenus()
            end
            UIDropDownMenu_AddButton(info, level)
        end
    end)
    yOffset = yOffset - 45

    -- Buttons für Dropdown-Aktionen
    MakeButton(parent, "Aktivieren", 30, yOffset, 165, function()
        if selectedProfile and selectedProfile ~= db:GetCurrentProfile() then
            db:SetProfile(selectedProfile)
            -- Tab wird via OnProfileChanged neu geladen
        else
            print("|cFFFF8800[AiB]|r Profil '" .. selectedProfile .. "' ist bereits aktiv.")
        end
    end)

    MakeButton(parent, "Kopieren von...", 205, yOffset, 210, function()
        if selectedProfile == db:GetCurrentProfile() then
            print("|cFFFF8800[AiB]|r Wähle ein anderes Profil als Quelle.")
            return
        end
        StaticPopupDialogs["AIB_COPY_PROFILE"] = {
            text = "Einstellungen von |cFFFFD700" .. selectedProfile ..
                   "|r in das aktive Profil |cFFFFD700" .. db:GetCurrentProfile() ..
                   "|r kopieren?\n\nDies überschreibt alle aktuellen Einstellungen!",
            button1 = "Kopieren",
            button2 = "Abbrechen",
            OnAccept = function()
                db:CopyProfile(selectedProfile)
                print("|cFFFF8800[AiB]|r Einstellungen von |cFFFFD700" .. selectedProfile .. "|r kopiert.")
            end,
            timeout = 0, whileDead = true, hideOnEscape = true,
            preferredIndex = 3,
        }
        StaticPopup_Show("AIB_COPY_PROFILE")
    end)

    MakeButton(parent, "Profil löschen", 425, yOffset, 165, function()
        if selectedProfile == db:GetCurrentProfile() then
            print("|cFFFF8800[AiB]|r Das aktive Profil kann nicht gelöscht werden.")
            return
        end
        StaticPopupDialogs["AIB_DELETE_PROFILE"] = {
            text = "Profil |cFFFFD700" .. selectedProfile .. "|r wirklich löschen?\n\nDiese Aktion kann nicht rückgängig gemacht werden.",
            button1 = "Löschen",
            button2 = "Abbrechen",
            OnAccept = function()
                db:DeleteProfile(selectedProfile, true)
                -- Tab neu laden
                if AiB.Settings and AiB.Settings.ShowTab then
                    AiB.Settings:ShowTab("profiles")
                end
                print("|cFFFF8800[AiB]|r Profil |cFFFFD700" .. selectedProfile .. "|r gelöscht.")
            end,
            timeout = 0, whileDead = true, hideOnEscape = true,
            preferredIndex = 3,
        }
        StaticPopup_Show("AIB_DELETE_PROFILE")
    end)
    yOffset = yOffset - 50

    MakeSeparator(parent, yOffset)
    yOffset = yOffset - 20

    -- === NEUES PROFIL ERSTELLEN ===
    MakeHeader(parent, "Neues Profil erstellen", 20, yOffset)
    yOffset = yOffset - 32

    MakeDesc(parent, "Erstellt ein leeres Profil mit Standard-Einstellungen. Du wirst sofort zu dem neuen Profil gewechselt.",
        30, yOffset, 700)
    yOffset = yOffset - 35

    MakeButton(parent, "+ Neues Profil erstellen", 30, yOffset, 230, function()
        StaticPopupDialogs["AIB_NEW_PROFILE"] = {
            text = "Name für das neue Profil:",
            button1 = "Erstellen",
            button2 = "Abbrechen",
            hasEditBox = true,
            maxLetters = 64,
            OnAccept = function(self)
                local name = (self.editBox or self.EditBox):GetText()
                if name and name ~= "" then
                    db:SetProfile(name)
                    print("|cFFFF8800[AiB]|r Profil |cFFFFD700'" .. name .. "'|r erstellt und aktiviert.")
                else
                    print("|cFFFF8800[AiB]|r Bitte gib einen Profilnamen ein.")
                end
            end,
            timeout = 0, whileDead = true, hideOnEscape = true,
            preferredIndex = 3,
        }
        StaticPopup_Show("AIB_NEW_PROFILE")
    end)
    yOffset = yOffset - 50

    MakeSeparator(parent, yOffset)
    yOffset = yOffset - 20

    -- === AKTUELLES PROFIL ZURÜCKSETZEN ===
    MakeHeader(parent, "Aktuelles Profil zurücksetzen", 20, yOffset)
    yOffset = yOffset - 32

    MakeDesc(parent, "Setzt |cFFFFD700alle Einstellungen|r des aktiven Profils auf die Standard-Werte zurück.\n" ..
        "Profil-Name und andere Profile bleiben erhalten.",
        30, yOffset, 700)
    yOffset = yOffset - 45

    MakeButton(parent, "Profil zurücksetzen", 30, yOffset, 210, function()
        StaticPopupDialogs["AIB_RESET_PROFILE"] = {
            text = "Aktives Profil |cFFFFD700'" .. db:GetCurrentProfile() ..
                   "'|r auf Standard-Einstellungen zurücksetzen?\n\n" ..
                   "Alle Einstellungen in diesem Profil gehen verloren!",
            button1 = "Zurücksetzen",
            button2 = "Abbrechen",
            OnAccept = function()
                db:ResetProfile()
                print("|cFFFF8800[AiB]|r Profil |cFFFFD700'" .. db:GetCurrentProfile() .. "'|r zurückgesetzt.")
            end,
            timeout = 0, whileDead = true, hideOnEscape = true,
            preferredIndex = 3,
        }
        StaticPopup_Show("AIB_RESET_PROFILE")
    end)
    yOffset = yOffset - 55

    MakeSeparator(parent, yOffset)
    yOffset = yOffset - 20

    -- === PROFIL-LISTE ===
    MakeHeader(parent, "Alle Profile", 20, yOffset)
    yOffset = yOffset - 10

    MakeDesc(parent, "Grüner Pfeil = aktives Profil. Klicke oben auf 'Profil wechseln' um zu wechseln.",
        30, yOffset - 15, 700)
    yOffset = yOffset - 45

    local current = db:GetCurrentProfile()
    local allProfiles = {}
    db:GetProfiles(allProfiles)

    for i, name in ipairs(allProfiles) do
        local isActive = (name == current)
        local row = parent:CreateFontString(nil, "OVERLAY")
        row:SetFont(FONT, 13)
        row:SetPoint("TOPLEFT", parent, "TOPLEFT", 30, yOffset)

        if isActive then
            row:SetText("|cFF00FF00>>|r  |cFFFFD700" .. name .. "|r   |cFF888888(aktives Profil)|r")
        else
            row:SetText("|cFF666666 -|r  |cFFCCCCCC" .. name .. "|r")
        end
        yOffset = yOffset - 28
    end

    yOffset = yOffset - 10

    -- === TIPPS ===
    MakeSeparator(parent, yOffset)
    yOffset = yOffset - 20

    MakeHeader(parent, "Tipps zur Profil-Nutzung", 20, yOffset)
    yOffset = yOffset - 32

    local tips = {
        "|cFFFFD700Rollen-Profile:|r  Erstelle Profile 'Tank', 'Healer', 'DPS' mit passenden Cursor-Farben und Buff-Watcher-Einstellungen.",
        "|cFFFFD700Mehrere Chars:|r  Wähle dasselbe Profil auf jedem Charakter – alle teilen die gleichen Einstellungen.",
        "|cFFFFD700Einstellungen weitergeben:|r  Wechsle zum Ziel-Profil, dann nutze 'Einstellungen kopieren' um Einstellungen von einem anderen Profil zu übertragen.",
        "|cFFFFD700Standard-Profil:|r  Beim ersten Start wird automatisch ein Profil mit deinem Charakter-Namen erstellt.",
    }
    for _, tip in ipairs(tips) do
        local tipTxt = parent:CreateFontString(nil, "OVERLAY")
        tipTxt:SetFont(FONT, 11)
        tipTxt:SetPoint("TOPLEFT", parent, "TOPLEFT", 30, yOffset)
        tipTxt:SetWidth(780)
        tipTxt:SetJustifyH("LEFT")
        tipTxt:SetWordWrap(true)
        tipTxt:SetText(tip)
        tipTxt:SetTextColor(0.8, 0.8, 0.8, 1)
        yOffset = yOffset - 32
    end
end
