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

-- Variables para el estado del módulo
local isGameObjectReaderActive = false
local isGameObjectReaderDebugEnabled = false

-- Función para imprimir mensajes de depuración en el chat
local function GameObjectReaderDebugPrint(message)
    if isGameObjectReaderDebugEnabled then
        print("|cFF00FF00[Game Object Reader Debug]|r", message)
    end
end

local RED = "|cFFFF0000"   -- Rojo
local GREEN = "|cFF00FF00" -- Verde
local RESET = "|r"         -- Resetea al color original

GameObjectReaderDebugPrint("GameObjectSoundPlayer module loaded")

-- Tabla para mapear identificadores únicos a sonidos
local soundMapping = {
    ["Llaves de Thrayir:Cuando Cyrce ordenó la retirada, me pidió que me llevara a Thrayir. Su furia era incontenible y sus heridas, terribles, pero Cyrce no tenía nada que temer. Yo jamás la hubiera decepcionado.  La ira de Thrayir contra nuestros enemigos había desatado una tormenta tal que no habíamos visto desde nuestros días en el norte.   Ver a tantos tormenvyn caer debe haber provocado una cólera tan intensa en el galeorn que comenzó a perder su forma. Tenía que estabilizar sus heridas.  Mientras Jardfyr se ocupaba de las defensas de las bóvedas y tallaba nuevos guardianes, acudí a Ksvir, el Atronador. Su poder solo estaba por debajo del de Cyrce y era capaz de blandir la bendición de tormentas, un don que supuestamente le había concedido el propio Thorim.   Pese a la angustia, su juramento obligaba a Ksvir a obedecer la orden de retirada de Cyrce, y me otorgó su don. Para estabilizar las heridas de Thrayir, forjamos cinco llaves rúnicas para controlar la tempestad que rugía en las alturas.Cinco llaves de aguas turbulentas, lluvias torrenciales, relámpagos atronadores, vientos ciclónicos y remolinos inclementes.   Ksvir se ocuparía de guardar una llave rúnica, y las otras cinco fueron repartidas.   Con cinco sellos, contuvimos la forma torturada de Thrayir en estasis. La furia de la tempestad curaría sus heridas poco a poco, y solo alguien que tuviera las cinco llaves sería capaz de liberarlo.  Que sus heridas sanen, y que sus gritos de pena se esfumen en el viento."] = { fileName = "db9aacac", duration = 122.21, creatureID = 15608 },
    ["Furia de Thrayir:Pocos enemigos del clan tormenvyn vivirían para contar historias de Cyrce y Thrayir.    Incluso entre los Inbjerskorn más feroces, los dos inspiraban miedo y admiración.   Cuando Cyrce guio a nuestro clan al sur para que los tormenvyn se establecieran en la Cuna de Hymosul, Thrayir fue sus ojos y oídos.   El galeorn era leal a Cyrce y a su clan, así como nuestro vínculo con ella se extendía a Thrayir.   Pero con la lealtad, también llegó al furia del galeorn.   Cuando el mundo tembló y la oscuridad brotó de lo profundo, Thrayir alzó vuelo.  El dolor y la furia del galeorn aumentaban con cada tormenvyn que caía.   Las explosiones de su furia y las escamas quemadas partieron los cielos en dos.   Herido, lo invadió la ira, y la chispa del galeorn se debilitó.   - Tallado por Valwen, pupila aprendiza del Tallapiedras."] = { fileName = "67c54371", duration = 66.31, creatureID = 15608 },
    ["Cyrce y el Galeorn:<La imagen muestra a una gran criatura alada posada en una cima montañosa y tormentosa.>   Durante mucho tiempo, nuestro clan había observado al noble galeorn, nacido en las nubes de Tormenpyk.   Como los lobos tormentosos de Thorim, pocos habían dominado los medios para domar a estas feroces criaturas elementales.   Pero, pese a que muchos tormenvyn fracasaron o cayeron ante su naturaleza tempestuosa, hubo una que triunfó: Cyrce.   Nadie sabe cómo lo logró, pero cuando Cyrce bajó de las laderas más altas de Tormenpyk con un galeorn posado en el brazo, el clan lo consideró un presagio.   Salve, Cyrce, elegida de Tormenpyk, y amiga de Thrayir, el galeorn.  - Tallado por Valwen, pupila aprendiza del Tallapiedras."] = { fileName = "643fc418", duration = 58.75, creatureID = 15608 },
    ["Tablilla antigua destellante:<Esta tablilla ilustra una gran batalla entre figuras humanoides metálicas y criaturas serpentinas que salen del mar.   Aunque las figuras metálicas se ven superadas en número, parece que unos humanoides alados y unos guardianes de piedra luchan a su lado.   La más grande de las figuras metálicas hace un gesto con un dedo con un detalle dorado, mientras una criatura alada se eleva sobre ella.>   Su cabeza impactó en la arena y la sangre negra regó el suelo. La espada de Cyrce brillaba intensamente.   Desde las profundidades más oscuras, una presencia retumbó. Pese a la pena y el dolor, Cyrce clamó:   ¡Escúchanos, oh, Corazón! En esta tierra, los tormenvyn combatimos una marea de desesperanza.   ¡Guíanos con tu canción, tu corazón, y compártenos tu dolor!    Con esta súplica, por mar y cielo, apareció una marea de escamas jamás vista.  Con la muerte de las serpientes y la derrota de los horrores, la piel de hierro se volvió resbaladiza por la sangre.   Los cielos rugientes se partieron, la furia de Thrayir rajó un sinfín de escamas.   Con grandes manos, desde la tierra, se alzaron guardianes de piedra que embistieron contra la marea.   Con alas doradas, desde lo alto, su súplica encontró respuesta; un regalo de los cielos trajeron.   Sin embargo, la marea no se detenía. Con las filas diezmadas, una última canción resonó.   Mientras Cyrce combatía y Thrayir chillaba, sus compañeros de clan caían ante las escamas.   Los guardias de piedra se rajaron, como escombros partidos, y fueron arrastrados a las profundidades del agua.   Cayeron de los cielos; los seres dorados gritaron, con alas y lanzas partidas.   Llena de pena, Cyrce dirigió su mirada a los suyos y ordenó: ¡Retírense, a la Bóveda! Protejan nuestro Corazón.   Mientras los sobrevivientes obedecían, Cyrce se plantó firme en la costa y enfrentó sola la oscuridad."] = { fileName = "5e06d23c", duration = 153.34, creatureID = 15608 },
    ["Tablilla antigua destellante:<Uno de los relieves muestra una figura metálica y barbuda con una tablilla de piedra y un cincel.    Bajo los pies, una imagen de una recámara con una faceta de cristal. Por encima, se yergue una estructura imponente.   Este monolito no está tallado por la misma mano que los otros.>   Noble Jardfyr, con lealtad y sabiduría grabadas a fuego en la piel de hierro.   Primer tallapiedras de los tormenvyn, consejero de Cyrce y protector de Hymosul.   Con piedra se levantó nuestro templo; sus guardianes cobraron vida con runas de antaño.   Con templanza y afecto, nuestro vínculo con Hymosul creció y Jardfyr oyó su propósito con claridad.   De la mano de él y el canto de ella, los tormenvyn encontraron su propósito.  Pocos por fuera de los tormenvyn conocen la labor de la vinculación rúnica, el arte de tallar piedra.   Infundir las tormentas del norte en las piedras de la tierra era un arte que pocos dominaban.   Impulsados por runas y voluntad, sus guardianes de piedra se dispusieron a montar guardia en el interior.   Aunque pocos aprendieron sus secretos, muchos se enfrentarían a sus creaciones.   Gracias a la canción de Hymosul, los diseños de Jardfyr llegarían a nuevas alturas.   - Tallado por Valwen, pupila aprendiza del Tallapiedras."] = { fileName = "4c06c703", duration = 97.99, creatureID = 15608 },
    ["Tablilla antigua destellante:<El monolito muestra una torre de piedra imponente que choca contra una ola gigantesca. A la sombra de la ola, apenas se vislumbra una figura.   Debajo de la torre, en una recámara subterránea, unas figuras humanoides se refugian frente a una faceta de oro resplandeciente.>   Durante generaciones, nuestro propósito siguió vigente y el Corazón luminoso en paz.   Cuando las tierras temblaron, un destello verde nocivo atravesó los cielos.    Nuestro bastión se rajó, las torres cayeron y unas aguas negras nos rodearon.   En la Bóveda subterránea, los tormenvyn rezamos, con la mano de Cyrce sobre su Corazón.   Pero cuando los temblores se intensificaron, sus gritos retumbaron y el bramido de Hymosul se renovó.   Cuando cayó el silencio, el dolor de los gritos aún se dejaba ver, con nuestras puertas rúnicas de piedra abiertas.   Cuando Cyrce salió, vio el bastión en ruinas, rodeado de aguas nuevas.   En nuestras costas, algo oscuro se hizo presente y habló palabras en nuestras mentes:   El ser de las profundidades se estremece; este lugar lo llama y se acerca la hora de que reclame su derecho   Arrodíllense ante los dones del antiguo, y su poder se unirá."] = { fileName = "9ea74369", duration = 78.53, creatureID = 15608 },
    ["Tablilla antigua destellante:<El relieve muestra una recámara grande donde se reúnen unas figuras humanoides. La más alta tiene el puño en alto, con un fragmento de oro brillando en el dedo.  En el centro de la caverna sobresale del suelo una faceta cristalina gigante.>    La caverna creció, por obra de manos y herramientas; una cuna para el reposo del Corazón hecha con piedras; al santuario se dirigieron los tormenvyn.   La voz de Hymosul, antes feroz, se había calmado.   Aunque Cyrce le habló al Corazón, su voz era débil, un susurro apenas audible.   Y así, con manos de hierro, tallé y forjé.   Una sortija nacida de minerales radiantes, a la medida para la mano de Cyrce. Un anillo adornado con fragmentos más pequeños del Corazón.   Los restos, suavizados y tallados, con runas de tormenta, citrinos encendidos; sus facetas resplandecientes con un canto suave.   A través del aro, juntos, Cyrce e Hymosul cantaron."] = { fileName = "470b6d09", duration = 63.55, creatureID = 15608 },
    ["Tablilla antigua destellante:<La tablilla antigua consiste en una sola losa de piedra con fragmentos cristalinos incrustados, decorada con imágenes y caracteres rúnicos delicadamente tallados.   Uno de los relieves muestra una figura estoica con piel de metal que tiene sobre uno de sus hombros una majestuosa criatura alada con ojos de brillantes cristales de cabujón.    Ambas miran fijamente a una faceta cristalina gigante.>   Después de hacer a un lado las herramientas maltrechas, encontramos algo bajo el suelo. Meses de escucha y búsqueda.   Un cristal dorado, protegido con piedra, su brillo era una antorcha en la oscuridad.    La mano de Cyrce presionó la faceta. ¡Un sonido, un grito!   Pero no era un grito de dolor ni un pedido de ayuda, sino una expresión de calma y alivio. Hymosul, el Corazón luminoso.   La radiancia y la faceta parecían talladas por manos invisibles.   He tallado muchas piedras. Mis manos de hierro, mis herramientas, pero el esplendor de Hymosul me ha abierto los ojos.   Nuevos diseños, patrones y estructuras. Mi mente está... lúcida."] = { fileName = "fdc85563", duration = 83.33, creatureID = 15608 },
    ["Tablilla antigua destellante:<Uno de los relieves muestra una figura imponente con piel de metal. En el guantelete de la mano que tiene alzada se ve un gran anillo.>   Con el silencio de nuestro Señor del Trueno, la poderosa Cyrce guio a su clan desde Tormenpyk y se alejó de la insaciable sed de guerra de Inbjerskorn.   En nuestra huida, mientras los vientos fríos del norte nos golpeaban las férreas espaldas, nos cuestionamos el propósito de nuestro clan. ¿A quién juramos proteger?   Sin los Guardianes, ¿a quién servimos?   Nuestras plegarias recibieron respuesta años después de nuestro éxodo.   Desde el interior de la tierra, escuchamos su grito, una plegaria de ayuda, un llamado cargado de angustia.   A oídos de Cyrce, el llamado fue nuestro destino, y así fue que nos llevó hacia la voz."] = { fileName = "fa30b7ae", duration = 62.45, creatureID = 15608 },
    ["[Object: Sinopsis de Eruditos del mar: Isla de las sirenas]  <La tapa interior del libro de contabilidad tiene un mapa dibujado con delicadeza y adornado con imágenes náuticas. Alrededor del mapa hay una representación de una figura femenina con la cola envuelta en una banda ornamentada.>   Desde la época de la Primera Marea, los maresabios hemos registrado las numerosas islas que hay en el mar abierto.   Entre ellas se encuentra la Isla de las Sirenas.   La forma en que encontramos por primera vez la isla es un tema de debate entre nuestros eruditos.   Algunos registros afirman que los primeros maresabios la descubrieron por casualidad durante nuestros primeros viajes por el mar.   Otros afirman que fueron las leyendas de una isla con un llamado inquietante transmitidas por nuestros antepasados las que motivaron a nuestros maresabios a buscarla.   Sea cual sea la verdad, una densa niebla de misterio se ha rodeado a ese temido lugar durante mucho tiempo."] = { fileName = "0dc41f48", duration = 64.34, creatureID = 15608 },
    ["Piedra erguida:<Esta piedra erguida representa el tallado de una figura con muchas gemas detrás. Los brazos de la figura, inusualmente largos, intentan conseguir más gemas.>"] = { fileName = "9b62bb61", duration = 9.87, creatureID = 15608 },
    ["Piedra erguida:<Esta piedra erguida representa el tallado de una figura con ojos grandes que mira a una gran criatura de roca. La criatura tiene gemas incrustadas en su interior y a su alrededor.>"] = { fileName = "6c0e2e0b", duration = 11.73, creatureID = 15608 },
    ["Piedra erguida:<Esta piedra erguida representa el tallado de una figura rodeada de espejos. La persona está adornada con muchas gemas, más de las que puede llevar, más de las que jamás necesitará. Si bien en los reflejos se ve una sonrisa, la persona está frunciendo el ceño.>"] = { fileName = "226eb1bf", duration = 15.33, creatureID = 15608 },
    ["Piedra erguida:<Esta piedra erguida representa el tallado de una figura erguida y orgullosa, que señala hacia una montaña. Muchos se arrodillan bajo el amparo de su sombra.>"] = { fileName = "8c11584b", duration = 10.37, creatureID = 15608 },

    -- Añadir más mapeos aquí según sea necesario
}

-- Tabla para mapear títulos a sonidos legacy
local soundMapping_legacy = {
    ["Piedras de los bosques, parte 1"] = { fileName = "Piedras_de_los_bosques,_parte_1-nota", duration = 6.19, creatureID = 15608 },
    ["Consola titánica"] = { fileName = "Consola_titánica-nota", duration = 18.39, creatureID = 15608 },
    ["Cuernos de las colinas"] = { fileName = "Cuernos_de_las_colinas-nota", duration = 6.19, creatureID = 15608 },
    ["Placa de epitafio de Alto en Pena"] = { fileName = "Placa_de_epitafio_de_Alto_en_Pena-nota", duration = 19.62, creatureID = 15608 },
    ["Epitafio de Alto en Pena"] = { fileName = "Epitafio_de_Alto_en_Pena-nota", duration = 36.08, creatureID = 209208 },
    ["Chatarra de seda dorada"] = { fileName = "Chatarra_de_seda_dorada-nota", duration = 18.60, creatureID = 209208 },
    ["Chatarra de seda violeta"] = { fileName = "Chatarra_de_seda_violeta-nota", duration = 24.01, creatureID = 209208 },
    ["Chatarra de seda carmesí"] = { fileName = "Chatarra_de_seda_carmesí-nota", duration = 18.26, creatureID = 209208 },
    ["Plataforma funeraria"] = { fileName = "Plataforma_funeraria-nota", duration = 10.45, creatureID = 209208 },
    ["Diario de Tefferty"] = { fileName = "Diario_de_Tefferty-nota", duration = 32.89, creatureID = 209208 },
    ["Investigación quemada"] = { fileName = "Investigación_quemada-nota", duration = 7.47, creatureID = 209208 },
    ["Equipo machacado"] = { fileName = "Equipo_machacado-nota", duration = 18.81, creatureID = 209208 },
    ["Libro de grado chispa de luz"] = { fileName = "Libro_de_grado_chispa_de_luz-nota", duration = 23.49, creatureID = 209208 },
    ["Contusión sísmica"] = { fileName = "Contusión_sísmica-nota", duration = 6.50, creatureID = 209208 },
    ["Diario de la Orden de la Noche"] = { fileName = "Diario_de_la_Orden_de_la_Noche-nota", duration = 33.50, creatureID = 16128 },
    ["Afiche de la Orden de la Noche"] = { fileName = "Afiche_de_la_Orden_de_la_Noche-nota", duration = 29.78, creatureID = 16128 },
    ["Arma de asta de la Orden de la Noche"] = { fileName = "Arma_de_asta_de_la_Orden_de_la_Noche-nota", duration = 12.00, creatureID = 16128 },
    -- Añadir más títulos y archivos de sonido aquí
}

-- Tabla para mapear IDs de objetos a sonidos
local soundMappingByID = {
    [455115] = {
        fileName = "d783e257",
        duration = 15.73,
        creatureID = 15608,
        description = [[Expositor de armas olvidado:
            <El alijo de armas y otros suministros están cubiertos de telarañas gruesas y capas de polvo.
            Hay huecos en los que faltan varias armas que posiblemente hayan sido tomadas para ser usadas.
            A pesar de ello, parece que nadie ha estado aquí en mucho tiempo.>]]
    },
    [455666] = {
        fileName = "4e754583",
        duration = 36.60,
        creatureID = 15608,
        description =
        [[Documentos de investigación:<Descubres lo que parecen las notas del investigador.>  Asunto: Zekvir   Creí que era un fracaso, como los demás. Sin embargo, Zekvir logró sobrevivir al proceso y mantener su cordura.  Fue una decepción verlo partir, pero parece que cierto patrocinador poderoso lo convocó personalmente. Las indagaciones solo revelaron un objetivo a eliminar: los recuerdos de algo conocido como... ¿el alma del mundo?  Hay que seguir adelante para ver si se puede crear otro Zekvir. ¿Fue una casualidad? ¿Fuerza de voluntad? El tiempo lo dirá.]]
    },
    -- Añadir más mapeos de IDs aquí según sea necesario
}

-- Tabla para rastrear los objetos ya reproducidos
local playedObjects = {}

local frame = CreateFrame("Frame")
frame:RegisterEvent("ITEM_TEXT_READY")
frame:RegisterEvent("GOSSIP_SHOW") -- Registrar el evento GOSSIP_SHOW para capturar el ID del objeto/NPC

-- Función para manejar los eventos de GOSSIP_SHOW
local function HandleGossipShowEvent()
    local guid = UnitGUID("npc") -- Obtener el GUID del NPC u objeto
    if guid then
        local type, _, _, _, _, npcID = strsplit("-", guid)
        npcID = tonumber(npcID)

        GameObjectReaderDebugPrint("Detected NPC/Object with ID: " .. tostring(npcID))

        -- Verificar si el mapeo de sonido se encuentra en soundMappingByID
        local soundInfo = soundMappingByID[npcID]
        if not soundInfo then
            GameObjectReaderDebugPrint("No sound mapping found for object ID: " .. tostring(npcID))
        else
            -- Si se encuentra el mapeo de sonido, ejecutar el sonido
            if not playedObjects[npcID] then
                TryQueueObjectSound(soundInfo.fileName, soundInfo.description, soundInfo.duration, soundInfo.creatureID)
                playedObjects[npcID] = true
            else
                GameObjectReaderDebugPrint("GameObject/NPC [" .. tostring(npcID) .. "] sound has already been played")
            end
        end
    end
end

-- Funciones de utilidad para palabras clave
local commonWords = {
    ["para"] = true,
    ["esta"] = true,
    ["este"] = true,
    ["estos"] = true,
    ["estas"] = true,
    ["con"] = true,
    ["los"] = true,
    ["las"] = true,
    ["del"] = true,
    ["que"] = true,
    ["una"] = true,
    ["uno"] = true,
    ["por"] = true,
    ["como"] = true,
    ["pero"] = true,
    ["sin"] = true
}

local function extractKeywords(text)
    local keywords = {}
    text = string.lower(text):gsub("[^%w%s]", "")
    for word in text:gmatch("%S+") do
        if #word > 3 and not commonWords[word] then
            keywords[word] = true
        end
    end
    return keywords
end

local function calculateSimilarity(keywords1, keywords2)
    local matches = 0
    local total = 0
    for word in pairs(keywords1) do
        if keywords2[word] then
            matches = matches + 1
        end
        total = total + 1
    end
    return matches / total
end

frame:SetScript("OnEvent", function(self, event, ...)
    if not isGameObjectReaderActive then return end

    if event == "ITEM_TEXT_READY" then
        local title = ItemTextGetItem()
        local content = ItemTextGetText()
        local inputKeywords = extractKeywords(title .. " " .. content)
        local bestMatch = nil
        local highestSimilarity = 0.3

        GameObjectReaderDebugPrint("Procesando texto: " .. title)

        -- Buscar en soundMapping
        for mappingKey, soundInfo in pairs(soundMapping) do
            local mappingKeywords = extractKeywords(mappingKey)
            local similarity = calculateSimilarity(inputKeywords, mappingKeywords)

            if similarity > highestSimilarity then
                highestSimilarity = similarity
                bestMatch = soundInfo
                GameObjectReaderDebugPrint("Nueva mejor coincidencia: " .. mappingKey)
                GameObjectReaderDebugPrint("Similitud: " .. (similarity * 100) .. "%")
            end
        end

        -- Buscar en soundMapping_legacy si no se encontró coincidencia
        if not bestMatch then
            for mappingTitle, soundInfo in pairs(soundMapping_legacy) do
                local mappingKeywords = extractKeywords(mappingTitle)
                local similarity = calculateSimilarity(inputKeywords, mappingKeywords)

                if similarity > highestSimilarity then
                    highestSimilarity = similarity
                    bestMatch = soundInfo
                    GameObjectReaderDebugPrint("Nueva mejor coincidencia (legacy): " .. mappingTitle)
                    GameObjectReaderDebugPrint("Similitud: " .. (similarity * 100) .. "%")
                end
            end
        end

        if bestMatch then
            local uniqueKey = title .. "_" .. string.sub(content, 1, 50)
            if not playedObjects[uniqueKey] then
                TryQueueObjectSound(bestMatch.fileName, title, bestMatch.duration, bestMatch.creatureID)
                playedObjects[uniqueKey] = true
                GameObjectReaderDebugPrint("Reproduciendo sonido (Similitud: " .. (highestSimilarity * 100) .. "%)")
            else
                GameObjectReaderDebugPrint("Este objeto ya ha sido reproducido")
            end
        else
            GameObjectReaderDebugPrint("No se encontró una coincidencia suficiente")
        end
    elseif event == "GOSSIP_SHOW" then
        HandleGossipShowEvent()
    end
end)

-- Función para intentar añadir un sonido a la cola solo cuando esta esté vacía
function TryQueueObjectSound(soundFileName, objectName, duration, creatureID)
    local function attemptPlaySound()
        if SoundQueue:IsEmpty() then
            GameObjectReaderDebugPrint("Sound queue is empty, queuing object sound: " .. objectName)
            QueueObjectSound(soundFileName, objectName, duration, creatureID)
        else
            GameObjectReaderDebugPrint("Sound queue is not empty, retrying in 3 seconds for object: " .. objectName)
            C_Timer.After(3, attemptPlaySound) -- Reintentar en 3 segundos
        end
    end

    attemptPlaySound()
end

-- Función para reproducir el sonido del objeto y mostrar el retrato
function QueueObjectSound(soundFileName, objectName, duration, creatureID)
    -- Usar la ruta proporcionada
    local soundFilePath = "Interface/AddOns/AI_VoiceOverData_WarWithin_es/generated/sounds/gameobjects/" ..
        soundFileName .. ".mp3"

    GameObjectReaderDebugPrint("Attempting to queue object sound file: " .. soundFilePath)

    local npcID = creatureID

    -- Crear datos del sonido
    local soundData = {
        event = Enums.SoundEvent.ItemReceived,
        fileName = soundFileName,
        filePath = soundFilePath,
        length = duration, -- Duración en segundos
        title = objectName,
        name = "|cFFFFD700Interactuando con Objeto|r",
        unitGUID = npcID and string.format("Creature-0-0-0-0-%d", npcID) or nil,

        addedCallback = function(sd)
            GameObjectReaderDebugPrint("Sound added to queue: " .. sd.fileName)
            SoundQueueUI:UpdateSoundQueueDisplay() -- Actualizar la UI al agregar el sonido
        end,
        startCallback = function(sd)
            GameObjectReaderDebugPrint("Sound started playing: " .. sd.fileName)
            SoundQueueUI.frame.portrait:Configure(sd) -- Mostrar el retrato al comenzar la reproducción
        end,
        stopCallback = function(sd)
            GameObjectReaderDebugPrint("Sound stopped: " .. sd.fileName)
            -- Limpiar retrato o hacer alguna otra acción al detener
            SoundQueueUI.frame.portrait:Configure(nil)
        end,
    }

    -- Verificar si SoundQueue está disponible y añadir el sonido a la cola
    if SoundQueue and SoundQueue.AddSoundToQueue then
        GameObjectReaderDebugPrint("SoundQueue is available")

        -- Asegúrate de que el archivo de sonido exista y esté preparado
        local soundExists = DataModules:PrepareSound(soundData)
        if soundExists then
            GameObjectReaderDebugPrint("Sound exists in DataModules")
            SoundQueue:AddSoundToQueue(soundData)
        else
            GameObjectReaderDebugPrint("Error: Sound does not exist for: " .. soundFileName)
        end
    else
        GameObjectReaderDebugPrint("Error: SoundQueue no está disponible.")
    end
end

-- Función para reiniciar la tabla de objetos reproducidos
function ResetPlayedObjects()
    playedObjects = {}
    GameObjectReaderDebugPrint("Reset played objects table")
end

-- Función para activar el módulo
function ActivateGameObjectReader()
    isGameObjectReaderActive = true
    isGameObjectReaderDebugEnabled = Addon.db.profile.GameObjectReaderDebugEnabled
    GameObjectReaderDebugPrint("Game Object Reader Module Activated")
end

-- Función para desactivar el módulo
function DeactivateGameObjectReader()
    isGameObjectReaderActive = false
    isGameObjectReaderDebugEnabled = false
    GameObjectReaderDebugPrint("Game Object Reader Module Deactivated")
end

-- Exponer las funciones de activación/desactivación
VoiceOver.GameObjectReader = VoiceOver.GameObjectReader or {}
VoiceOver.GameObjectReader.Activate = ActivateGameObjectReader
VoiceOver.GameObjectReader.Deactivate = DeactivateGameObjectReader
