local AceConfig = LibStub("AceConfig-3.0")
local AceConfigDialog = LibStub("AceConfigDialog-3.0")
local AceConfigRegistry = LibStub("AceConfigRegistry-3.0")
local LSM = LibStub("LibSharedMedia-3.0")
local AceDB = LibStub("AceDB-3.0")

-- Configuración inicial del perfil
local defaults = {
    profile = {
        font1 = "Expressway",
        font2 = "Expressway",
        font3 = "Expressway",
    }
}

local db -- Declarar db como variable global/local

-- Función para registrar las fuentes seleccionadas en LSM
local function RegisterSelectedFonts()
    if db then
        LSM:Register("font", "Noisi Font 1", LSM:Fetch("font", db.profile.font1))
        LSM:Register("font", "Noisi Font 2", LSM:Fetch("font", db.profile.font2))
        LSM:Register("font", "Noisi Font 3", LSM:Fetch("font", db.profile.font3))
        print("Fuentes registradas en LSM:")
        print("Noisi Font 1:", db.profile.font1)
        print("Noisi Font 2:", db.profile.font2)
        print("Noisi Font 3:", db.profile.font3)
    end
end

-- Función para obtener la lista de fuentes registradas en LibSharedMedia
local function GetFontList()
    local fonts = {}
    for name, path in pairs(LSM:HashTable("font")) do
        fonts[name] = name -- Mostrar el nombre de la fuente en el desplegable
    end
    return fonts
end

-- Crear una ventana de confirmación para recargar la interfaz
local function ShowReloadUIWindow()
    -- Crear el frame principal
    local reloadFrame = CreateFrame("Frame", "ReloadUIFrame", UIParent, "BasicFrameTemplateWithInset")
    reloadFrame:SetSize(300, 150) -- Tamaño de la ventana
    reloadFrame:SetPoint("CENTER") -- Posición en el centro de la pantalla
    reloadFrame:SetFrameStrata("DIALOG")
    reloadFrame:SetMovable(true)
    reloadFrame:EnableMouse(true)
    reloadFrame:RegisterForDrag("LeftButton")
    reloadFrame:SetScript("OnDragStart", reloadFrame.StartMoving)
    reloadFrame:SetScript("OnDragStop", reloadFrame.StopMovingOrSizing)

    -- Título de la ventana
    reloadFrame.title = reloadFrame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
    reloadFrame.title:SetPoint("CENTER", reloadFrame.TitleBg, "CENTER", 0, 0)
    reloadFrame.title:SetText("Reload Required")

    -- Texto dentro de la ventana
    reloadFrame.text = reloadFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
    reloadFrame.text:SetPoint("TOP", 0, -40)
    reloadFrame.text:SetText("Changes require a reload.\nDo you want to reload now?")

    -- Botón para recargar ahora
    local reloadNowButton = CreateFrame("Button", nil, reloadFrame, "GameMenuButtonTemplate")
    reloadNowButton:SetPoint("BOTTOMLEFT", 20, 20)
    reloadNowButton:SetSize(120, 30)
    reloadNowButton:SetText("Reload Now")
    reloadNowButton:SetNormalFontObject("GameFontNormal")
    reloadNowButton:SetHighlightFontObject("GameFontHighlight")
    reloadNowButton:SetScript("OnClick", function()
        ReloadUI() -- Recargar la interfaz
    end)

    -- Botón para cerrar la ventana
    local closeButton = CreateFrame("Button", nil, reloadFrame, "GameMenuButtonTemplate")
    closeButton:SetPoint("BOTTOMRIGHT", -20, 20)
    closeButton:SetSize(120, 30)
    closeButton:SetText("Close")
    closeButton:SetNormalFontObject("GameFontNormal")
    closeButton:SetHighlightFontObject("GameFontHighlight")
    closeButton:SetScript("OnClick", function()
        reloadFrame:Hide() -- Cerrar la ventana
    end)
end

-- Opciones del addon
local options = {
    name = "Font Selector",
    type = "group",
    args = {
        font1 = {
            type = "select",
            name = "Font 1",
            desc = "Select the first font",
            values = GetFontList,
            get = function() return db.profile.font1 end,
            set = function(_, value)
                db.profile.font1 = value
                print("Font 1 set to:", value)

                -- Registrar la fuente seleccionada en LSM
                RegisterSelectedFonts()

                -- Mostrar la ventana de recarga
                ShowReloadUIWindow()

                -- Forzar la escritura de los datos
                db:SaveProfile()
            end,
            dialogControl = "LSM30_Font",
            order = 1,
        },
        font2 = {
            type = "select",
            name = "Font 2",
            desc = "Select the second font",
            values = GetFontList,
            get = function() return db.profile.font2 end,
            set = function(_, value)
                db.profile.font2 = value
                print("Font 2 set to:", value)

                -- Registrar la fuente seleccionada en LSM
                RegisterSelectedFonts()

                -- Mostrar la ventana de recarga
                ShowReloadUIWindow()

                -- Forzar la escritura de los datos
                db:SaveProfile()
            end,
            dialogControl = "LSM30_Font",
            order = 2,
        },
        font3 = {
            type = "select",
            name = "Font 3",
            desc = "Select the third font",
            values = GetFontList,
            get = function() return db.profile.font3 end,
            set = function(_, value)
                db.profile.font3 = value
                print("Font 3 set to:", value)

                -- Registrar la fuente seleccionada en LSM
                RegisterSelectedFonts()

                -- Mostrar la ventana de recarga
                ShowReloadUIWindow()

                -- Forzar la escritura de los datos
                db:SaveProfile()
            end,
            dialogControl = "LSM30_Font",
            order = 3,
        },
    },
}

-- Crear un frame para manejar eventos
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:SetScript("OnEvent", function(self, event, ...)
    -- Crear base de datos para guardar las configuraciones
    db = AceDB:New("FontSelectorDB", defaults, true)

    -- Registrar las opciones en el menú de accesorios
    AceConfig:RegisterOptionsTable("FontSelector", options)
    AceConfigDialog:AddToBlizOptions("FontSelector", "Font Selector")

    -- Registrar las fuentes seleccionadas en LSM al cargar el addon
    RegisterSelectedFonts()

    -- Mensaje de depuración para confirmar que el addon se cargó
    DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00FONT SELECTOR loaded!|r")
end)