
    {Ri                     b   d Z ddlZddlZddlZddlZddlZddlZddlmZmZm	Z	 ej                  j                  dej                  j                  ej                  j                  e                   ddlmZ dZdZddd	d
ddddddddddddZg dZd Zd Zd ZddZd Zedk(  r e        yy)z
Ingest Upcoming Game Schedules
Creates SportsGame records for upcoming games from The Odds API.
This ensures we have games to match odds against.

Run: Every 4 hours
    N)datetimetimezone	timedelta)normalize_to_fullg      ?zhttps://api.the-odds-api.com/v4basketball_nbaamericanfootball_nflbaseball_mlbicehockey_nhlamericanfootball_ncaafbasketball_ncaabsoccer_usa_mlsmma_mixed_martial_arts
soccer_eplsoccer_spain_la_ligasoccer_italy_serie_asoccer_germany_bundesligasoccer_france_ligue_onesoccer_uefa_champs_leaguesoccer_uefa_europa_league)nbanflmlbnhlncaafncaabmlsmmaepllaligaseriea
bundesligaligue1ucluel)r   r   r   r   r   r   r   r   r    r!   r"   r   c                     dt         j                  j                  t         j                  j                  t              dd      g} | D ]s  }	 t        |d      5 }|D ]U  }|j                  d      s|j                  dd      d   j                         j                  d      d	   c cd d d        c S  	 d d d        u t         j                  j                  d
d      j                  d      d	   S # 1 sw Y   =xY w# t        $ r Y w xY w)N/var/www/html/eventheodds/.env...envrzSPORTS_DATABASE_URL==   ?r   SPORTS_DATABASE_URL )ospathjoindirname__file__open
startswithsplitstripFileNotFoundErrorenvironget	env_pathsenv_pathflines       $scripts/ingest_upcoming_schedules.pyload_db_urlrA   0   s    (
RWW__X.f=I  	h$ K KD'=>#zz#q1!4::<BB3GJJK KKK ::>>/4::3?BBK K ! 		s<   C;C//6C/%	C;1C/3C;/C8	4C;;	DDc                     dt         j                  j                  t         j                  j                  t              dd      g} | D ]a  }	 t        |d      5 }|D ]C  }|j                  d      s|j                  dd      d   j                         c cd d d        c S  	 d d d        c y # 1 sw Y   xY w# t        $ r Y |w xY w)Nr&   r'   r(   r)   zTHE_ODDS_API_KEY=r*   r+   )
r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r;   s       r@   load_api_keyrC   @   s    (
RWW__X.f=I  	h$ = =D':;#zz#q1!4::<<= === = = ! 		s<   B8B,/$B,	B8B,!B8,B5	1B88	CCc                    t               }|st        d       g S t         d|  d}|dd}	 t        j                  ||d      }|j
                  dk(  rt        d	       g S |j
                  d
k(  rt        d|         g S |j
                  dk7  rt        d|j
                          g S |j                         }t        dt        |       d       |S # t        $ r}t        d|        g cY d}~S d}~ww xY w)zLFetch upcoming events from The Odds API (events only, no odds to save quota)zNo API key foundz/sports/z/eventsiso)apiKey
dateFormat   )paramstimeouti  z  Invalid API keyi  z  No events for    z
  Status: z  Found z upcoming eventsz	  Error: N)	rC   printODDS_API_BASErequestsr:   status_codejsonlen	Exception)	sport_keyapi_keyurlrI   respdataes          r@   fetch_upcoming_eventsrY   P   s   nG !	 O8I;g
6CF
||C;s"%&Is"$YK01Is"Jt//012Iyy{T#345 	!o	s/   3C  C ?(C ()C 	C5C0*C50C5c                    t               }|st        d      t        j                  |      }|j	                         }	 |j                  d       |j                          | xs t        }d}d}|D ]  }t        j                  |      }	|	st        d|        *t        d|j                          d       t        |	      }
|
D ]  }|j                  d	d
      }|j                  dd
      }|j                  dd
      }|j                  dd
      }|r|sP	 t        j                   |j#                  dd            }t+        ||      xs |}t+        ||      xs |}|j,                  dk\  r|j.                  n|j.                  dz
  }	 |j                  d||||||f       |j1                         }|r|d   r|dz  }n|dz  } |j                          t        d|j                          dt3        |
       d       ||d   k7  st5        j6                  t8                |j;                          |j;                          ||dS # t        $ r)}t        d|        |j                          Y d}~d}~ww xY w#  t        j$                  t&        j(                        }Y hxY w# t        $ r)}t        d|        |j                          Y d}~d}~ww xY w)z4Ingest upcoming game schedules into SportsGame tablezSPORTS_DATABASE_URL not setz
            CREATE UNIQUE INDEX IF NOT EXISTS "SportsGame_league_externalGameId_idx"
            ON "SportsGame" (league, "externalGameId")
            WHERE "externalGameId" IS NOT NULL
        zNote: Index may already exist: Nr   zUnknown league: z

Fetching z schedule...idr.   commence_time	home_team	away_teamZz+00:00   r+   a  
                    INSERT INTO "SportsGame" (
                        league, season, "externalGameId", "gameDate", "homeTeam", "awayTeam",
                        status, "createdAt", "updatedAt"
                    )
                    VALUES (%s, %s, %s, %s, %s, %s, 'scheduled', NOW(), NOW())
                    ON CONFLICT (league, "externalGameId")
                    DO UPDATE SET
                        "gameDate" = EXCLUDED."gameDate",
                        "homeTeam" = EXCLUDED."homeTeam",
                        "awayTeam" = EXCLUDED."awayTeam",
                        "updatedAt" = NOW()
                    RETURNING (xmax = 0) AS inserted
                z  Error inserting game: z  z: z events processed)addedupdated)rA   RuntimeErrorpsycopg2connectcursorexecutecommitrR   rL   rollbackPRIORITY_LEAGUESSPORTSr:   upperrY   r   fromisoformatreplacenowr   utcr   monthyearfetchonerQ   timesleepAPI_RATE_LIMIT_DELAYclose)leaguesdb_urlconncurrX   target_leaguestotal_addedtotal_updatedleaguerS   eventseventevent_idr\   r]   r^   	game_datehome_abbrevaway_abbrevseason_yearresults                        r@   ingest_schedulesr   r   s   ]F899F#D
++-C	  	
 	
 0 0NKM  >-JJv&	$VH-.FLLN+<89&y1 .	 Eyyr*H!IIor:M		+r2I		+r2II7$22=3H3Hh3WX	
 ,Iv>K)K+Iv>K)K -6OOq,@)..innWXFXK   k8Y[Y[ fQi1$K!Q&MU.	 ` 	6<<>""S[M1BCD ^B''JJ+,}>-@ IIKJJL ];;W  /s3487$LL6	@   045 s;   !I %I9:J$	I6I11I69%J!$	K-KKc                      t        j                  d      } | j                  dt        d       | j	                         }d }|j
                  rD|j
                  j                  d      D cg c]   }|j                         j                         " }}t        d       t        d       t        d	t        j                  t        j                        j                                 t        d       	 t        |
      }t        dd        t        d       t        d|d           t        d|d           t        d       y c c}w # t         $ r,}t        d|        dd l}|j%                          Y d }~y d }~ww xY w)Nz0Ingest upcoming game schedules from The Odds API)descriptionz	--leaguesz5Comma-separated list of leagues (e.g., nba,nfl,ncaab))typehelp,z<============================================================zINGEST UPCOMING GAME SCHEDULESzTime: )ry   
zRESULTS:z  New games added:    rb   z  Existing updated:   rc   zERROR: r   )argparseArgumentParseradd_argumentstr
parse_argsry   r6   r7   lowerrL   r   rp   r   rq   	isoformatr   rR   	traceback	print_exc)parserargsry   lr   rX   r   s          r@   mainr      s>   $$1cdF
#4klDG||.2ll.@.@.EF1779??$FF	(O	
*+	F8<<-779:
;<	(O
!'26(m&vg&789&vi'8&9:;h G  sms   *%E0AE 	E="E88E=__main__)N)__doc__rN   re   r/   sysru   r   r   r   r   r0   insertr2   abspathr3   
team_namesr   rw   rM   rl   rk   rA   rC   rY   r   r   __name__     r@   <module>r      s      	 
   2 2 277??277??8#<= > (  1 !%#$$-'&&
& | C  D\<~6 zF r   