"""Resolución de canales Sling autorizados desde M3U existente; sin depender del EPG."""
import re,unicodedata
from hermes_football_v3d import _playlist
from hermes_football_cards_v42 import forzar_enlace_futbol

def normalizar(s):
    s=''.join(c for c in unicodedata.normalize('NFKD',str(s).casefold()) if not unicodedata.combining(c))
    return re.sub(r'[^a-z0-9]+','',s)

def buscar_canal_sling(canal, limite=12):
    needle=normalizar(canal)
    if len(needle)<2:return {'estado':'CANAL_INVALIDO'}
    catalogo=_playlist()  # Descarga M3U autenticada usando las credenciales ya cargadas en el servicio
    encontrados=[];vistos=set()
    for entries in catalogo.values():
        for item in entries:
            nombre=item['nombre']; clave=normalizar(nombre)
            if needle in clave or clave in needle:
                url=item['url']
                if url not in vistos:
                    vistos.add(url)
                    encontrados.append({'nombre':nombre,'url':url,'puntaje':int(clave==needle)*100+int(clave.startswith(needle))*10})
    encontrados.sort(key=lambda x:-x['puntaje'])
    return {'estado':'CANALES_ENCONTRADOS' if encontrados else 'CANAL_NO_ENCONTRADO',
            'canales':encontrados[:limite],'total':len(encontrados)}

def asignar_canal_sling_a_tarjeta(equipo_o_id,canal,numero=0):
    encontrados=buscar_canal_sling(canal)
    opciones=encontrados.get('canales',[])
    if not opciones:return {'estado':'CANAL_NO_ENCONTRADO','busqueda':canal}
    if len(opciones)>1 and not numero:
        return {'estado':'ELEGIR_CANAL','equipo_o_id':equipo_o_id,'busqueda':canal,
                'opciones':[{'numero':i+1,'canal':c['nombre']} for i,c in enumerate(opciones)]}
    if numero and not 1<=int(numero)<=len(opciones):return {'estado':'OPCION_INVALIDA'}
    elegido=opciones[int(numero)-1] if numero else opciones[0]
    resultado=forzar_enlace_futbol(equipo_o_id,elegido['url'])
    resultado['canal_sling']=elegido['nombre']
    return resultado
