-- 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 = {
    ["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

-- Actualizar la función de evento para manejar sonidos legacy y basados en IDs
frame:SetScript("OnEvent", function(self, event, ...)
    if not isGameObjectReaderActive then return end -- No hacer nada si el módulo está desactivado

    if event == "ITEM_TEXT_READY" then
        local title = ItemTextGetItem()
        local content = ItemTextGetText()
        local uniqueKey = title .. ":" .. content -- Combinar nombre y contenido

        GameObjectReaderDebugPrint("GameObject interaction detected: " .. uniqueKey)

        -- Verificar si el mapeo de sonido se encuentra en soundMapping
        local soundInfo = soundMapping[uniqueKey]
        if not soundInfo then
            -- Verificar si el mapeo de sonido se encuentra en soundMapping_legacy
            soundInfo = soundMapping_legacy[title]
        end

        if not soundInfo then
            GameObjectReaderDebugPrint("No sound mapping found for: " .. uniqueKey)
        else
            -- Si se encuentra el mapeo de sonido, ejecutar el sonido
            if not playedObjects[uniqueKey] then
                GameObjectReaderDebugPrint("Detected GameObject: [" .. uniqueKey .. "]")
                TryQueueObjectSound(soundInfo.fileName, title, soundInfo.duration, soundInfo.creatureID)
                playedObjects[uniqueKey] = true
            else
                GameObjectReaderDebugPrint("GameObject [" .. uniqueKey .. "] sound has already been played")
            end
        end
    elseif event == "GOSSIP_SHOW" then
        HandleGossipShowEvent() -- Llamar a la función para manejar el evento GOSSIP_SHOW
    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
