-- QuestTextOverlay.lua
-- Crea un frame independiente para mostrar el texto de la misión actual

-- Asegurarse de que VoiceOver esté correctamente definido
VoiceOver = VoiceOver or {}
setfenv(1, VoiceOver)

-- Crear el módulo QuestTextOverlay
QuestTextOverlay = {}

-- Función para imprimir mensajes de depuración
local function DebugPrint(message)
    if Addon.db and Addon.db.profile.DebugEnabled then
        print("|cFF00FF00[VoiceOver Debug]|r QuestTextOverlay:", message)
    end
end

-- Constantes para el frame
local FRAME_WIDTH = 450
local FRAME_HEIGHT = 200
local FRAME_PADDING = 15

-- Inicializar el overlay de texto de misión
function QuestTextOverlay:Initialize()
    -- Crear la fuente para el texto de la misión
    do
        local font = CreateFont("VoiceOverQuestTextFont")
        font:SetFont(GameFontNormal:GetFont(), 14, "")
        font:SetShadowColor(0, 0, 0)
        font:SetShadowOffset(1, -1)
        font:SetJustifyH("LEFT")
        font:SetJustifyV("TOP")
    end

    -- Crear el frame principal
    self.frame = CreateFrame("Frame", "VoiceOverQuestTextFrame", UIParent, "BackdropTemplate")
    self.frame:SetSize(FRAME_WIDTH, FRAME_HEIGHT)
    self.frame:SetPoint("CENTER", 0, 0)
    self.frame:SetFrameStrata("HIGH")
    self.frame:SetMovable(true)
    self.frame:SetClampedToScreen(true)
    self.frame:SetUserPlaced(true)
    
    -- Configurar el fondo semitransparente (solo desvanecido oscuro)
    self.frame:SetBackdrop({
        bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
        tile = true,
        tileSize = 32,
        insets = { left = 5, right = 5, top = 5, bottom = 5 }
    })
    self.frame:SetBackdropColor(0, 0, 0, 0.7) -- Negro semitransparente
    
    -- Crear el texto de la misión directamente en el frame
    self.frame.text = self.frame:CreateFontString(nil, "ARTWORK", "VoiceOverQuestTextFont")
    self.frame.text:SetPoint("TOPLEFT", self.frame, "TOPLEFT", FRAME_PADDING, -FRAME_PADDING)
    self.frame.text:SetPoint("BOTTOMRIGHT", self.frame, "BOTTOMRIGHT", -FRAME_PADDING, FRAME_PADDING)
    self.frame.text:SetJustifyH("LEFT")
    self.frame.text:SetJustifyV("TOP")
    self.frame.text:SetTextColor(1, 1, 1) -- Color blanco
    self.frame.text:SetText("")
    
    -- Crear el botón para mover el frame (todo el frame es movible)
    self.frame:EnableMouse(true)
    self.frame:RegisterForDrag("LeftButton")
    self.frame:SetScript("OnDragStart", function() self.frame:StartMoving() end)
    self.frame:SetScript("OnDragStop", function() self.frame:StopMovingOrSizing() end)
    
    -- Ocultar el frame inicialmente
    self.frame:Hide()
    
    -- Hook para mostrar el texto cuando se reproduce audio de una misión
    if SoundQueue and SoundQueue.AddSoundToQueue then
        hooksecurefunc(SoundQueue, "AddSoundToQueue", function(self, soundData)
            if soundData and soundData.questID and Enums.SoundEvent:IsQuestEvent(soundData.event) then
                DebugPrint("SoundQueue:AddSoundToQueue hook - Mostrando texto para questID: " .. soundData.questID)
                QuestTextOverlay:ShowQuestText(soundData)
            end
        end)
    end
    
    -- Hook para ocultar el texto cuando se detiene el audio
    if SoundQueue and SoundQueue.RemoveSoundFromQueue then
        hooksecurefunc(SoundQueue, "RemoveSoundFromQueue", function(self, soundData)
            if soundData and soundData.questID and Enums.SoundEvent:IsQuestEvent(soundData.event) then
                -- Solo ocultar si era el sonido actual
                local currentSound = SoundQueue:GetCurrentSound()
                if not currentSound or currentSound.questID ~= soundData.questID then
                    DebugPrint("SoundQueue:RemoveSoundFromQueue hook - Ocultando texto")
                    QuestTextOverlay:HideQuestText()
                end
            end
        end)
    end
    
    DebugPrint("QuestTextOverlay inicializado")
end

-- Función para mostrar el texto de la misión
function QuestTextOverlay:ShowQuestText(soundData)
    if not soundData or not soundData.questID then
        DebugPrint("No hay datos de sonido o questID")
        return
    end
    
    local questID = soundData.questID
    local event = soundData.event
    
    DebugPrint("ShowQuestText para questID: " .. questID .. ", evento: " .. tostring(event))
    
    -- Obtener el texto de la misión según el tipo de evento
    local questText = ""
    
    if event == Enums.SoundEvent.QuestAccept then
        -- Para misiones de aceptación
        if QuestFrameDetailPanel and QuestFrameDetailPanel:IsVisible() then
            questText = GetQuestText() or ""
            DebugPrint("Texto obtenido de GetQuestText: " .. (questText ~= "" and "SI" or "NO"))
        end
    elseif event == Enums.SoundEvent.QuestProgress then
        -- Para misiones en progreso
        if QuestFrameProgressPanel and QuestFrameProgressPanel:IsVisible() then
            questText = GetProgressText() or ""
            DebugPrint("Texto obtenido de GetProgressText: " .. (questText ~= "" and "SI" or "NO"))
        end
    elseif event == Enums.SoundEvent.QuestComplete then
        -- Para misiones completadas
        if QuestFrameRewardPanel and QuestFrameRewardPanel:IsVisible() then
            questText = GetRewardText() or ""
            DebugPrint("Texto obtenido de GetRewardText: " .. (questText ~= "" and "SI" or "NO"))
        end
    end
    
    -- Si no pudimos obtener el texto de los paneles visibles, intentamos obtenerlo del registro de misiones
    if questText == "" and C_QuestLog and C_QuestLog.GetQuestLogQuestText then
        local questLogIndex = C_QuestLog.GetLogIndexForQuestID(questID)
        if questLogIndex then
            local questDescription = select(2, C_QuestLog.GetQuestLogQuestText(questLogIndex))
            if questDescription then
                questText = questDescription
                DebugPrint("Texto obtenido de C_QuestLog.GetQuestLogQuestText: SI")
            end
        end
    end
    
    -- Si aún no tenemos texto, no mostramos nada
    if questText == "" then
        DebugPrint("No se pudo obtener texto para questID: " .. questID)
        return
    end
    
    -- Actualizar el texto
    self.frame.text:SetText(questText)
    
    -- Ajustar el tamaño del frame para mostrar todo el texto
    local textHeight = self.frame.text:GetStringHeight() + (FRAME_PADDING * 2)
    self.frame:SetHeight(math.max(FRAME_HEIGHT, textHeight))
    
    -- Mostrar el frame
    self.frame:Show()
    
    DebugPrint("Frame mostrado con texto para questID: " .. questID)
end

-- Función para ocultar el texto de la misión
function QuestTextOverlay:HideQuestText()
    self.frame:Hide()
    DebugPrint("Frame ocultado")
end

-- Registrar el módulo para inicialización con el addon principal
if Addon and Addon.RegisterModule then
    Addon:RegisterModule("QuestTextOverlay", QuestTextOverlay)
else
    -- Si no podemos registrar con el addon principal, inicializamos directamente
    QuestTextOverlay:Initialize()
end
