"""Hermes Football V4: orden natural, búsqueda y asignación controlada.
Solo fútbol, coincidencia EPG+O11 única, sin sobrescribir manuales.
"""
import re,sqlite3
from datetime import datetime,timezone
from hermes_football_v3d import preparar_asignacion_futbol,DB,PENDING
from hermes_football_links_v3 import set_automatic
from hermes_football_v3b_aprobar import check_once
import json

def _normalize(s):
    import unicodedata
    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).strip()

def buscar_y_asignar_partido(equipo):
    if not isinstance(equipo,str) or not 2<=len(equipo.strip())<=90:
        return {'estado':'SOLICITUD_INVALIDA'}
    term=_normalize(equipo)
    with sqlite3.connect('file:'+DB+'?mode=ro',uri=True) as db:
        db.row_factory=sqlite3.Row
        events=[dict(x) for x in db.execute('SELECT id,home,away,starts_utc,local_day FROM events ORDER BY starts_utc DESC LIMIT 150')]
    matches=[e for e in events if term in _normalize(e['home']).split() or term in _normalize(e['away']).split()
             or term==_normalize(e['home']) or term==_normalize(e['away'])]
    if not matches:
        return {'estado':'SIN_PARTIDO','equipo':equipo}
    # Preferir el partido del día; si hay más de uno en ese día, no adivinar.
    from datetime import datetime
    import pytz
    today=datetime.now(pytz.timezone('America/Tijuana')).date().isoformat()
    today_matches=[e for e in matches if e['local_day']==today]
    if len(today_matches)==1:
        event=today_matches[0]
    elif len(matches)==1:
        event=matches[0]
    else:
        return {'estado':'VARIOS_PARTIDOS','partidos':[{'id':e['id'],'local':e['home'],'visitante':e['away'],'fecha':e['local_day']} for e in matches[:8]]}
    proposal=preparar_asignacion_futbol(event['id'])
    if proposal.get('estado')!='PROPUESTA_PENDIENTE':
        return proposal
    ticket=proposal['ticket']
    path=PENDING/(ticket+'.json')
    payload=json.loads(path.read_text(encoding='utf-8'))
    # No se inventa una confirmación pública: este modo publica solamente
    # cuando EPG+O11 coinciden, reportando la comprobación pública pendiente.
    evidence={'estado':'CATALOGO_UNICO','epg_canal':payload['epg_canal'],
              'diferencia_minutos':payload['diferencia_minutos'],
              'nota':'EPG Sling y catálogo O11 coinciden; fuente pública independiente pendiente'}
    saved=set_automatic(event['id'],payload['url'],payload['epg_canal'],evidence)
    if not saved.get('saved'):
        return {'estado':'NO_ASIGNADO','motivo':saved.get('reason','DESCONOCIDO'),'partido':proposal['partido']}
    status=check_once(payload['url'])
    try:path.unlink()
    except OSError:pass
    return {'estado':'ASIGNADO','partido':proposal['partido'],
            'canal':proposal['canal_catalogo'],'verificacion_http':status,
            'confirmacion_publica':'PENDIENTE','event_id':event['id'],
            'mensaje':'Asignación guardada. El estado HTTP no prueba reproducción completa. Refresca Fútbol.'}
