import re
import unicodedata

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 extraer_playlist(contenido):
    if not contenido.lstrip().startswith("#EXTM3U"):
        raise ValueError("Playlist M3U invalida")

    canales = []
    nombre = None

    for linea in contenido.splitlines():
        linea = linea.strip()

        if linea.startswith("#EXTINF"):
            nombre = linea.split(",", 1)[-1].strip()

        elif linea.startswith(("http://", "https://")):
            if nombre:
                canales.append({
                    "name": nombre,
                    "url": linea
                })
            nombre = None

    if not canales:
        raise ValueError("Playlist sin canales")

    return canales

def validar_playlist(contenido, esperados):
    canales = extraer_playlist(contenido)
    encontrados = {}

    for nombre in esperados:
        coincidencias = [
            c for c in canales
            if normalizar(nombre) in normalizar(c["name"])
        ]

        if len(coincidencias) != 1:
            raise ValueError(
                "Canal ausente o ambiguo: " + nombre
            )

        encontrados[nombre] = coincidencias[0]["url"]

    return encontrados
