-- Asegurarse de que VoiceOver y SoundQueue están correctamente definidos
VoiceOver = VoiceOver or {}
setfenv(1, VoiceOver)
SoundQueue = SoundQueue or {}

-- Crear la tabla SoundControlUI para almacenar nuestras funciones
local SoundControlUI = {}

-- Variables para almacenar los volúmenes originales
SoundControlUI.originalSFXVolume = nil
SoundControlUI.originalMusicVolume = nil
SoundControlUI.originalAmbienceVolume = nil
SoundControlUI.isVolumeLowered = false
SoundControlUI.volumeRestored = false
SoundControlUI.isInteractingWithNPC = false -- Nueva variable para rastrear si estamos interactuando con un NPC

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

-- Función para bajar los volúmenes al 50% (excepto el canal maestro)
function SoundControlUI:LowerVolumes()
    if not Addon.db.profile.EnableSoundControl then return end
    if self.isInteractingWithNPC then
        DebugPrint("Interacción con NPC detectada, no se bajan los volúmenes.")
        return
    end

    DebugPrint("Entrando en LowerVolumes.")
    if not self.isVolumeLowered then
        self.originalSFXVolume = GetCVar("Sound_SFXVolume")
        self.originalMusicVolume = GetCVar("Sound_MusicVolume")
        self.originalAmbienceVolume = GetCVar("Sound_AmbienceVolume")

        -- Ajustar los volúmenes al 50%, dejando el canal maestro intacto
        SetCVar("Sound_SFXVolume", self.originalSFXVolume * 0.5)
        SetCVar("Sound_MusicVolume", self.originalMusicVolume * 0.5)
        SetCVar("Sound_AmbienceVolume", self.originalAmbienceVolume * 0.5)

        DebugPrint("Volumen de SFX, música y ambiente reducido al 50%.")
        self.isVolumeLowered = true
        self.volumeRestored = false

        -- Configurar un temporizador de respaldo para restaurar volúmenes
        C_Timer.After(5, function()
            if not self.volumeRestored and SoundQueue:IsEmpty() then
                DebugPrint("Temporizador de 5 segundos completado y SoundQueue está vacía. Restaurando volúmenes.")
                self:RestoreVolumes()
            end
        end)
    else
        DebugPrint("El volumen ya está reducido.")
    end
end

-- Función para restaurar los volúmenes originales con espera de 2 segundos
function SoundControlUI:RestoreVolumes()
    if not Addon.db.profile.EnableSoundControl then return end
    DebugPrint("Entrando en RestoreVolumes.")
    if self.isVolumeLowered and not self.volumeRestored then
        -- Esperar 2 segundos antes de restaurar el volumen
        C_Timer.After(2, function()
            -- Verificar nuevamente si la cola está vacía antes de restaurar
            if SoundQueue:IsEmpty() then
                SetCVar("Sound_SFXVolume", self.originalSFXVolume)
                SetCVar("Sound_MusicVolume", self.originalMusicVolume)
                SetCVar("Sound_AmbienceVolume", self.originalAmbienceVolume)

                DebugPrint("Volumen de SFX, música y ambiente restaurado a 100%.")
                self.isVolumeLowered = false
                self.volumeRestored = true
            else
                DebugPrint("SoundQueue no está vacía, se pospone la restauración de volúmenes.")
            end
        end)
    else
        DebugPrint("El volumen ya está en su nivel original o no es necesario restaurar.")
    end
end

-- Función para verificar el estado de la cola y actuar en consecuencia
function SoundControlUI:CheckSoundQueueStatus()
    if not Addon.db.profile.EnableSoundControl then return end
    if SoundQueue:IsEmpty() then
        DebugPrint("SoundQueue está vacía. Restaurando volúmenes.")
        self:RestoreVolumes()
    else
        DebugPrint("SoundQueue no está vacía. Manteniendo volúmenes reducidos.")
    end
end

-- Hook en los eventos de SoundQueue para controlar el volumen
local function InitializeSoundControl()
    DebugPrint("Inicializando SoundControlUI.")
    if SoundQueue then
        -- Hook para cuando un sonido comienza
        hooksecurefunc(SoundQueue, "AddSoundToQueue", function(soundData)
            if not Addon.db.profile.EnableSoundControl then return end
            -- Comprobar si la cola no está vacía antes de bajar los volúmenes
            if not SoundControlUI.isInteractingWithNPC and not SoundQueue:IsEmpty() then
                DebugPrint("Hook en AddSoundToQueue. Bajando volúmenes.")
                SoundControlUI:LowerVolumes()
            else
                DebugPrint("SoundQueue está vacía o estamos interactuando con un NPC. No se reducen los volúmenes.")
            end

            -- Verificar el estado de SoundQueue y restaurar volúmenes si está vacío
            soundData.stopCallback = function()
                if not Addon.db.profile.EnableSoundControl then return end
                DebugPrint("stopCallback: Reproducción de sonido finalizada en SoundQueue.")
                SoundControlUI:CheckSoundQueueStatus()
            end
        end)

        -- Mensaje al cargar
        DebugPrint("SoundControlUI ha sido inicializado correctamente.")
    else
        DebugPrint("Error: SoundQueue no se encontró.")
    end
end

-- Hook para detectar cuando se llama a StopSound en Utils y restaurar volúmenes
if Utils and Utils.StopSound then
    hooksecurefunc(Utils, "StopSound", function(soundData)
        if not Addon.db.profile.EnableSoundControl then return end
        DebugPrint("Utils:StopSound detectado para: " .. (soundData and soundData.fileName or "desconocido"))
        SoundControlUI:RestoreVolumes()
    end)
end

-- Función para manejar la interacción con un NPC
local function OnGossipEvent(self, event)
    if not Addon.db.profile.EnableSoundControl then return end
    if event == "GOSSIP_SHOW" or event == "QUEST_GREETING" then
        SoundControlUI.isInteractingWithNPC = true
        DebugPrint("Interacción con NPC detectada.")
    elseif event == "GOSSIP_CLOSED" or event == "QUEST_FINISHED" then
        SoundControlUI.isInteractingWithNPC = false
        DebugPrint("Interacción con NPC finalizada.")
    end
end

-- Inicializar el control de sonido y manejo de interacción con NPC cuando se carga la UI
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_LOGIN")
frame:RegisterEvent("GOSSIP_SHOW")
frame:RegisterEvent("QUEST_GREETING")
frame:RegisterEvent("GOSSIP_CLOSED")
frame:RegisterEvent("QUEST_FINISHED")
frame:SetScript("OnEvent", function(self, event, ...)
    if not Addon.db.profile.EnableSoundControl then return end
    if event == "PLAYER_LOGIN" then
        InitializeSoundControl()
    else
        OnGossipEvent(self, event)
    end
end)

return SoundControlUI
