
    Ni                     ^   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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eiZdd	d
ddddddddddddZd Zd Zd Zd Zd Zd Zd Zedk(  r e        yy)z
Fetch upcoming & recent schedules from TheSportsDB v2 for priority leagues.
Upserts into SportsGame (deduplicated by externalGameId).

Cron: 0 */2 * * * (every 2 hours)
    N)datetimetimezone)normalize_to_full428892z'https://www.thesportsdb.com/api/v2/jsonz	X-API-KEY)nbaNBA)nflNFL)nhlNHL)mlbMLB)ncaabNCAAB)ncaafNCAAF)eplzEnglish Premier League)laligazSpanish La Liga)
bundesligazGerman Bundesliga)serieazItalian Serie A)ligue1zFrench Ligue 1)mlszAmerican MLS)uclzUEFA Champions League)ufcUFC)43874391438044244607447943284335433143324334434644804443c                     t        dd      5 } | D ]b  }|j                  d      s|j                  dd      d   j                         j                  d      j                  d      d   c cd d d        S  	 d d d        y	# 1 sw Y   y	xY w)
Nz/var/www/html/eventheodds/.envrzSPORTS_DATABASE_URL==   "?r    )open
startswithsplitstrip)flines     scripts/fetch_tsdb_schedules.pyload_db_urlr8   '   s    	.	4 N 	ND56zz#q)!,224::3?EEcJ1MMN N	NN 	N s   A?AA?4A??Bc           	      B   t          d| d|  }	 t        j                  |t        d      }|j                  dk7  rg S |j                         }|j                  d      xs |j                  d      xs g S # t        $ r }t        d| d	|  d
|        g cY d}~S d}~ww xY w)z-Fetch next or previous schedule for a league.z
/schedule/z/league/   )headerstimeout   scheduleeventsz  Error fetching schedule//z: N)BASErequestsgetHEADERSstatus_codejson	Exceptionprint)	league_id	directionurlrespdataes         r7   fetch_schedulerO   /   s    F*YKx	{
;C||C"=s"Iyy{xx
#?txx'9?R? *9+QykA3GH	s"   ,A5 7A5 5	B>BBBc                 J    | y 	 t        |       S # t        t        f$ r Y y w xY wN)int
ValueError	TypeErrorvs    r7   _intrW   =   s/    y1v	"    
 ""c                 J    | y 	 t        |       S # t        t        f$ r Y y w xY wrQ   )floatrS   rT   rU   s    r7   _floatr[   F   s/    yQx	" rX   c                 L   | j                  dd      }|s@| j                  dd      }|rt        |dd       S t        j                         j                  S 	 t        |j                  d      d         S # t        t        f$ r! t        j                         j                  cY S w xY w)zExtract season year from event.	strSeasonr0   	dateEventN   -r   )rC   rR   r   nowyearr3   rS   
IndexError)eventsdates      r7   parse_seasonrg   O   s    		+r"Ayyb)tBQx= ||~"""#1773<?##
# #||~"""#s   A3 3-B#"B#c                    |syt        j                  t        j                        }d}| j	                         }|D ]o  }|j                  dd      }|sd| }|j                  dd      }	|j                  d      xs |j                  d      xs d}
|
rt        |
      d	k\  r|	 d
|
d d  }n|	 d}t        |j                  d      xs |j                  dd      |      }t        |j                  d      xs d|      }t        |j                  d            }t        |j                  d            }|j                  d      xs |j                  d      xs d}||d}n|dv rd}t        |      }|j                  d|||||||||t        j                  |      ||f       |dz  }r | j                          |S )Nr   idEventr0   tsdb_r^   strTimestrTimeLocalz00:00:00       z	 00:00:00strHomeTeamstrEventUnknownstrAwayTeamTBDintHomeScoreintAwayScore	strStatusstrPostponedfinal)NSr0   	scheduleda3  
            INSERT INTO "SportsGame" (
                league, season, "gameDate", "homeTeam", "awayTeam",
                "externalGameId", "homeScore", "awayScore", status, raw,
                "createdAt", "updatedAt"
            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
            ON CONFLICT (league, "externalGameId") DO UPDATE SET
                "homeScore" = COALESCE(EXCLUDED."homeScore", "SportsGame"."homeScore"),
                "awayScore" = COALESCE(EXCLUDED."awayScore", "SportsGame"."awayScore"),
                status = CASE WHEN EXCLUDED.status = 'final' THEN 'final' ELSE "SportsGame".status END,
                raw = EXCLUDED.raw,
                "updatedAt" = EXCLUDED."updatedAt"
            WHERE EXCLUDED."homeScore" IS NOT NULL OR "SportsGame"."homeScore" IS NULL
        r-   )r   ra   r   utccursorrC   lenr   rW   rg   executerF   dumpscommit)connr?   league_codera   insertedcurevevent_idext_iddate_strtime_str	game_datehomeaway
home_score
away_scorestatusseasons                     r7   upsert_gamesr   ^   s   
,,x||
$CH
++-C +66)R(
#66+r*66)$L~(>L*H*#*Ahrl^4I#*I.I !6!W"&&Y:WYde !6!?%M"&&01
"&&01
$D~(>D"!j&<Fz! Fb!  D$J
FJJrNC
	$ 	AW+Z 	KKMO    c                  p   t               } | st        d       y t        j                  |       }d}t        j                         D ]Q  \  }\  }}dD ]D  }t        ||      }|st        |||      }t        d| d| dt        |       d| d	       ||z  }F S |j                          t        d	| d
       y )NzERROR: No SPORTS_DATABASE_URLr   )nextpreviousz  z (z): z	 events, z	 upsertedzTOTAL: z games upserted)
r8   rH   psycopg2connectPRIORITY_LEAGUESitemsrO   r   r~   close)	db_urlr   totalrI   codenamerJ   r?   ns	            r7   mainr      s    ]F-.F#DE#3#9#9#; 	<D$- 	I#Iy9F vt44&9+SVYqcST
	 	JJL	GE7/
*+r   __main__)__doc__ossysrF   rB   r   r   r   pathinsertdirnameabspath__file__
team_namesr   API_KEYrA   rD   r   r8   rO   rW   r[   rg   r   r   __name__ r   r7   <module>r      s    
 
    ' 277??277??8#<= > (
0
  -)/)(#, $#5p,* zF r   