-- 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 isNPCLiveIAActive = false
local isNPCLiveIADebugEnabled = false

-- Añadir después de las variables iniciales
local recentlyPlayedDialogues = {}
local DIALOGUE_COOLDOWN = 10 -- Tiempo en segundos antes de permitir repetir el mismo diálogo

-- Función para imprimir mensajes de depuración en el chat con un prefijo específico para NPCLiveIA
local function DebugPrintNPCLiveIA(message)
    if isNPCLiveIADebugEnabled then
        print("|cFF00FF00[NPCLiveIA Debug]|r", message)
    end
end

local RED = "|cFFFF0000"
local GREEN = "|cFF00FF00"
local RESET = "|r"

DebugPrintNPCLiveIA(RED .. "NPCLiveIA module loaded" .. RESET)

local frame = CreateFrame("Frame")
frame:RegisterEvent("CHAT_MSG_MONSTER_SAY")
frame:RegisterEvent("CHAT_MSG_MONSTER_YELL")
frame:RegisterEvent("CHAT_MSG_MONSTER_EMOTE")
frame:RegisterEvent("CHAT_MSG_MONSTER_WHISPER")
frame:RegisterEvent("CHAT_MSG_MONSTER_PARTY")

-- 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

-- Mapeo de NPCs, mensajes y archivos de sonido correspondientes
local soundMapping = {
    ["Regald Pirocuerno"] = {
        ["¡Rápido, Adalid! ¡A la cueva! ¡Algunos de esos demonios han alcanzado la tablilla cantante!"] = {fileName = "232297-say03", creatureID = 232297, duration = 6.82},
        ["Cuidado, ¡están preparándose para atacar otra vez!"] = {fileName = "232297-say02", creatureID = 232297, duration = 4.85},
    },
    ["Alba"] = {
        ["¿Sientes ese poder? Yo sí. Se está acumulando furia elemental, que resuena con el cristal."] = { fileName = "228096-say03", creatureID = 228096, duration = 12.36 },
    },
    ["Alekk"] = {
        ["¡Excelente! Tu recompensa te espera más adelante. Te veré ahí y revelaré mi verdadera forma."] = { fileName = "219779-say03", creatureID = 219779, duration = 7.13 },
        ["¡Mi poder es absoluto! Usa mis simulacros para llegar a las partes más altas de la cueva y castigar a mis enemigos."] = { fileName = "219779-say02", creatureID = 219779, duration = 7.81 },
        ["Invócame para caminar sobre el agua. ¡Consigamos esos glifos para que pueda potenciarme!"] = { fileName = "219779-say01", creatureID = 219779, duration = 5.77 },
    },
    ["Meesk, el Escupeveneno"] = {
        ["Por favor, dale las gracias a la Reina de mi parte por su generosa donación. Mis ágiles labios ya se sienten listos para hablar."] = { fileName = "227440-say03", creatureID = 227440, duration = 22.20 },
    },
    ["Natalia Pearce"] = {
        ["¿Estas son las piedras erguidas?"] = { fileName = "223924-say01", creatureID = 223924, duration = 2.48 },
    },
    ["Pregonero del puesto de venta"] = {
        ["¡Hola, amigo! ¡Acércate y mira los nuevos artículos del puesto de venta que acaban de llegar!"] = { fileName = "200208-say08", creatureID = 200208, duration = 7.08 },
    },
    ["Ysabel Gleamgaard"] = {
        ["Aguanta un poco más, Dae."] = { fileName = "227222-say01", creatureID = 227222, duration = 1.41 },
    },
    ["Clamagusanos Iz'tikrine"] = {
        ["¡Invasor! ¡¿Te atreves a amenazar a mis preciosuras?!"] = { fileName = "214153-say01", creatureID = 214153, duration = 4.21 },
    },
    ["Gnimo"] = {
        ["Nadie quiere a Gnimo…"] = { fileName = "32639-say05", creatureID = 32639, duration = 1.59 },
        ["Es hora de que Gnimo se desactive."] = { fileName = "32639-say03", creatureID = 32639, duration = 2.14 },
        ["¡Adiós! ¡Fuiste el mejor amigo que Gnimo ha tenido nunca!"] = { fileName = "32639-say01", creatureID = 32639, duration = 3.74 },
    },
    ["Hakmud de Argus"] = {
        ["¡Hakmud no puede trabajar en estas condiciones! ¡Adios!"] = { fileName = "32638-say05", creatureID = 32638, duration = 4.44 },
        ["¿Por qué tratas a Hakmud así, colega?"] = { fileName = "32638-say03", creatureID = 32638, duration = 2.43 },
        ["Pensaba que éramos amigos, colega. ¿Dejas tirado a Hakmud?"] = { fileName = "32638-say01", creatureID = 32638, duration = 4.62 },
    },
    ["Anub'ilith"] = {
        ["Te conocemos, Faerin Lothar. Ven, chispita. Recupera lo que queda de tu herrero si puedes."] = { fileName = "222185-say01", creatureID = 222185, duration = 7.55 },
    },
    ["Dolena"] = {
        ["No se cuestiona a los que te dan de comer."] = { fileName = "224741-say08", creatureID = 224741, duration = 2.22 },
        ["Sin embargo, si vives aquí el tiempo suficiente, aprenderás a guardar tu energía para los misterios dolorosos."] = { fileName = "224741-say07", creatureID = 224741, duration = 7.76 },
        ["Me pregunto si seguirá vivo. Me encantaría mostrarle que mi versión es muchísimo mejor."] = { fileName = "224741-say06", creatureID = 224741, duration = 5.75 },
        ["Él me enseñó. Su versión tenía patatas en lugar de taro."] = { fileName = "224741-say05", creatureID = 224741, duration = 3.71 },
        ["Yo trabajaba con este tipo... El cocinero más trabajador que he conocido. Por eso lo detestábamos. Nos hacía quedar mal."] = { fileName = "224741-say04", creatureID = 224741, duration = 8.91 },
        ["¿La receta original? Es milenaria."] = { fileName = "224741-say03", creatureID = 224741, duration = 2.82 },
        ["Aquí nadie me molesta. Todos les temen a los fungálidos"] = { fileName = "224741-say02", creatureID = 224741, duration = 3.89 },
        ["Muy bien. Ponte a picar."] = { fileName = "224741-say01", creatureID = 224741, duration = 1.91 },
    },
    ["Phillip Taversil"] = {
        ["Este pequeño fue lo primero que hice. Estaba asimétrico, tenía la sonrisa torcida y por poco se le caía un ojo, pero aun así estaba orgulloso."] = { fileName = "218486-say01", creatureID = 218486, duration = 13.74 },
    },
    ["Cargen Fairleifen"] = {
        ["¡Aquí tengo una pieza que hice con unas habilidades personalizadas en las que estoy trabajando!"] = { fileName = "217808-say01", creatureID = 217808, duration = 10.34 },
    },
    ["Peara Wernt"] = {
        ["¡No hay problema, podemos usar la muñeca de Clary!"] = { fileName = "217832-say01", creatureID = 217832, duration = 3.00 },
    },
    ["Keth Wernt"] = {
        ["¡Oh! ¿Crees que Clary querrá jugar con nosotros?"] = { fileName = "217831-say02", creatureID = 217831, duration = 3.16 },
        ["¡Ah, pero Gerrigon, el Grande, estaba a punto de tener su batalla final con el Señor de las Sombras!"] = { fileName = "217831-say01", creatureID = 217831, duration = 7.24 },
    },
    ["Marja Lenglow"] = {
        ["Hay alguien aquí. ¿Vas a jugar una partida con Faerin? Avísale que estoy lista para una revancha cuando ella quiera."] = { fileName = "217830-say01", creatureID = 217830, duration = 8.91 },
    },
    ["Kiera Horth"] = {
        ["En mi tierra, al final de una partida de Gambito, los adversarios a veces intercambiaban piezas."] = { fileName = "217813-say02", creatureID = 217813, duration = 13.82 },
        ["Claro, aquí tengo una pieza, aunque puede que Beria la haya masticado un poco. ¡No dejes que Faerin te gane!"] = { fileName = "217813-say01", creatureID = 217813, duration = 6.58 },
    },
    ["Anduin Wrynn"] = {
        ["Ah, no, no voy a delatar a nadie."] = { fileName = "218541-say13", creatureID = 218541, duration = 5.11 },
    },
    ["Faerin Lothar"] = {
        ["¡Fuegos artificiales! ¡Me ganaron! Fue una buena partida. ¡Serán los nuevos campeones de Mereldar en muy poco tiempo!"] = { fileName = "215331-say03", creatureID = 215331, duration = 9.38 },
        ["Es... ¡Ja! Andari debe haber empezado a pintar esta figurilla para mí."] = { fileName = "215331-say02", creatureID = 215331, duration = 17.79 },
        ["¿Quién los mandó a buscarme? ¿Golpacero? ¿Kyron? Juro que..."] = { fileName = "215331-say01", creatureID = 215331, duration = 5.67 },
    },
    ["Prioresa Haelsey Catarrezo"] = {
        ["Recuerda mis palabras, barón, y mantén encendida la esperanza."] = { fileName = "221723-say01", creatureID = 221723, duration = 4.62 },
    },
    ["Hermano Abealard"] = {
        ["Agregar un poco de agua bendita a la mezcla."] = { fileName = "221530-say09", creatureID = 221530, duration = 3.24 },
        ["¡No, no, no! ¡Tendremos que empezar de nuevo!"] = { fileName = "221530-say08", creatureID = 221530, duration = 3.29 },
        ["Agregar unas bolsitas de especias especiales."] = { fileName = "221530-say07", creatureID = 221530, duration = 2.77 },
        ["Cuidado con... No importa. Intentemos de nuevo."] = { fileName = "221530-say06", creatureID = 221530, duration = 4.08 },
        ["Agregar unas pocas hierbas sagradas."] = { fileName = "221530-say05", creatureID = 221530, duration = 2.64 },
        ["Yo... No, eso no está nada bien."] = { fileName = "221530-say04", creatureID = 221530, duration = 4.13 },
        ["¡Salta ahí y pisotea esas uvas!"] = { fileName = "221530-say03", creatureID = 221530, duration = 3.42 },
        ["Escucha con atención los ingredientes que debes agregar."] = { fileName = "221530-say02-off", creatureID = 221530, duration = 4.00 },
        ["La elaboración de este vino es una tradición antigua del lugar."] = { fileName = "221530-say01", creatureID = 221530, duration = 5.09 },
    },
    ["Barón Sybaestan Braunpyke"] = {
        ["Pero él era el más sensato. Ahora lo veo con claridad. ¿Qué voy a hacer sin ti, Theleon? ¿Cómo haré sin tu mesura?"] = { fileName = "221492-say11", creatureID = 221492, duration = 8.49 },
        ["A veces nos peleábamos. Como todos los hermanos, ¿no? Él era más cauteloso que yo. Era una de nuestras principales fuentes de conflicto."] = { fileName = "221492-say10", creatureID = 221492, duration = 8.44 },
        ["Nunca lo perdí de vista. Pero... no fue suficiente."] = { fileName = "221492-say09", creatureID = 221492, duration = 4.00 },
        ["Theleon le dijo que no se preocupara. Que yo iba a estar ahí para cuidarlo. Y yo le prometí que siempre estaría."] = { fileName = "221492-say08", creatureID = 221492, duration = 6.82 },
        ["A mamá le preocupaba mucho que Theleon me acompañara en la expedición Cristalia."] = { fileName = "221492-say07", creatureID = 221492, duration = 4.60 },
        ["Mi madre se enfadó mucho porque podrían haberlo asfixiado, pero yo no quería que estuviera solo.... como ahora."] = { fileName = "221492-say06", creatureID = 221492, duration = 6.58 },
        ["Pero no quería que mi hermanito se sintiera solo, así que metí a los cachorros de nuestro lince en la cuna."] = { fileName = "221492-say05", creatureID = 221492, duration = 6.53 },
        ["Mi primer recuerdo de Theleon... Recuerdo verlo en su cuna y que me dijeran que lo dejara solo para que durmiera."] = { fileName = "221492-say04", creatureID = 221492, duration = 6.53 },
        ["Yo... no olvidaré nada de lo que dijo, prioresa. Gracias."] = { fileName = "221492-say03", creatureID = 221492, duration = 4.13 },
        ["¡No! ¡No me dejes, Theleon!"] = { fileName = "221492-say02", creatureID = 221492, duration = 2.27 },
        ["¡Los enviaremos de vuelta a las oscuras profundidades!"] = { fileName = "221492-say01", creatureID = 221492, duration = 3.19 },
    },
    ["Sir Theleon Braunpyke"] = {
        ["Estos kobismales se han aprovechado de nuestra lucha contra los nerubianos. Se han vuelto audaces, hermano."] = { fileName = "221486-say01", creatureID = 221486, duration = 7.24 },
    },
    ["Tefferty Ulreth"] = {
        ["Aquí están las últimas flores de la vieja Gail. ¿Estás seguro de que funcionará, Wenren? Es todo lo que le quedaba como recuerdo de su casa."] = { fileName = "220005-say01", creatureID = 220005, duration = 8.36 },
    },
    ["Gran Kyron"] = {
        ["Faerin no habla de su dolor, pero hace poco perdió a un amigo cercano. Ya no escucha consejos de nosotros, los viejos soldados. Habla con ella, por favor. Estará en Baluarte de la Luz."] = { fileName = "215341-say01", creatureID = 215341, duration = 13.92 },
    },
    ["Disparos"] = {
        ["Percibes un glifo de cielonáutica cerca."] = { fileName = "Disparos-say02", creatureID = Disparos, duration = 5.30 },
    },
    ["Wenren Althal"] = {
        ["¡Ahora, puedo usar la energía de esos cangrejos para catalizar una combinación de hechizos de teletransportación! Probaremos esta teoría en las plantas."] = { fileName = "219135-say16", creatureID = 219135, duration = 11.13 },
        ["Espera. Perdón, ¿acabo de lanzar Teletransporte en lugar de Portal...?"] = { fileName = "219135-say15", creatureID = 219135, duration = 6.45 },
        ["Nos vemos en mi laboratorio. Juntos, completaremos el verdadero hechizo que nos llevará a todos a casa, al imperio."] = { fileName = "219135-say14", creatureID = 219135, duration = 8.54 },
        ["¿Larky seguirá en casa? Ese... ese es mi gato."] = { fileName = "219135-say13", creatureID = 219135, duration = 4.55 },
        ["No lo puedo creer, ¡lo logré! ¡De verdad lo logré! ¡Puedo llevar a mi gente a casa, amigo mío! ¡A casa!"] = { fileName = "219135-say12", creatureID = 219135, duration = 8.78 },
        ["Wenren se seca las lágrimas de los ojos."] = { fileName = "219135-say11", creatureID = 219135, duration = 2.59 },
        ["¿Todo bien por ahí? ¿Algún monstruo aterrador cerca?"] = { fileName = "219135-say10", creatureID = 219135, duration = 3.58 },
        ["¡Funcionó! ¡Realmente nos llevó a donde vive la flor! ¡Ne-necesitamos confirmar! Tengo otra planta aquí. ¡Hagámoslo de nuevo!"] = { fileName = "219135-say09", creatureID = 219135, duration = 14.24 },
        ["¡E-es aquí! ¡Sí! ¡De aquí arranqué esa flor con la que acabamos de hacer la prueba!"] = { fileName = "219135-say08", creatureID = 219135, duration = 7.18 },
        ["¿Y? ¿Es seguro? ¿Estás vivo por allá? Ay, espero no haberte matado. Dame una señal..."] = { fileName = "219135-say07", creatureID = 219135, duration = 13.27 },
        ["¡Ahí! ¡Un portal! Debería llevarnos al lugar donde brotó esta planta. Marqué la ubicación cuando la recogí por primera vez, así que... ¡ya veremos!"] = { fileName = "219135-say06", creatureID = 219135, duration = 15.12 },
        ["Cada ser vivo tiene un recuerdo profundo del lugar donde nació. He trabajado durante años para acceder a esa información."] = { fileName = "219135-say05", creatureID = 219135, duration = 8.02 },
        ["¡Comencemos! Conecta los nodos en la red de hechizos, asistente novel, mientras yo secuencio el flujo de energía."] = { fileName = "219135-say04", creatureID = 219135, duration = 9.04 },
        ["Gracias, Teff. Lo sé. Dile que lo siento. Lograré que esto funcione."] = { fileName = "219135-say03", creatureID = 219135, duration = 7.76 },
        ["Si mi teoría funciona, podremos ir a casa. ¡Podremos reabastecernos y recibir refuerzos! ¡Teff podrá ver a su esposa de nuevo! ¿Crees que mi gatito me recordará?"] = { fileName = "219135-say02", creatureID = 219135, duration = 13.32 },
        ["¡¿De verdad se teletransportaron?! ¡Por fin, un avance!"] = { fileName = "219135-say01", creatureID = 219135, duration = 4.60 },
    },
    ["Crenna Hija de la Tierra"] = {
        ["La vagoneta necesita más combustible. ¿Hay alguna vela por ahí?"] = { fileName = "209072-say02", creatureID = 209072, duration = 4.44 },
        ["La luz se está apagando. Necesitamos velas."] = { fileName = "209072-say02", creatureID = 209072, duration = 4.44 },
        ["La justicia exige que derrotemos al portavoz mayor."] = { fileName = "209072-say01", creatureID = 209072, duration = 4.21 },
    },
    ["Shuja Hacha Macabra"] = {
        ["La vagoneta necesita más combustible. ¿Hay alguna vela por ahí?"] = { fileName = "214390-say04", creatureID = 214390, duration = 4.68 },
        ["Usemos una potenciación"] = { fileName = "214390-say03", creatureID = 214390, duration = 2.12 },
        ["Esto no tiene buena pinta."] = { fileName = "214390-say02", creatureID = 214390, duration = 1.75 },
        ["Mira tu guía de aventura si necesitas más información sobre lo que encontraremos aquí."] = { fileName = "214390-say01", creatureID = 214390, duration = 5.98 },
    },
    ["Meredy Huntswell"] = {
        ["La luz se está apagando. Necesitamos velas."] = { fileName = "209059-say09", creatureID = 209059, duration = 3.34 },
        ["La vagoneta necesita más combustible. ¿Hay alguna vela por ahí?"] = { fileName = "209059-say09", creatureID = 209059, duration = 3.34 },
        ["Parece que necesitamos más velas."] = { fileName = "209059-say09", creatureID = 209059, duration = 3.34 },
        ["Mesa de mago lista. Tomen un bocado para más tarde."] = { fileName = "209059-say08", creatureID = 209059, duration = 3.53 },
        ["Una mesa de mago para todas las necesidades de alimentos conjurados."] = { fileName = "209059-say07", creatureID = 209059, duration = 4.78 },
        ["Todos, activen sus potenciaciones."] = { fileName = "209059-say06", creatureID = 209059, duration = 2.46 },
        ["Esto no tiene buena pinta."] = { fileName = "209059-say05", creatureID = 209059, duration = 1.62 },
        ["Todos, activen sus potenciaciones."] = { fileName = "209059-say04", creatureID = 209059, duration = 2.74 },
        ["Una mesa de mago para todas las necesidades de alimentos conjurados."] = { fileName = "209059-say03", creatureID = 209059, duration = 4.13 },
        ["Mesa de mago lista. Tomen un bocado para más tarde."] = { fileName = "209059-say02", creatureID = 209059, duration = 4.44 },
        ["Esto no tiene buena pinta."] = { fileName = "209059-say01", creatureID = 209059, duration = 1.67 },
    },
    ["Capitana Garrick"] = {
        ["Muy buen trabajo. Eso es todo. Pueden irse cuando quieran."] = { fileName = "209057-say13", creatureID = 209057, duration = 4.26 },
        ["¡Aléjate de la vela!"] = { fileName = "209057-say12", creatureID = 209057, duration = 1.57 },
        ["Quédate en la luz. ¡Protege esa vela!"] = { fileName = "209057-say11", creatureID = 209057, duration = 2.69 },
        ["Parece que necesitamos más velas."] = { fileName = "209057-say09", creatureID = 209057, duration = 2.35 },
        ["La vagoneta necesita más combustible. ¿Hay alguna vela por ahí?"] = { fileName = "209057-say08", creatureID = 209057, duration = 3.89 },
        ["La luz se está apagando. Necesitamos velas."] = { fileName = "209057-say08", creatureID = 209057, duration = 3.89 },
        ["Mira tu guía de aventura si necesitas más información sobre lo que encontraremos aquí."] = { fileName = "209057-say07", creatureID = 209057, duration = 5.75 },
        ["Esto no tiene buena pinta."] = { fileName = "209057-say06", creatureID = 209057, duration = 1.85 },
        ["Mira tu guía de aventura si necesitas más información sobre lo que encontraremos aquí."] = { fileName = "209057-say05", creatureID = 209057, duration = 5.43 },
        ["Todos, activen sus potenciaciones."] = { fileName = "209057-say04", creatureID = 209057, duration = 2.77 },
        ["No olviden las potenciaciones."] = { fileName = "209057-say03", creatureID = 209057, duration = 2.27 },
        ["Te mantendré a salvo. Sígueme."] = { fileName = "209057-say02", creatureID = 209057, duration = 2.22 },
        ["Muy bien. Dirige tú."] = { fileName = "209057-say01", creatureID = 209057, duration = 1.80 },
    },
    ["*"] = { -- Utilizamos "*" como clave para detectar cualquier NPC
        ["Percibes un glifo de cielonáutica cerca."] = { fileName = "Disparos-say02", creatureID = 15608, duration = 5.30 },
    },
    -- Otros NPCs...
}

frame:SetScript("OnEvent", function(self, event, ...)
    if not isNPCLiveIAActive then return end -- No hacer nada si el módulo está desactivado

    local message, sender = ...
    -- Cola local para almacenar los diálogos detectados en orden
    if not self.dialogueQueue then
        self.dialogueQueue = {}
    end

    -- Crear una clave única para este diálogo
    local dialogueKey = sender .. "_" .. message

    -- Verificar si el diálogo está en cooldown
    local currentTime = GetTime()
    if recentlyPlayedDialogues[dialogueKey] then
        local timeSinceLastPlay = currentTime - recentlyPlayedDialogues[dialogueKey]
        if timeSinceLastPlay < DIALOGUE_COOLDOWN then
            DebugPrintNPCLiveIA(string.format(
                "Diálogo en cooldown. Tiempo restante: %.1f segundos",
                DIALOGUE_COOLDOWN - timeSinceLastPlay
            ))
            return
        end
    end

    local inputKeywords = extractKeywords(sender .. " " .. message)
    local bestMatch = nil
    local highestSimilarity = 0.3 -- Umbral de similitud
    local matchedMessage = nil

    -- Primero buscar en el mapeo específico del NPC
    if soundMapping[sender] then
        for storedMessage, soundInfo in pairs(soundMapping[sender]) do
            local mappingKeywords = extractKeywords(storedMessage)
            local similarity = calculateSimilarity(inputKeywords, mappingKeywords)

            if similarity > highestSimilarity then
                highestSimilarity = similarity
                bestMatch = soundInfo
                matchedMessage = storedMessage
                DebugPrintNPCLiveIA("Nueva mejor coincidencia para NPC específico: " .. sender)
                DebugPrintNPCLiveIA("Similitud: " .. (similarity * 100) .. "%")
            end
        end
    end

    -- Si no se encontró coincidencia, buscar en el mapeo genérico "*"
    if not bestMatch and soundMapping["*"] then
        for storedMessage, soundInfo in pairs(soundMapping["*"]) do
            local mappingKeywords = extractKeywords(storedMessage)
            local similarity = calculateSimilarity(inputKeywords, mappingKeywords)

            if similarity > highestSimilarity then
                highestSimilarity = similarity
                bestMatch = soundInfo
                matchedMessage = storedMessage
                DebugPrintNPCLiveIA("Nueva mejor coincidencia en mapeo genérico")
                DebugPrintNPCLiveIA("Similitud: " .. (similarity * 100) .. "%")
            end
        end
    end

    if bestMatch then
        -- Registrar el tiempo de reproducción
        recentlyPlayedDialogues[dialogueKey] = currentTime

        -- Programar la limpieza del registro después del cooldown
        C_Timer.After(DIALOGUE_COOLDOWN, function()
            recentlyPlayedDialogues[dialogueKey] = nil
        end)

        table.insert(self.dialogueQueue, {
            fileName = bestMatch.fileName,
            message = message,
            duration = bestMatch.duration,
            creatureID = bestMatch.creatureID,
            sender = sender
        })

        DebugPrintNPCLiveIA(string.format(
            "Coincidencia encontrada (Similitud: %.2f%%)\nNPC: %s\nMensaje Original: %s\nMensaje Coincidente: %s",
            highestSimilarity * 100,
            sender,
            message,
            matchedMessage
        ))

        self:TryPlayNextDialogue()
    else
        DebugPrintNPCLiveIA("No se encontró una coincidencia suficiente para: " .. sender .. " - " .. message)
    end
end)

-- Función para intentar reproducir el siguiente diálogo en la cola
frame.TryPlayNextDialogue = function(self)
    if #self.dialogueQueue > 0 and SoundQueue:IsEmpty() then
        local nextDialogue = table.remove(self.dialogueQueue, 1)
        QueueNpcSound(nextDialogue.fileName, nextDialogue.message, nextDialogue.duration, nextDialogue.creatureID,
            nextDialogue.sender)
    elseif #self.dialogueQueue > 0 then
        -- Si la cola de sonido no está vacía, intentar de nuevo en 1 segundo
        C_Timer.After(1, function() self:TryPlayNextDialogue() end)
    end
end

-- Función para reproducir el sonido del NPC y mostrar el retrato
function QueueNpcSound(soundFileName, dialogueText, duration, creatureID, npcName)
    local soundFilePath = "Interface/AddOns/AI_VoiceOverData_WarWithin_es/generated/sounds/Ai-NPC/" ..
        soundFileName .. ".mp3"

    DebugPrintNPCLiveIA("Attempting to queue NPC sound file: " .. soundFilePath)

    local npcID = creatureID

    -- Crear datos del sonido
    local soundData = {
        event = Enums.SoundEvent.NPCDialogue,
        fileName = soundFileName,
        filePath = soundFilePath,
        length = duration,
        title = dialogueText,
        name = npcName,
        unitGUID = npcID and string.format("Creature-0-0-0-0-%d", npcID) or nil,

        addedCallback = function(sd)
            DebugPrintNPCLiveIA(GREEN .. "Sound added to queue: " .. sd.fileName .. RESET)
            SoundQueueUI:UpdateSoundQueueDisplay()
        end,
        startCallback = function(sd)
            DebugPrintNPCLiveIA(GREEN .. "Sound started playing: " .. sd.fileName .. RESET)
            SoundQueueUI.frame.portrait:Configure(sd)
        end,
        stopCallback = function(sd)
            DebugPrintNPCLiveIA(GREEN .. "Sound stopped: " .. sd.fileName .. RESET)
            -- Limpiar retrato o hacer alguna otra acción al detener
            SoundQueueUI.frame.portrait:Configure(nil)
            -- Intentar reproducir el siguiente diálogo después de que este termine
            frame:TryPlayNextDialogue()
        end,
    }

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

        -- Asegúrate de que el archivo de sonido exista y esté preparado
        local soundExists = DataModules:PrepareSound(soundData)
        if soundExists then
            DebugPrintNPCLiveIA("Sound exists in DataModules")
            SoundQueue:AddSoundToQueue(soundData)
        else
            DebugPrintNPCLiveIA(RED .. "Error: Sound does not exist for: " .. soundFileName .. RESET)
            -- Si el sonido no existe, intentar reproducir el siguiente en la cola
            frame:TryPlayNextDialogue()
        end
    else
        DebugPrintNPCLiveIA(RED .. "Error: SoundQueue no está disponible." .. RESET)
        -- Si SoundQueue no está disponible, intentar reproducir el siguiente en la cola
        frame:TryPlayNextDialogue()
    end
end

-- Función para activar el módulo
function ActivateNPCLiveIA()
    isNPCLiveIAActive = true
    isNPCLiveIADebugEnabled = Addon.db.profile.NPCLiveIADebugEnabled
    DebugPrintNPCLiveIA("|cff00ff00NPCLiveIA Module Activated|r")
end

-- Función para desactivar el módulo
function DeactivateNPCLiveIA()
    isNPCLiveIAActive = false
    isNPCLiveIADebugEnabled = false
    DebugPrintNPCLiveIA("|cffff0000NPCLiveIA Module Deactivated|r")
end

-- Exponer las funciones de activación/desactivación
VoiceOver.NPCLiveIA = VoiceOver.NPCLiveIA or {}
VoiceOver.NPCLiveIA.Activate = ActivateNPCLiveIA
VoiceOver.NPCLiveIA.Deactivate = DeactivateNPCLiveIA
