
    tmi 4                        d Z ddlZddlZddlmZmZmZ ddlZi dddgddd	gd
ddgdddgdddgdg ddg ddddgdddgdg ddd d!gd"d#d$gd%d&d'gd(d)d*gd+d,d-gd.d/d0gd1d2d3gi d4g d5d6g d7d8g d9d:d;d<gd=d>d?gd@g dAdBdCdDgdEg dFdGdHdIgdJg dKdLdMdNgdOg dPdQg dRdSdTdUgdVdWdXgdYddZgd[d\d]gi d^g d_d`g dadbg dcddg dedfg dgdhdidjgdkg dldmdndogdpdqdrgdsg dtdudvdwgdxg dydzg d{d|g d}d~g ddddgdg di dddgdg ddg ddddgdddgdddgdg ddg ddddgdg ddg ddddgdg ddddgdddgdd\dgdddrgi dddgdddgdddgddidgdddgdddgdddgdd dgdd#dgdg d¢dddgdddgdd&dgdddgdd/dgddvdgdg dӢi dddgdddgdddgdddgdddgdg ddddgdg ddddgdg ddddgdg ddddgdddgdddgdddgdddgg dddgddgd dgddgddgddgg dg d	d
dgg dddgg dddgddgdZd Zd Z	d Z
ddZd Zedk(  r e        yy(  u   
Sync GameOdds → SportsGame
Copies best available odds from GameOdds table into SportsGame embedded fields
Run: Every 30 minutes (after scrape_odds_api.py)
    N)datetimetimezone	timedeltazatlanta hawksatlhawkszboston celticsboscelticszbrooklyn netsbknnetszcharlotte hornetschahornetszchicago bullschibullszcleveland cavaliers)cle	cavalierscavszdallas mavericks)dal	mavericksmavszdenver nuggetsdennuggetszdetroit pistonsdetpistonszgolden state warriors)gswgswarriorszhouston rocketshourocketszindiana pacersindpacerszlos angeles clipperslacclipperszlos angeles lakerslallakerszmemphis grizzliesmem	grizzliesz
miami heatmiaheatzmilwaukee bucksmilbuckszminnesota timberwolves)mintimberwolveswolvesznew orleans pelicans)nopnopelicansznew york knicks)nyknyknickszoklahoma city thunderokcthunderzorlando magicorlmagiczphiladelphia 76ers)phi76erssixerszphoenix sunsphxsunszportland trail blazers)porblazerstrailblazerszsacramento kingssackingszsan antonio spurs)sassaspursztoronto raptorstorraptorsz	utah jazz)utautahjazzzwashington wizards)waswshwizardszanaheim ducksanaduckszarizona coyotesaricoyoteszboston bruinsbruinszbuffalo sabresbufsabreszcalgary flames)cgycalflameszcarolina hurricanes)car
hurricanescaneszchicago blackhawks)r   
blackhawksr   zcolorado avalanche)col	avalancheavszcolumbus blue jackets)cbjbluejacketsjacketszdallas starsr   starszdetroit red wings)r   redwingswingszedmonton oilersedmoilerszflorida panthersflapantherszlos angeles kings)laklarA   zminnesota wildr+   wildzmontreal canadiens)mtl	canadienshabsznashville predators)nsh	predatorspredsznew jersey devils)njdnjdevilsznew york islanders)nyi	islandersislesznew york rangersnyrrangerszottawa senators)ottsenatorssenszphiladelphia flyersr8   flyerszpittsburgh penguins)pitpenguinspenszsan jose sharks)sjssjsharkszseattle krakenseakrakenzst louis bluesstlblueszst. louis bluesztampa bay lightning)tbltb	lightningboltsztoronto maple leafs)rE   
mapleleafsleafszvancouver canucksvancanuckszvegas golden knights)vgkvegasgoldenknightsknightszwashington capitals)rK   rJ   capitalscapszwinnipeg jetswpgjetszarizona cardinals)rO   	cardinalscardszatlanta falconsfalconszbaltimore ravensbalravenszbuffalo billsbillszcarolina panthersrW   zchicago bearsbearszcincinnati bengalscinbengalszcleveland brownsr   brownszdallas cowboyscowboyszdenver broncosbroncoszdetroit lionslionszgreen bay packersgbpackerszhouston texanstexanszindianapolis coltscoltszjacksonville jaguars)jaxjaguarsjagszkansas city chiefskcchiefszlas vegas raiderslvraiderszlos angeles chargerschargerszlos angeles ramslarramszmiami dolphinsdolphinszminnesota vikingsvikingsznew england patriots)nepatriotspatsznew orleans saintsr/   saintsznew york giantsnyggiantsznew york jetsnyjzphiladelphia eagleseagleszpittsburgh steelersr}   steelerszsan francisco 49ers)sf49ersninerszseattle seahawksseahawksztampa bay buccaneers)r   
buccaneersbucsztennessee titanstentitanszwashington commanders)rJ   rK   
commandersarsenalarszaston villa)avl
astonvillavillabournemouthbou	brentfordbrezbrighton and hove albionbhabrightonburnleyburchelseache)crycrystalpalacepalaceeveevertonfulfulhamleeleedslei	leicesterliv	liverpoollutluton)mcimancitycity)munmanutdunitednew	newcastle)nfo
nottinghamforestshu	sheffield)tot	tottenhamrD   whuwesthamwolr-   )zcrystal palacer   r   zleeds unitedzleicester cityr   z
luton townzmanchester cityzmanchester unitedznewcastle unitedznottingham forestzsheffield unitedztottenham hotspurzwest ham unitedzwolverhampton wanderersc                 x   | sy| j                         j                         }t        j                  dd|      }|t        v rt        |   d   S t        j                         D ]/  \  }}||v r|d   c S |j                         d   }||k(  s*|d   c S  t        |      dk  r|S |j                         }|r|d   S |S )z0Extract normalized team identifier for matching. z\s+(fc|sc|cf|afc|united|city)$r      )lowerstripresubTEAM_ALIASESitemssplitlen)namen	full_namealiasesnicknamewordss         A/var/www/html/eventheodds/scripts/sync_game_odds_to_sportsgame.pynormalize_team_namer	     s    

A
0"a8A 	LAq!! +002 	7<1:??$R(=1: 1v{ GGIE59$1$    c                     t        |       }t        |      }||k(  ry| r| j                         nd}|r|j                         nd}||v s||v ryy)z/Check if two team names refer to the same team.Tr   F)r	  r   )team1team2n1n2t1_lowert2_lowers         r  teams_matchr     sQ    	U	#B	U	#B	Rx %u{{}2H %u{{}2H	X~x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)z"Load database URL from environmentz/var/www/html/eventheodds/.envz..z.envrzSPORTS_DATABASE_URL==   ?r   NSPORTS_DATABASE_URLr   )ospathjoindirname__file__open
startswithr   r   FileNotFoundErrorenvironget)	env_pathsenv_pathflines       r  load_db_urlr'     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                    | j                         }ddddd}t        d       |j                  d|d|d       |j                         }t        dt	        |       d       i }|D ]  }|\  }}	}
}}}}}}}}|t        |	      t        |
      t        |      f}||vr	d	d	d	d
||<   |dk(  r||   d   ||f||   d<   W|dk(  r||   d   |||f||   d<   p|dk(  sv||   d   |||   d<    t        dt	        |       d       t        d       |j                  d|d|d       |j                         }t        dt	        |       d       |D ]  }|\  }}}	}}|dxx   dz  cc<   t        |      }t        |      }|t        |	      ||f}|j                  |      }|sd|t        |	      ||f}|j                  |      }|rB|d   r|d   d   |d   d   f|d<   |d   r%|d   d   r	|d   d    nd	|d   d   |d   d   f|d<   |s|dxx   dz  cc<   d	x}}|d   r|d   \  }}d	x}x} }!|d   r|d   d   }|d   }"|s|s|"s	 |j                  d||||r| nd	|"|f       |dxx   dz  cc<   " | j                          |j                          |S # t        $ r9}#t        d| d|#        |dxx   dz  cc<   | j                          Y d	}#~#d	}#~#ww xY w)zu
    Sync odds from GameOdds to SportsGame for games within date range.
    Uses intelligent team name matching.
    r   )matchedupdatederrorscheckedzLoading GameOdds data...z
        SELECT league, DATE("gameDate") as gd, "homeTeam", "awayTeam",
               "bookmaker", "market", "lineValue", "homeOdds", "awayOdds", "overOdds", "underOdds"
        FROM "GameOdds"
        WHERE "gameDate" >= NOW() - INTERVAL 'z3 days'
        AND "gameDate" <= NOW() + INTERVAL 'zQ days'
        ORDER BY CASE WHEN "bookmaker" = 'pinnacle' THEN 0 ELSE 1 END
    zLoaded z odds recordsN)h2hspreadstotalsr-  r.  r/  zGrouped into z unique gamesz'Finding SportsGame records to update...z
        SELECT id, league, DATE("gameDate") as gd, "homeTeam", "awayTeam"
        FROM "SportsGame"
        WHERE "gameDate" >= NOW() - INTERVAL 'zN days'
        AND ("moneylineHome" IS NULL OR "oddsSource" = 'odds-api')
    zFound z games to checkr,  r     r)  aT  
                    UPDATE "SportsGame"
                    SET
                        "moneylineHome" = COALESCE(%s, "moneylineHome"),
                        "moneylineAway" = COALESCE(%s, "moneylineAway"),
                        "spreadHome" = COALESCE(%s, "spreadHome"),
                        "spreadAway" = COALESCE(%s, "spreadAway"),
                        "total" = COALESCE(%s, "total"),
                        "oddsSource" = 'odds-api',
                        "oddsUpdatedAt" = NOW(),
                        "updatedAt" = NOW()
                    WHERE id = %s
                r*  z  Error updating game z: r+  )cursorprintexecutefetchallr  strr	  r"  	Exceptionrollbackcommitclose)$connlookback_dayslookahead_dayscurstats	odds_dataodds_by_gamerowleaguegdhomeawaybookmarketr&  h_oddsa_oddsover_ounder_okeygamesgamegame_id	home_team	away_team	norm_home	norm_awayoddskey_swappedml_homeml_awaysp_valsp_homesp_awaytotales$                                       r  	sync_oddsr]     s   
 ++-Ca1CE 
$&KK .* + I	GC	N#=
12 L 
/VYSD$fdFFFGs2w 3D 9;Nt;TUl"(, NLU?|C07?(.'7Le$y \#%6y%A%I,0&&+ALi(xL$5h$?$G*.Lh'
/ 
M#l+,M
:; 
35KK .* + LLNE	F3u:,o
./ > 481Y	iA (	2	'	2	s2w	95$!3r7IyAK##K0D;#';q>4;q>"BDK	?>B9oa>PY(:':VZ'+Iq'94	?1;M'ODO iA ! ';#E{GW%)))7	?)_Q'FXf   WvVG4	$ i A% u> @ 	KKMIIKL   .wir!=>h1$ s   *J	K#.KKc                     t        d       t        d       t        dt        j                  t        j                        j                                 t        d       t               } | st        d       y 	 t        j                  |       }t        |      }t        dd        t        d       t        d|d    d	       t        d
|d    d	       t        d|d    d	       t        d|d           t        d       |j                          y # t        $ r,}t        d|        dd l}|j                          Y d }~y d }~ww xY w)Nz<============================================================u   SYNC GAMEODDS → SPORTSGAMEzTime: z$ERROR: SPORTS_DATABASE_URL not found
zRESULTS:z  Checked:  r,  z gamesz  Matched:  r)  z  Updated:  r*  z  Errors:   r+  zERROR: r   )r2  r   nowr   utc	isoformatr'  psycopg2connectr]  r9  r6  	traceback	print_exc)db_urlr:  r>  r\  re  s        r  mainrh  >  s$   	(O	
()	F8<<-779:
;<	(O]F45' $6(mU9-.f56U9-.f56U9-.f56U8_-./h

 sms   8BD 	E	"EE	__main__)   rj  )__doc__r  rc  r   r   r   r   r   r	  r  r'  r]  rh  __name__ r
  r  <module>rn     s  
 
  2 2 	zeW%z ui(z eV_	z
 %+z eW%z 7z 4z ui(z y)z 6z y)z uh'z UJ/z 5(+z  %-!z" 5&/#z$ w'%z& ?'z( 5)z* .+z, eY/-z. eW%/z0 41z2 UFO3z4 @5z6 (7z8 /9z: y);z< (=z> 3?zB eW%CzD y)EzF eX&GzH uh'IzJ .KzL 9MzN 8OzP 5QzR >SzT UG$UzV 5WzX x(YzZ 
+[z\ /]z^ ufo_z` 6azb 8czd 0ezf 7gzh 	*izj 2kzl E8,mzn 6ozp .qzr uh'szt ug&uzv w'wzx >yzz 9{z| %+}z~ Hz@ =AzB eV_CzF 6GzH y)IzJ )KzL eW%MzN %,OzP eW%QzR 5),SzT )UzV ui(WzX ui(YzZ eW%[z\ $	*]z^ uh'_z` 5'*azb 6czd 4*ezf $	*gzh UJ/izj kzl uj)mzn %+ozp 6qzr 4*szt x(uzv eV_wzx E8,yzz E:.{z| 4}z~ 
+z@ 8AzB )CzD 9EzH y!IzJ 1KzL E=)MzN %%OzP 
 3QzR y!SzT y!UzV 9y!hG$k*%'"14,8,6y) %x0szx%<C"upB zF r
  