a
    Yºj%4  ã                   @   sr  d Z ddlZddlZddlZddlmZmZmZmZ ddl	m
Z
 ej dee
eƒjƒ¡ ddlZddlmZ e
dƒZe
dƒZdZd	d
iZg d¢ddgg d¢g d¢ddgddgddgddgg d¢ddgg d¢ddgg d¢ddgddgdœZdd d!d"d#d#d#d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d1d2d3d4d5d6d7d8d9œZd:d;„ Zdad<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdDdE„ Ze dFk�rneƒ  dS )Gug  
Daily watchlist updater â€” run at midnight via Task Scheduler.
Queries API-Football for ALL fixtures in tracked leagues, then checks
Kalshi for which ones have coverage.

All matches are added to watchlist.txt (active/uncommented) so the
live monitor tracks B365 CLV on everything. Kalshi coverage is noted
with a [K] tag.

Usage: python daily_watchlist.py
é    N)ÚdateÚ	timedeltaÚdatetimeÚtimezone)ÚPath)Úlist_matcheszE:\soccer\data\watchlist.txtz$E:\soccer\data\predictions_today.csvz!https://v3.football.api-sports.iozx-apisports-keyZ 81b487be73030f5dec980d2a1ef2c406)z12:30ú15:00ú17:30z20:00r   r	   )ú14:00ú17:00z19:45)r
   z16:15z18:30ú21:00ú19:00r   z14:30z13:30z18:00z14:45)ú16:00r   z21:15z13:00)r
   r   r   r   )ú19:30ú20:30z22:00z22:30r   r   r   )ZE0ZE1ZI1ZSP1ZF1ZD1ZD2ZN1ZP1ZSC0ZT1ZG1ZMLSZI2ZSP2zparis saint germainZbrestoisZrennesZ
strasbourgZgladbachzpreussen munsterZmunchenzdeportivo la corunazatletico madridZbetiszathletic clubzdeportivo alavesZinternazionaleZmilanZwolverhamptonzwest bromwichZ	tottenhamzmanchester cityzmanchester unitedZbenficaZsportingzlos angeles fczreal salt lakeznew york red bullsúnew york cityz	san diego)Zpsgzstade brestzstade rennaiszstrasbourg alsaceZmonchengladbachz
m'gladbachZ
mogladbachzborussia mogladbachZmunsterzbayern munichzdeportivo de la corunaZatleticoz
real betisZathleticZalavesZinterzac milanZwolvesz	west bromZspurszman cityz
man unitedzman utdz
sl benficazsporting cpzlos angeles fz	salt lakeznew yorkr   zsan diego fcc                 C   s`   ddddddddddddddddddddddddd	œ}|   ¡ }| ¡ D ]\}}| ||¡}qF|S )
NÚuÚoÚaZssÚeÚiÚcÚn)õ   Ã¼õ   Ã¶õ   Ã¤õ   ÃŸõ   Ã©õ   Ã¨õ   Ãªõ   Ã«õ   Ã¡õ   Ã õ   Ã¢õ   Ã£õ   Ã­õ   Ã¬õ   Ã®õ   Ã³õ   Ã²õ   Ã´õ   Ãµõ   Ãºõ   Ã¹õ   Ã»õ   Ã§õ   Ã±)ÚlowerÚitemsÚreplace)ÚnameZreplacementsr   ÚkÚv© r7   údaily_watchlist.pyÚ
_normalizeM   s    ù	r9   c                 C   sš  | j }d|  krdkr(n n
tdd�ntdd�}t|ƒ}dd„ t ¡ D ƒ}i }td| › d	�ƒ g }tƒ }tjt| j	| j	d
 fd�}td|› �ƒ dD �]Ê}	| t|	d� }
t
t|ƒ|
j	|
j	d
 hB ƒD �]˜}�z>tjt› d�t|
 ¡ |dœdd�}| ¡  dg ¡D �]}|d d }||v�r"�q|d d }||v �r<�q| |¡ | d¡�pTi  d¡�p`i  d¡}|dv �rŠ| |d¡d
 ||< �q|d d d }|d d d }|| }t |d d  d d!¡¡}| |¡}| ¡ | k�rè�q| d"¡}| |||||f¡ �qW nH t�yT } z.td
7 atd#|
› d$|› d%|› �ƒ W Y d&}~n
d&}~0 0 t d'¡ qÆq–|�rxtd(|› �ƒ td)t|ƒ› d*t|ƒ› d+�ƒ |S ),ztFetch all fixtures for tracked leagues from API-Football.
    Returns list of (home, away, lc, fid, kickoff_et_str).é   é   éüÿÿÿ)Zhourséûÿÿÿc                 S   s"   i | ]}t  |¡rt  |¡|“qS r7   )ÚmapsZleague_api_id©Ú.0Údr7   r7   r8   Ú
<dictcomp>k   ó    z&fetch_all_fixtures.<locals>.<dictcomp>z*  Fetching fixtures from API-Football for z...é   )Zextraz  Season years to sweep: )r   rD   ©Zdaysz	/fixtures)r   Zseasoné   )ZheadersÚparamsZtimeoutZresponseZleagueÚidZfixtureZstatusZshort)ZPSTZCANCZABDZSUSPZAWDZWOr   ZteamsÚhomer4   Úawayr   ÚZz+00:00z%H:%Mz  [fixture lookup z season=z	] Error: Ng      à?z  Skipped not-being-played: z  Found ú fixtures across z leagues)Úmonthr   r   r>   Zall_divsÚprintÚsetZseason_yearsÚ
AF_HEADERSZyearÚsortedÚrequestsÚgetÚAF_BASEZ	isoformatZjsonÚaddr   Zfromisoformatr3   Z
astimezoner   ÚstrftimeÚappendÚ	ExceptionÚ_FETCH_ERRORSÚ_timeÚsleepÚlen)Ú	game_daterM   Z	et_offsetZet_zoneZseen_leaguesZskipped_statusZresultsZ	seen_fidsZseasonsZdeltaZsearch_dateZseason_yearÚrZfixZlidÚfidÚstrI   rJ   ÚlcZutc_dtZet_dtZko_strr   r7   r7   r8   Úfetch_all_fixturesc   s^    ,
"þ


"


0rb   c           	   
   C   s˜   zZt | ƒ}tƒ }|D ]@\}}}t t|ƒt|ƒ¡}t t|ƒt|ƒ¡}| ||f¡ q|W S  ty’ } z td|› �ƒ tƒ W  Y d}~S d}~0 0 dS )zBReturn set of (home_norm, away_norm) tuples for matches on Kalshi.z#  [Kalshi] Error fetching matches: N)r   rO   ÚTEAM_ALIASESrS   r9   rU   rX   rN   )	r]   ZgamesZkalshiÚ_rI   rJ   Úhr   r   r7   r7   r8   Úbuild_kalshi_set­   s    rf   c                 C   sp   t | ƒ}t |ƒ}t ||¡}t ||¡}||f|v r8dS |D ].\}}||v sT||v r<||v sd||v r< dS q<dS )NTF)r9   rc   rS   )rI   rJ   Ú
kalshi_setre   r   ZkhZkar7   r7   r8   Ú
has_kalshi¼   s     rh   c               
   C   sÀ   t  ¡ si S zrdd l} |  t ¡}i }| ¡ D ]L\}}t| dd¡ƒ ¡  ¡ t| dd¡ƒ ¡  ¡ f}t	| dd¡ƒ||< q,|W S  t
yº } z$tdt › d|› �ƒ i W  Y d }~S d }~0 0 d S )Nr   rI   Ú rJ   ÚpAz  [predictions] Could not load z: )ÚPREDICTIONS_FÚexistsZpandasZread_csvZiterrowsÚstrrS   r1   ÚstripÚfloatrX   rN   )ZpdZdfÚresultrd   ÚrowÚkeyr   r7   r7   r8   Úload_predictionsÊ   s    
ÿrs   c                     sÔ  t  ¡ ‰ ‡ fdd„tdƒD ƒ} tdˆ › d| d › d�ƒ tƒ }dˆ › d	�d
dg}d}d}| D �]l}t|ƒ}t|ƒ}i }|D ](\}	}
}}}| |g ¡ |	|
||f¡ qz|dd|› �dt	|ƒ› dt	|ƒ› d|› �g7 }t
| ¡ ƒD ]ê}| d¡ | d|› d�¡ t
|| dd„ d�}|D ]°\}	}
}}|	 ¡ |
 ¡ f}| |d¡}t|	|
|ƒ�rPdnd}|dk�rjd|d›�nd}|�r~d|› �nd}| |	› d|
› d|› d|› |› |› |› �
¡ |�r¼|d7 }|d7 }�qqÞq\| d¡ | d¡ | d¡ t�rvz"tdd„ tjd d!� ¡ D ƒƒ}W n t�y*   d}Y n0 |dk�sJ|�rv||d" k �rvtd#t› d$|› d%|› d&t› d'�	ƒ t d¡ tjd( |¡d d!� td)|› d*| d › d+| d › d,t› d-|› d.�t�rÈd/t› d0�nd ƒ d S )1Nc                    s   g | ]}ˆ t |d � ‘qS )rE   )r   r?   ©Útodayr7   r8   Ú
<listcomp>ë   rC   zmain.<locals>.<listcomp>é   u    
=== Daily Watchlist Update â€” z (+ rD   z) ===z# Watchlist generated u2    â€” covers today + tomorrow (24h pre-KO tracking)z@# Format: home | away | league | kickoff (HH:MM ET) | fixture_idzA# [K] = Kalshi coverage available  * = model flagged (pA >= 0.31)r   ú#zDATE=z# rL   z leagues on z# [ú]c                 S   s   | d S )Nr:   r7   )Úxr7   r7   r8   Ú<lambda>  rC   zmain.<locals>.<lambda>)rr   z [K]ri   g×£p=
×Ó?z  # model pA=z.2fz | z# End of schedulec                 s   s(   | ] }d |v r|  ¡  d¡sdV  qdS )ú|rx   rD   N)ÚlstripÚ
startswith)r@   Zlnr7   r7   r8   Ú	<genexpr>&  s   ÿzmain.<locals>.<genexpr>zutf-8)Úencodingé   z
REFUSING TO WRITE: z fetch error(s) and only z fixture(s) found, against z in the current file. Keeping z
 as it is.Ú
z
Wrote z fixtures (z + z) to z (z with Kalshi coverage)z  [z fetch error(s) this run])r   ru   ÚrangerN   rs   rb   rf   Ú
setdefaultrW   r\   rQ   Úkeysr1   rS   rh   rY   ÚsumÚWATCHLIST_FÚ	read_textÚ
splitlinesrX   ÚsysÚexitZ
write_textÚjoin)ZdatesZpredictionsÚlinesZgrand_totalZgrand_kalshir]   Zfixturesrg   Z	by_leaguerI   rJ   ra   r_   ZkoZmatchesrr   rj   Zk_tagZm_tagZfid_strZ_haver7   rt   r8   ÚmainÛ   sp    

ý
ÿ
,


"

ÿÿþ

$ÿþrŽ   Ú__main__)!Ú__doc__rŠ   rR   ÚtimerZ   r   r   r   r   Úpathlibr   ÚpathÚinsertrm   Ú__file__Úparentr>   Zkalshi_liver   r‡   rk   rT   rP   ZDEFAULT_KICKOFFSrc   r9   rY   rb   rf   rh   rs   rŽ   Ú__name__r7   r7   r7   r8   Ú<module>   s„   ñâ!J[
