
    ,ii:                        d Z ddlZddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
 ddlZddlmZ  eej                            ej                            e          dd                      ej        ej        d	            ej        e          Zej                            ej                            e          dd
          Z ej        ed            G d d          Zd Zedk    r e             dS dS )a   
BET.CUTTALO.COM - FOOTBALL-DATA.ORG API COLLECTOR
Usa l'API ufficiale di football-data.org per:
- Partite programmate in tempo reale
- Risultati live
- Classifiche aggiornate
- Statistiche dettagliate

API Key: Free tier (10 req/min, top 5 + altre leghe)
    N)datetime	timedelta)DictListOptional)load_dotenvz..z.envz)%(asctime)s - %(levelname)s - %(message)s)levelformatdataT)exist_okc                      e Zd ZdZdZ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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*d+d,ddd-d.d/dd0ddd1dd2ZdPd4efd5Zd6 ZdPd7ed8e	d9e
e	         fd:Zd9ee	         fd;Z	 	 dQd<ed=ed>ed?ed9ee	         f
d@ZdRdBed9e	eee	         f         fdCZd9ee	         fdDZdSd<edFed9ee	         fdGZd<ed9e	fdHZdIe	dJedKe	d9e
e	         fdLZd9e	fdMZdSdFed9e	fdNZd9e	fdOZd3S )TFootballDataAPIzi
    Client per football-data.org API
    Free tier: 10 chiamate/min, molte competizioni disponibili
    z https://api.football-data.org/v4zPremier LeagueEnglandu   🏴󠁧󠁢󠁥󠁮󠁧󠁿E0)namecountryflagcodezLa LigaSpainu   🇪🇸SP1zSerie AItalyu   🇮🇹I1
BundesligaGermanyu   🇩🇪D1zLigue 1Franceu   🇫🇷F1zChampions LeagueEuropeu   🏆CLzEuropa LeagueELzEuropean Championshipu   🇪🇺EUROz	World CupWorldu   🌍WCzPrimeira LigaPortugalu   🇵🇹P1
EredivisieNetherlandsu   🇳🇱N1Brazilu   🇧🇷BRAChampionshipE1)PLPDSABL1FL1r   r    ECr#   PPLDEDBSAELCNapi_keyc                     |pt          j        d          | _        | j        st          d          t	          j                    | _        | j        j                            d| j        i           d| _	        d | _
        d S )NFOOTBALL_DATA_API_KEYz&FOOTBALL_DATA_API_KEY non configurata!zX-Auth-Tokenr   )osgetenvr7   
ValueErrorrequestsSessionsessionheadersupdaterequest_countlast_request)selfr7   s     5/var/www/html/bet.cuttalo.com/ml/football_data_api.py__init__zFootballDataAPI.__init__?   s    D"),C"D"D| 	GEFFF'))##DL%
 	 	 	      c                     | j         rJt          j                    | j         z
                                  }|dk     rt	          j        d|z
             t          j                    | _         | xj        dz  c_        dS )zRispetta rate limit: 10 req/min      N)rC   r   nowtotal_secondstimesleeprB   )rD   elapseds     rE   _rate_limitzFootballDataAPI._rate_limitL   sq     	(|~~(99HHJJG{{
1w;'''$LNNarG   endpointparamsreturnc                    |                                   | j         | }	 | j                            ||d          }|j        dk    rDt
                              d           t          j        d           | 	                    ||          S |
                                 |                                S # t          j        j        $ r(}t
                              d|            Y d}~dS d}~ww xY w)zGET request con rate limiting   )rR   timeouti  z+Rate limit raggiunto, attendo 60 secondi...<   zErrore API: N)rP   BASE_URLr?   getstatus_codeloggerwarningrM   rN   _getraise_for_statusjsonr=   
exceptionsRequestExceptionerror)rD   rQ   rR   urlresponsees         rE   r]   zFootballDataAPI._getV   s    ***	|''FB'GGH#s**LMMM
2yy6222%%'''==??""3 	 	 	LL+++,,,44444	s   A+B5 'B5 5C1	C,,C1c                 `    |                      d          }|r|                    dg           S g S )z'Lista tutte le competizioni disponibiliz/competitionscompetitionsr]   rY   rD   r   s     rE   get_competitionsz FootballDataAPI.get_competitionsj   s4    yy)) 	088NB///	rG   competition	date_fromdate_tostatusc                     |rd| d}nd}i }|r||d<   |r||d<   |r||d<   |                      ||          }|r|                    dg           S g S )a  
        Ottieni partite

        Args:
            competition: Codice competizione (es. 'PL', 'CL')
            date_from: Data inizio (YYYY-MM-DD)
            date_to: Data fine (YYYY-MM-DD)
            status: 'SCHEDULED', 'LIVE', 'FINISHED', etc.
        /competitions//matchesdateFromdateTorn   matchesrh   )rD   rk   rl   rm   rn   rQ   rR   r   s           rE   get_matcheszFootballDataAPI.get_matchesq   s      	"====HH!H 	+!*F: 	'&F8 	&%F8yy6** 	+88Ir***	rG      daysc                    t          j                                        d          }t          j                    t          |          z                       d          }i }| j                                        D ]\  }}t                              d|d          d           |                     |||d          }|rng }|D ]0}	| 	                    |	||          }
|
r|
                    |
           1|r6|||d         <   t                              d	t          |           d
           t                              d           |S )z
        Ottieni tutte le partite programmate per i prossimi X giorni

        Returns:
            Dict con competizione -> lista partite
        %Y-%m-%drw   z	Fetching r   ...	SCHEDULEDrk   rl   rm   rn   r     -> z partite trovatez  -> Nessuna partita)r   rK   strftimer   COMPETITIONSitemsr[   inforu   _format_matchappendlen)rD   rw   todayfutureall_matches	comp_code	comp_infort   	formattedmfixtures              rE   get_upcoming_matchesz$FootballDataAPI.get_upcoming_matches   sb    ''
33,..9$#7#7#77AA*MM$($5$;$;$=$= 	5 	5 IyKK:If$5:::;;;&&%"	 '  G  5	  2 2A"00IyIIG 2!((111 J5>K	& 12KK HI H H HIII34444rG   c                 f    |                      dddi          }|r|                    dg           S g S )zOttieni partite in corsorq   rn   zLIVE,IN_PLAYrt   rh   ri   s     rE   get_live_matchesz FootballDataAPI.get_live_matches   s;    yyh%?@@ 	+88Ir***	rG      	days_backc                     t          j                    t          |          z
                      d          }t          j                                        d          }|                     |||d          S )z Ottieni risultati partite finiterz   ry   FINISHEDr}   )r   rK   r   r   ru   )rD   rk   r   rl   rm   s        rE   get_finished_matchesz$FootballDataAPI.get_finished_matches   sm    \^^iY&?&?&??II*UU	,..))*55#	   
 
 	
rG   c                 @    |                      d| d          }|r|S i S )zOttieni classificarp   z
/standings)r]   )rD   rk   r   s      rE   get_standingszFootballDataAPI.get_standings   s1    yyA+AAABB 	K	rG   matchr   r   c                 X   	 |                     dd          }|rSt          j        |                    dd                    }|                    d          }|                    d          }nd}d}|                     di           }|                     di           }	i d	|d
          d|                     d	           d|                     d	          d|d|d|d|                     d          p|                     dd          d|	                     d          p|	                     dd          d|                     d	          d|	                     d	          d|d
         d|d|d         d|d         d|d         d|                     d          d|                     d          d|                     d          |                     d          |                     d           d!S # t
          $ r(}
t                              d"|
            Y d#}
~
d#S d#}
~
ww xY w)$z'Formatta una partita nel nostro formatoutcDate Zz+00:00ry   z%H:%MhomeTeamawayTeamidr   _api_iddaterM   r   	home_team	shortNamer   TBD	away_teamhome_team_idaway_team_idleagueleague_codeleague_namer   r   matchdaystagegrouprn   venue)rn   r   zErrore formattazione match: N)rY   r   fromisoformatreplacer   	Exceptionr[   rb   )rD   r   r   r   utc_datedtdate_strtime_strr   r   re   s              rE   r   zFootballDataAPI._format_match   s   $	yyB//H +H,<,<S(,K,KLL;;z22;;w//		*b11I		*b11I6*>>UYYt__>>%))D//  	
 H Y]];77W9==QV;W;W Y]];77W9==QV;W;W 	d 3 3 	d 3 3 )F+ y y0 9Y/ 	&) EIIj11  7++!" 7++#$  ))H--7++'   *  	 	 	LL;;;<<<44444	s   G4G7 7
H)H$$H)c                    t                               d           t                               d           t                               d           |                     d          }t          j                                                    d|t          d |                                D                       t          |          d}t          j
                            t          d          }t          |d	d
          5 }t          j        ||dd           ddd           n# 1 swxY w Y   t                               d|d          d|d          d           t                               d|            |S )z4Raccoglie tutte le fixtures da tutte le competizioni<============================================================z&RACCOLTA FIXTURES DA FOOTBALL-DATA.ORGrU   rz   zfootball-data.orgc              3   4   K   | ]}t          |          V  d S Nr   ).0fs     rE   	<genexpr>z7FootballDataAPI.collect_all_fixtures.<locals>.<genexpr>  s(      !H!HQ#a&&!H!H!H!H!H!HrG   )generated_atsourcefixtures_by_leaguetotal_fixturescompetitions_countzapi_fixtures.jsonwutf-8encodingF   ensure_asciiindentN	
Totale: r   z fixtures da r   z competizionizSalvato in: )r[   r   r   r   rK   	isoformatsumvaluesr   r:   pathjoinDATA_DIRopenr_   dump)rD   all_fixturesoutputoutput_filer   s        rE   collect_all_fixturesz$FootballDataAPI.collect_all_fixtures   s   H<===H00b099 %LNN4466)".!!H!H,2E2E2G2G!H!H!HHH"%l"3"3
 
 gll8-@AA+sW555 	?IfaeA>>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	s(8!9ssOcHdsssttt0;00111s   =D""D&)D&c                 `   t                               d           t                               d| d           t                               d           i }| j                                        D ]\  }}t                               d|d          d           |                     ||          }|rg }|D ]b}|                    d          |                    dd	          d
d         |                    di                               dd	          |                    di                               dd	          |                    di                               di                               d          |                    di                               di                               d          |d         |                    d          d}|d         }	|d         }
|	|
|	|
k    rd|d<   n|	|
k     rd|d<   nd|d<   |                    |           d|||d         <   t                               dt          |           d           t          j	                    
                                |t          d |                                D                       d}t          j                            t           d           }t#          |d!d"#          5 }t%          j        ||d$d%&           d
d
d
           n# 1 swxY w Y   t                               d'|d(          d           |S ))z3Raccoglie risultati recenti per verifica predizionir   zRACCOLTA RISULTATI (ultimi z giorni)zFetching risultati r   r{   r   r   r   N
   r   r   r   scorefullTimehomeawayr   rn   )r   r   r   r   
home_goals
away_goalsr   rn   r   r   HresultADr~   z
 risultatic              3   4   K   | ]}t          |          V  d S r   r   )r   rs     rE   r   z2FootballDataAPI.collect_results.<locals>.<genexpr>?  s(       F FAQ F F F F F FrG   )r   results_by_leaguetotal_resultszapi_results.jsonr   r   r   Fr   r   r   r   )r[   r   r   r   r   rY   r   r   r   rK   r   r   r   r:   r   r   r   r   r_   r   )rD   r   all_resultsr   r   rt   r   r   r   hgagr   r   r   s                 rE   collect_resultszFootballDataAPI.collect_results  s[   HE)EEEFFFH$($5$;$;$=$= !	@ !	@ IyKKDi.?DDDEEE//	9EEG @	  - -AeeDkk !i 4 4SbS 9%&UU:r%:%:%>%>{B%O%O%&UU:r%:%:%>%>{B%O%O&'eeGR&8&8&<&<Z&L&L&P&PQW&X&X&'eeGR&8&8&<&<Z&L&L&P&PQW&X&X"+F"3"#%%//	 	F  -B-B~".77/2F8,,"WW/2F8,,/2F8,$$V,,,,1:If-.>C	NN>>>??? %LNN4466!,  F F1C1C1E1E F F FFF
 
 gll8-?@@+sW555 	?IfaeA>>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	D!8DDDEEEs   K??LLc                    t                               d           t                               d           t                               d           i }| j                                        D ]\  }}|dv rt                               d|d          d           |                     |          }|rd|v rg }|                    dg           D ]U}|                    d          d	k    r8|                    d
g           D ] }|                    d          |                    di                               dd          |                    di                               d          |                    d          |                    d          |                    d          |                    d          |                    d          |                    d          |                    d          |                    d          d}|                    |           "W|||d         <   t                               dt          |           d           t          j	                    
                                |d}	t          j                            t          d          }
t          |
dd           5 }t!          j        |	|d!d"#           d$d$d$           n# 1 swxY w Y   |	S )%z'Raccoglie classifiche di tutte le legher   zRACCOLTA CLASSIFICHE)r   r    r2   r#   zFetching classifica r   r{   	standingstypeTOTALtablepositionteamr   r   r   playedGameswondrawlostgoalsForgoalsAgainstgoalDifferencepoints)r   r   team_idplayedr   drawnr   	goals_forgoals_against	goal_diffr   r   r~   z squadre)r   standings_by_leaguezapi_standings.jsonr   r   r   Fr   r   N)r[   r   r   r   r   rY   r   r   r   rK   r   r:   r   r   r   r   r_   r   )rD   all_standingsr   r   r   r   r   entry	team_datar   r   r   s               rE   collect_standingsz!FootballDataAPI.collect_standingsI  s   H*+++H$($5$;$;$=$= 	> 	> Iy444KKEy/@EEEFFF**955I >[I55	&]];;; 8 8Eyy((G33%*YYw%;%; 8 8E,1IIj,A,A(-		&"(=(=(A(A+r(R(R+099VR+@+@+D+DT+J+J*/))M*B*B',yy'7'7).6):):(-		&(9(9-2YYz-B-B16>1J1J-2YY7G-H-H*/))H*=*=) )I &,,Y77773<i/0<C	NN<<<=== %LNN4466#0
 

 gll8-ABB+sW555 	?IfaeA>>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? s   <K!!K%(K%r   )NNNN)rv   )r   )__name__
__module____qualname____doc__rX   r   strrF   rP   r   r   r]   r   rj   ru   intr   r   r   r   r   r   r   r   rG   rE   r   r   !   s        
 2H
 (IGeostt WjRWXX WjRVWW$JX\]]!h
TXYY *hX\]]&8VUYZZ.8Zaghh"wPTUU (J
\`aa$
\`aa!h
TYZZ&9Fdnrss% L*! ! ! ! ! !      S $ (4.    ($t*     EI6: s c 03?CDz   :$ $ $d3T
?6K $ $ $ $L$t*    

 

 

 

DQUJ 

 

 

 

     &4 &C &D &XVZ^ & & & &Pd    47 7 7T 7 7 7 7r24 2 2 2 2 2 2rG   r   c                     	 t                      } |                                  |                     d           |                                  t                              d           t                              d           t                              d           dS # t          $ rB}t                              d|            t                              d           Y d}~dS d}~ww xY w)	zEsegue raccolta completar   )r   z=
============================================================zRACCOLTA COMPLETATA!r   zErrore configurazione: z<Assicurati che FOOTBALL_DATA_API_KEY sia configurata in .envN)r   r   r   r  r[   r   r<   rb   )apire   s     rE   mainr  ~  s    U 	  """a(((O$$$*+++H U U U2q22333STTTTTTTTTUs   BB 
C*(7C%%C*__main__)r
  r=   r_   r:   rM   r   r   typingr   r   r   loggingdotenvr   r   r   dirname__file__basicConfigINFO	getLoggerr  r[   r   makedirsr   r  r  rG   rE   <module>r     s  	 	   				  ( ( ( ( ( ( ( ( ' ' ' ' ' ' ' ' ' '        BGLL22D&AA B B B  ',/Z [ [ [ [		8	$	$7<<114@@ Ht $ $ $ $Z Z Z Z Z Z Z Zz
U U U& zDFFFFF rG   