setfenv(1, VoiceOver)

ItemAdapter = {}

local isActive = false
local playedItems = {}
local lastMonsterChatTime = 0
local MONSTER_CHAT_SILENCE = 12 -- segundos a esperar después del último bocadillo

-- 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 or 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")

    -- Esperar 1s inicial para que los CHAT_MSG_MONSTER_* lleguen primero,
    -- luego seguir esperando si aún hay bocadillos recientes
    local function TryEnqueue()
        if (GetTime() - lastMonsterChatTime) < MONSTER_CHAT_SILENCE then
            Addon:ScheduleTimer(TryEnqueue, 2)
            return
        end
        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

    Addon:ScheduleTimer(TryEnqueue, 1)
end

-- Frame para eventos
local frame = CreateFrame("Frame")
frame:RegisterEvent("CHAT_MSG_LOOT")
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:SetScript("OnEvent", function(self, event, ...)
    if event == "CHAT_MSG_LOOT" then
        local message = ...
        OnLootMessage(message)
    elseif event == "CHAT_MSG_MONSTER_SAY"
        or event == "CHAT_MSG_MONSTER_YELL"
        or event == "CHAT_MSG_MONSTER_EMOTE"
        or event == "CHAT_MSG_MONSTER_WHISPER"
    then
        lastMonsterChatTime = GetTime()
    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
