U
    éZÚj%  ã                   @   s  d Z ddlZddlZddlmZmZ ddlmZ ddlmZ dZ	e	fdd„Z
e	fd	d
„Zdd„ Zdd„ Zdd„ Ze	fdd„Ze	fdd„Ze	fdd„Ze	fdd„ZedkrþddlZe ¡ Zejddd� ejde	d� e ¡ Zejsìe d¡ eejƒ ed ƒ dS )!u¨   Hermes Football V3: almacenamiento aislado de asignaciones, Python 3.8.
No descarga streams ni altera las otras ligas. La publicaciÃ³n requiere aprobaciÃ³n explÃ­cita.
é    N)ÚdatetimeÚtimezone)ÚPath)Úurlsplitz!/var/lib/hermes-nexus/football.dbc                 C   s$   t j| dd�}t j|_| d¡ |S )Né   )ZtimeoutzPRAGMA busy_timeout=20000)Úsqlite3ÚconnectZRowZrow_factoryÚexecute©Údb_pathÚdb© r   úhermes_football_links_v3.pyr      s    
r   c              	   C   s,   t | ƒ�}| d¡ | d¡ W 5 Q R X d S )Na²  CREATE TABLE IF NOT EXISTS football_links (
            event_id TEXT PRIMARY KEY,
            automatic_url TEXT NOT NULL DEFAULT '',
            manual_url TEXT NOT NULL DEFAULT '',
            provider TEXT NOT NULL DEFAULT '',
            epg_channel TEXT NOT NULL DEFAULT '',
            evidence TEXT NOT NULL DEFAULT '',
            updated_utc TEXT NOT NULL DEFAULT '',
            FOREIGN KEY(event_id) REFERENCES events(id))züCREATE TABLE IF NOT EXISTS football_link_audit (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            event_id TEXT NOT NULL,
            action TEXT NOT NULL,
            timestamp_utc TEXT NOT NULL,
            note TEXT NOT NULL DEFAULT ''))r   r	   r
   r   r   r   Úinit   s    

	r   c                    sb   ˆ sdS t ˆ ƒdks*t‡ fdd„dD ƒƒr2tdƒ‚tˆ ƒ}|jdksV|jrV|jsV|jr^tdƒ‚ˆ S )	NÚ i   c                 3   s   | ]}|ˆ kV  qd S ©Nr   )Ú.0Úc©Úvaluer   r   Ú	<genexpr>'   s     z _validate_url.<locals>.<genexpr>z
 u   URL invÃ¡lida)ZhttpZhttpsz4Se requiere URL HTTP(S) sin credenciales incrustadas)ÚlenÚanyÚ
ValueErrorr   ZschemeZhostnameZusernameZpassword)r   Zparsedr   r   r   Ú_validate_url$   s    "r   c                 C   s   |   d|f¡ ¡ stdƒ‚d S )NzSELECT 1 FROM events WHERE id=?zEl evento no existe)r	   Úfetchoner   )r   Úevent_idr   r   r   Ú_exists.   s    r   c                   C   s   t  tj¡ ¡ S r   )r   Znowr   ZutcZ	isoformatr   r   r   r   Ú_stamp2   s    r   c              	   C   sr   t | ¡ ƒ}t|ƒ t|ƒ�@}t|| ƒ | d| |tƒ f¡ | d| |rLdndtƒ f¡ W 5 Q R X | t|ƒddœS )NzÁINSERT INTO football_links(event_id,manual_url,updated_utc)
          VALUES(?,?,?) ON CONFLICT(event_id) DO UPDATE SET
          manual_url=excluded.manual_url,updated_utc=excluded.updated_utczLINSERT INTO football_link_audit(event_id,action,timestamp_utc) VALUES(?,?,?)Z
MANUAL_SETZMANUAL_CLEART)r   ÚmanualÚsaved)r   Ústripr   r   r   r	   r   Úbool)r   Úurlr   r   r   r   r   Ú
set_manual5   s    


þÿr$   c                 C   s  t | ¡ ƒ}|stdƒ‚t|tƒr0| d¡dkr8tdƒ‚| d¡|ks^tt| dd¡ƒƒdkrftd	ƒ‚t|ƒ t	|ƒ�€}t
|| ƒ | d
| f¡ ¡ }|r¸|d r¸| dddœW  5 Q R £ S | d| |d|tj|dd�tƒ f¡ | d| dtƒ |f¡ W 5 Q R X | ddœS )Nu   URL automÃ¡tica vacÃ­aZestadoZCATALOGO_UNICOu0   La coincidencia no estÃ¡ verificada en catÃ¡logoZ	epg_canalZdiferencia_minutosiç  éx   z'Evidencia de EPG u horario insuficientez6SELECT manual_url FROM football_links WHERE event_id=?Ú
manual_urlFZMANUAL_PRIORITY)r   r    Úreasona[  INSERT INTO football_links(event_id,automatic_url,provider,epg_channel,evidence,updated_utc)
          VALUES(?,?,?,?,?,?) ON CONFLICT(event_id) DO UPDATE SET
          automatic_url=excluded.automatic_url,provider=excluded.provider,
          epg_channel=excluded.epg_channel,evidence=excluded.evidence,
          updated_utc=excluded.updated_utcÚsling)Zensure_asciizSINSERT INTO football_link_audit(event_id,action,timestamp_utc,note) VALUES(?,?,?,?)ZAUTO_SETT)r   r    )r   r!   r   Ú
isinstanceÚdictÚgetÚabsÚfloatr   r   r   r	   r   ÚjsonÚdumpsr   )r   r#   Úepg_channelZevidencer   r   Úrowr   r   r   Úset_automaticA   s(     &

ûÿr2   c              
   C   sž   t |ƒ t|ƒ�„}t|| ƒ | d| f¡ ¡ }|sJ| dddœW  5 Q R £ S |d pX|d }| t|ƒ|d rndn|d rzdnd|d	 d
œW  5 Q R £ S Q R X d S )Nz-SELECT * FROM football_links WHERE event_id=?FZnone)r   ÚassignedÚsourcer&   Úautomatic_urlr   r(   r0   )r   r3   r4   r0   )r   r   r   r	   r   r"   )r   r   r   r1   r#   r   r   r   Ú	get_linksX   s    

 þr6   c              
   C   s\   t |ƒ t|ƒ�B}t|| ƒ | d| f¡ ¡ }|rB|d pD|d ndW  5 Q R £ S Q R X dS )zbUso exclusivo del backend autenticado: nunca devolver este valor al cliente sin control de acceso.zDSELECT manual_url,automatic_url FROM football_links WHERE event_id=?r&   r5   r   N)r   r   r   r	   r   )r   r   r   r1   r   r   r   Ú
get_targetc   s
    

r7   Ú__main__z--initÚ
store_true)Úactionz--db)Údefaultz,Usa --init para crear tablas (tras respaldo)zETablas football_links y football_link_audit listas; eventos intactos.)Ú__doc__r.   r   r   r   Úpathlibr   Zurllib.parser   ZDBr   r   r   r   r   r$   r2   r6   r7   Ú__name__ÚargparseÚArgumentParserÚpÚadd_argumentÚ
parse_argsÚaÚerrorr   Úprintr   r   r   r   Ú<module>   s2   
 

