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)

    -- Crear soundData minimo. DataModules:PrepareSound se encarga de:
    --   - Buscar en que pack/modulo existe el archivo (recorre registeredModulesOrdered).
    --   - Resolver soundData.length desde SoundLengthLookupByFileName.
    --   - Construir soundData.filePath con el AddonName del modulo correcto.
    -- Asi el item suena desde el pack activo, no desde uno hardcodeado.
    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 boton)
        text = itemText,    -- Mismo texto descriptivo
        fileName = fileName,
        iconID = iconID,    -- Agregar iconID para mostrar en el retrato
    }

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