-- Nombre del archivo: QuestFrameAudioButton.lua

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

-- Importar el módulo de depuración principal
local Debug = VoiceOver.Debug

-- Función para imprimir mensajes de depuración
local function DebugPrint(message)
    Debug:Print(message, "QuestFrameAudioButton")
end

-- Función para obtener el questID actual
local function GetCurrentQuestID()
    return QuestFrame.questID or GetQuestID()
end

-- Función para determinar el evento actual
local function GetCurrentEvent()
    if QuestFrameDetailPanel:IsShown() then
        return Enums.SoundEvent.QuestAccept
    elseif QuestFrameProgressPanel:IsShown() then
        return Enums.SoundEvent.QuestProgress
    elseif QuestFrameRewardPanel:IsShown() then
        return Enums.SoundEvent.QuestComplete
    end
    return nil
end

-- Función para crear el botón de reproducción
local function CreatePlayButton()
    if not QuestFrame then
        DebugPrint("QuestFrame not found!")
        return
    end

    local playButton = CreateFrame("Button", "VoiceOverQuestFramePlayButton", QuestFrame, "UIPanelButtonTemplate")
    playButton:SetSize(180, 25)
    playButton:SetPoint("BOTTOMRIGHT", QuestFrame, "BOTTOMRIGHT", -150, -30)
    playButton:SetText("Play Quest VoiceOver")

    -- Create and set up the icon
    local icon = playButton:CreateTexture(nil, "ARTWORK")
    icon:SetSize(16, 16)
    icon:SetPoint("LEFT", 5, 0)
    icon:SetTexture("Interface\\Common\\VoiceChat-Speaker")

    -- Adjust text position to make room for the icon
    playButton:GetFontString():ClearAllPoints()
    playButton:GetFontString():SetPoint("LEFT", icon, "RIGHT", 2, 0)

    playButton:SetScript("OnEnter", function(self)
        GameTooltip:SetOwner(self, "ANCHOR_RIGHT")
        GameTooltip:SetText("Play Quest Audio")
        GameTooltip:Show()
    end)

    playButton:SetScript("OnLeave", function(self)
        GameTooltip:Hide()
    end)

    playButton:SetScript("OnClick", function(self)
        local questID = GetCurrentQuestID()
        local currentEvent = GetCurrentEvent()
        DebugPrint(string.format("Botón de reproducción clickeado para questID %s, evento %s", questID,
            tostring(currentEvent)))

        if not self.soundData then
            -- Obtenemos el tipo y el ID del NPC que inicia la misión
            local type, id = DataModules:GetQuestLogQuestGiverTypeAndID(questID)
            local npcName = id and DataModules:GetObjectName(type, id) or "Unknown Name"

            self.soundData = {
                event = currentEvent,
                questID = questID,
                name = npcName,
                title = C_QuestLog.GetTitleForQuestID(questID),
                unitGUID = id and Enums.GUID:CanHaveID(type) and Utils:MakeGUID(type, id) or nil
            }
        end

        local isPlaying = SoundQueue:Contains(self.soundData)

        if not isPlaying then
            SoundQueue:AddSoundToQueue(self.soundData)
            self:SetText("Stop Quest VoiceOver")

            self.soundData.stopCallback = function()
                self:SetText("Play Quest VoiceOver")
                self.soundData = nil
            end
        else
            SoundQueue:RemoveSoundFromQueue(self.soundData)
            self:SetText("Play Quest VoiceOver")
        end
    end)

    DebugPrint("Botón de reproducción creado")
    return playButton
end

-- Función para actualizar el botón
local function UpdateButton()
    if not QuestFrameAudioButton.playButton then
        DebugPrint("playButton no existe")
        return
    end

    local button = QuestFrameAudioButton.playButton
    local questID = GetCurrentQuestID()
    local currentEvent = GetCurrentEvent()

    if questID and currentEvent and Addon.db.profile.ShowQuestFrameButton then
        -- Verificar si hay sonido disponible para la misión
        local hasSound = DataModules:PrepareSound({ event = currentEvent, questID = questID })

        if hasSound then
            button:Enable()
            button:SetText("Play Quest VoiceOver")
        else
            button:Disable()
            button:SetText("No Audio Found")
        end
        button:Show()
    else
        button:Hide()
    end

    DebugPrint(string.format("Estado final del botón: %s", button:IsShown() and "Visible" or "Oculto"))
end

-- Función para inicializar el módulo
function QuestFrameAudioButton:Initialize()
    if not Addon.db.profile.ShowQuestFrameButton then
        DebugPrint("ShowQuestFrameButton está desactivado, no se inicializa el botón")
        return
    end

    DebugPrint("Inicializando QuestFrameAudioButton")

    -- Crear el botón cuando se cargue el addon
    self.playButton = CreatePlayButton()

    -- Hook para cuando se muestran los detalles de la misión
    hooksecurefunc("QuestFrameDetailPanel_OnShow", UpdateButton)

    -- Hook para cuando se muestra el progreso de la misión
    hooksecurefunc("QuestFrameProgressPanel_OnShow", UpdateButton)

    -- Hook para cuando se muestra el panel de recompensa de la misión
    hooksecurefunc("QuestFrameRewardPanel_OnShow", UpdateButton)

    -- **Añadido**: Hook para el evento OnShow del QuestFrame para actualizar el botón automáticamente 2 segundos después
    QuestFrame:HookScript("OnShow", function()
        DebugPrint("QuestFrame OnShow evento capturado, iniciando actualización del botón después de 2 segundos")
        C_Timer.After(1, UpdateButton)
    end)

    DebugPrint("QuestFrameAudioButton inicializado")
end

-- Función para actualizar la visibilidad de todos los botones
function QuestFrameAudioButton:UpdateButtonVisibility()
    if not self.playButton then
        DebugPrint("playButton no existe, no se puede actualizar la visibilidad")
        return
    end

    if Addon.db.profile.ShowQuestFrameButton then
        UpdateButton()
    else
        self.playButton:Hide()
    end

    DebugPrint("Visibilidad del botón actualizada")
end
