-- 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"
local GREEN = "|cFF00FF00"
local RESET = "|r"

GameObjectReaderDebugPrint(RED .. "GameObjectSoundPlayer module loaded" .. RESET)

-- Tabla para mapear títulos a sonidos
local soundMapping = {
    ["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 rastrear los objetos ya reproducidos
local playedObjects = {}

-- Crear un frame para mostrar el título y el texto del objeto
local displayFrame = CreateFrame("Frame", "GameObjectTextDisplayFrame", UIParent, "BasicFrameTemplateWithInset")
displayFrame:SetSize(400, 200)
displayFrame:SetPoint("CENTER")
displayFrame:Hide()

-- Crear un campo de texto para el título
local titleEditBox = CreateFrame("EditBox", nil, displayFrame, "InputBoxTemplate")
titleEditBox:SetSize(350, 30)
titleEditBox:SetPoint("TOP", displayFrame, "TOP", 0, -30)
titleEditBox:SetAutoFocus(false)
titleEditBox:SetScript("OnEscapePressed", function(self) self:ClearFocus() end)

-- Crear un campo de texto para el contenido del objeto
local contentEditBox = CreateFrame("EditBox", nil, displayFrame, "InputBoxTemplate")
contentEditBox:SetMultiLine(true)
contentEditBox:SetSize(350, 100)
contentEditBox:SetPoint("TOP", titleEditBox, "BOTTOM", 0, -10)
contentEditBox:SetAutoFocus(false)
contentEditBox:SetScript("OnEscapePressed", function(self) self:ClearFocus() end)

-- Función para mostrar y seleccionar el texto en los campos, y ajustar el tamaño del frame
local function ShowAndSelectText(title, content)
    displayFrame:Show()
    titleEditBox:SetText(title or "")
    contentEditBox:SetText(content or "")

    -- Calcular la altura necesaria para el contenido
    local contentHeight = contentEditBox:GetNumLetters() * 0.5 + 20 -- Ajustar el valor según el tamaño de la fuente
    local newHeight = 100 + contentHeight -- Base height + content height
    
    -- Ajustar el tamaño del frame y los elementos internos
    contentEditBox:SetHeight(contentHeight)
    displayFrame:SetHeight(newHeight)
    
    -- Seleccionar texto
    titleEditBox:HighlightText()
    contentEditBox:HighlightText()
    titleEditBox:SetFocus()
end

local frame = CreateFrame("Frame")
frame:RegisterEvent("ITEM_TEXT_READY")

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()
        GameObjectReaderDebugPrint("GameObject interaction detected: " .. (title or "Unknown"))

        -- Verificar si no se encuentra el mapeo de sonido
        if not soundMapping[title] then
            GameObjectReaderDebugPrint(RED .. "No sound mapping found for: " .. title .. RESET)
            
            -- Mostrar y seleccionar el texto ya que no se encontró un audio asociado
            ShowAndSelectText(title, content)
        else
            -- Si se encuentra el mapeo de sonido, ejecutar el sonido y no mostrar los cuadros de texto
            if not playedObjects[title] then
                GameObjectReaderDebugPrint("Detected GameObject: [" .. title .. "]")
                local soundInfo = soundMapping[title]
                TryQueueObjectSound(soundInfo.fileName, title, soundInfo.duration, soundInfo.creatureID)
                playedObjects[title] = true
            else
                GameObjectReaderDebugPrint(RED .. "GameObject [" .. title .. "] sound has already been played" .. RESET)
            end
        end
    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 = "Objeto Interactuado",
        unitGUID = npcID and string.format("Creature-0-0-0-0-%d", npcID) or nil,
        
        addedCallback = function(sd)
            GameObjectReaderDebugPrint(GREEN .. "Sound added to queue: " .. sd.fileName .. RESET)
            SoundQueueUI:UpdateSoundQueueDisplay()  -- Actualizar la UI al agregar el sonido
        end,
        startCallback = function(sd)
            GameObjectReaderDebugPrint(GREEN .. "Sound started playing: " .. sd.fileName .. RESET)
            SoundQueueUI.frame.portrait:Configure(sd)  -- Mostrar el retrato al comenzar la reproducción
        end,
        stopCallback = function(sd)
            GameObjectReaderDebugPrint(GREEN .. "Sound stopped: " .. sd.fileName .. RESET)
            -- 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(RED .. "Error: Sound does not exist for: " .. soundFileName .. RESET)
        end
    else
        GameObjectReaderDebugPrint(RED .. "Error: SoundQueue no está disponible." .. RESET)
    end
end

-- Función para reiniciar la tabla de objetos reproducidos (puedes llamarla cuando sea necesario, por ejemplo, al cambiar de zona)
function ResetPlayedObjects()
    playedObjects = {}
    GameObjectReaderDebugPrint(GREEN .. "Reset played objects table" .. RESET)
end

-- Función para activar el módulo
function ActivateGameObjectReader()
    isGameObjectReaderActive = true
    isGameObjectReaderDebugEnabled = Addon.db.profile.GameObjectReaderDebugEnabled
    DEFAULT_CHAT_FRAME:AddMessage("|cff00ff00Game Object Reader Module Activated|r")
end

-- Función para desactivar el módulo
function DeactivateGameObjectReader()
    isGameObjectReaderActive = false
    isGameObjectReaderDebugEnabled = false
    DEFAULT_CHAT_FRAME:AddMessage("|cffff0000Game Object Reader Module Deactivated|r")
end

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