setfenv(1, VoiceOver)

ItemAdapter = {}

local isActive = false
local playedItems = {}

-- Función para extraer ItemID de un itemLink
local function GetItemIDFromLink(itemLink)
    if not itemLink then return nil end
    local itemID = itemLink:match("item:(%d+)")
    return tonumber(itemID)
end

-- Función para buscar el item en los lookups
local function FindItemData(itemID)
    Debug:Print("Buscando ItemID: " .. tostring(itemID), "Item")

    -- Buscar en todos los módulos de datos registrados
    for _, module in ipairs(DataModules.registeredModulesOrdered) do
        if module.ItemLookupByItemID then
            local itemData = module.ItemLookupByItemID[itemID]

            if itemData then
                Debug:Print("¡Item encontrado en lookup!", "Item")
                return itemData.text, itemData.iconID, itemData.name
            end
        end
    end

    Debug:Print(Utils:ColorizeText("No se encontró itemID en lookup: " .. tostring(itemID), RED_FONT_COLOR_CODE), "Item")
    return nil, nil, nil
end

-- Función para manejar CHAT_MSG_LOOT
local function OnLootMessage(message)
    if not isActive then
        Debug:Print(Utils:ColorizeText("Adapter NO está activo", RED_FONT_COLOR_CODE), "Item")
        return
    end

    Debug:Print("Mensaje de loot recibido: " .. message, "Item")

    -- Extraer itemLink del mensaje
    local itemLink = message:match("|H(item:[^|]+)|h")

    if not itemLink then
        return
    end

    local itemID = GetItemIDFromLink(itemLink)

    if not itemID then
        Debug:Print(Utils:ColorizeText("No se pudo extraer ItemID del link", RED_FONT_COLOR_CODE), "Item")
        return
    end

    -- Verificar si ya se reprodujo este item
    if playedItems[itemID] then
        Debug:Print(Utils:ColorizeText("Item ya reproducido: " .. tostring(itemID), YELLOW_FONT_COLOR_CODE), "Item")
        return
    end

    -- Buscar item en lookup
    local itemText, iconID, itemNameFromLookup = FindItemData(itemID)

    if not itemText then
        Debug:Print(Utils:ColorizeText("No hay audio para este itemID", RED_FONT_COLOR_CODE), "Item")
        return
    end

    -- Obtener información del item
    local itemName = itemNameFromLookup or GetItemInfo(itemID)

    if not itemName then
        Debug:Print(Utils:ColorizeText("No se pudo obtener información del item: " .. tostring(itemID), RED_FONT_COLOR_CODE), "Item")
        return
    end

    -- Usar ItemID como nombre de archivo
    local fileName = tostring(itemID)

    -- Obtener duración del sonido
    local duration = DataModules:GetSoundLength(fileName)
    if not duration then
        duration = 10 -- Duración por defecto
        Debug:Print(Utils:ColorizeText("Usando duración por defecto: " .. tostring(duration), YELLOW_FONT_COLOR_CODE), "Item")
    else
        Debug:Print("Duración del sonido: " .. tostring(duration), "Item")
    end

    -- Crear soundData completo (igual que Dialogue)
    local soundData = {
        event = Enums.SoundEvent.ItemReceived,
        name = itemName, -- Nombre del item (se muestra arriba en el retrato)
        title = itemText, -- Texto descriptivo completo (se muestra en el botón)
        text = itemText, -- Mismo texto descriptivo
        fileName = fileName,
        filePath = format([[Interface\AddOns\AI_VoiceOverData_Midnight_esMX\generated\sounds\items\%s.mp3]], fileName),
        length = duration,
        iconID = iconID, -- Agregar iconID para mostrar en el retrato
    }

    Debug:Print("Creado soundData - filePath: " .. soundData.filePath, "Item")

    -- Preparar y encolar el sonido
    if DataModules:PrepareSound(soundData) then
        Debug:Print("Sonido preparado, añadiendo a la cola", "Item")
        SoundQueue:AddSoundToQueue(soundData)
        playedItems[itemID] = true
    else
        Debug:Print(Utils:ColorizeText("Fallo al preparar sonido", RED_FONT_COLOR_CODE), "Item")
    end
end

-- Frame para eventos
local frame = CreateFrame("Frame")
frame:RegisterEvent("CHAT_MSG_LOOT")

frame:SetScript("OnEvent", function(self, event, ...)
    if event == "CHAT_MSG_LOOT" then
        local message = ...
        OnLootMessage(message)
    end
end)

-- Funciones de activación/desactivación
function ItemAdapter:Activate()
    isActive = true

end

function ItemAdapter:Deactivate()
    isActive = false
    Debug:Print(Utils:ColorizeText("Desactivado", RED_FONT_COLOR_CODE), "ItemAdapter")
end

function ItemAdapter:Reset()
    playedItems = {}
    Debug:Print("Items reproducidos reseteados", "ItemAdapter")
end
