import re
import unicodedata

ALIASES = {
    "aguilas": "aguilas",
    "charros": "charros",
    "caneros": "caneros",
    "algodoneros": "algodoneros",
    "jaguares": "jaguares",
    "naranjeros": "naranjeros",
    "mayos": "mayos",
    "navojoa": "mayos",
    "tomateros": "tomateros",
    "venados": "venados",
    "yaquis": "yaquis"
}

def normalizar(texto):
    texto = unicodedata.normalize("NFD", str(texto).lower())
    texto = "".join(
        c for c in texto
        if unicodedata.category(c) != "Mn"
    )
    return re.sub(r"[^a-z0-9]", "", texto)

def identificar(texto):
    texto = normalizar(texto)
    encontrados = [
        canonico
        for alias, canonico in ALIASES.items()
        if alias in texto
    ]
    encontrados = set(encontrados)
    return encontrados

def asociar(juegos, inventario):
    resultados = {}

    for juego in juegos:
        visitante = identificar(juego.get("awayTeamShort", ""))
        local = identificar(juego.get("homeTeamShort", ""))

        if len(visitante) != 1 or len(local) != 1:
            continue

        esperados = visitante | local

        if len(esperados) != 2:
            continue

        candidatos = []

        for identificador, nombre in inventario.items():
            encontrados = identificar(nombre)

            if encontrados == esperados:
                candidatos.append(identificador)

        if len(candidatos) == 1:
            clave = (
                juego.get("localFullDate", "")
                + "|"
                + "|".join(sorted(esperados))
            )

            resultados[clave] = candidatos[0]

    return resultados
