
    %^i(                         d Z ddlZddlmZ ddlmZmZmZmZ  ed      Z	e	dz  dz  Z
e	dz  d	z  Ze	dz  d
z  ZdedefdZdee   fdZdee   fdZdedefdZd Zedk(  r e        yy)a\  Build betting/cbb_historical.json from BallDontLie ncaab games + TheOdds-derived odds snapshot.

Inputs:
- data/ncaab/games.json (scores + teams)
- data/betting/ncaab_historical.json (odds snapshot; schema varies)

Because BallDontLie ncaab odds.game_id does not match games.id on this server,
we join odds by (date, home_team, away_team) instead.
    N)Path)DictAnyOptionalTuplez/var/www/html/eventheodds/datancaabz
games.jsonbettingzncaab_historical.jsonzcbb_historical.jsonsreturnc                     dj                  | xs dj                         j                         j                               S )N  )joinstriplowersplit)r
   s    9/var/www/html/eventheodds/scripts/build_cbb_historical.pynormr      s.    88QW"OO%++-33566    c                     | y t        |       j                         }|r|j                         dv ry 	 t        |      S # t        $ r Y y w xY wN)nanan)strr   r   float	Exceptionxr
   s     r   to_floatr      sL    yAA	\)Qx s   
> 	A
	A
c                     | y t        |       j                         }|r|j                         dv ry 	 t        t	        |            S # t
        $ r Y y w xY wr   )r   r   r   intr   r   r   s     r   to_intr"   &   sQ    yAA	\)58} s   A 	AArecc           
         d| v sd| v rt        | j                  d            t        | j                  d            t        | j                  d            dt        | j                  d            t        | j                  d      t              r&| j                  d      xs i j                  d      d	S | j                  d      xs dd	S t        | j                  d      t              r| j                  d      ni }t        |j                  d
      t              r|j                  d
      ni }g d}d}|D ]  }||v s||   } n |s$|r"t        t        |j                                     }t        |t              r|t        |j                  d            t        |j                  d            t        |j                  d            dt        |j                  d            |j                  d      xs dd	S ddddddd	S )zDNormalize various odds snapshot schemas into our standard odds dict.home_mlaway_mlspreadNtotaloddssourcezthe-odds-apimoneylineHomemoneylineAway
spreadHome
spreadAway	totalLiner*   sportsbooks)fanduel
draftkingsbetmgmbovadalowvigbetonlineagbetusnone)r"   getr   
isinstancedictnextitervalues)r#   or1   	preferredchosenks         r   extract_odds_from_snapshotrD   2   s    C9+#CGGI$67#CGGI$67"3778#45!#'''"23?I#''RX/[_?`swwv,"11(;
 	
 hkgngnowgx  hK  }K
 	
 &cggfot<"A*4QUU=5I4*P!%%&VXK ZIF  ^F kd;--/01&$#FJJy$9:#FJJy$9:"6::h#78!&**W"56eeHo7
 	
  r   c                     t         j                         st        dt                t        j                  t        t                     } i }t        j                         r	 t        j                  t        t                    }|D ]  }|j                  d      xs dd d }|j                  d      xs |j                  d      }|j                  d      xs |j                  d      }|r|r|sjt        |      ||t        |      t        |      f<    	 g }d	}| D ]  }	|	j                  d
      }
|	j                  d      xs dd d }|
r|s2|	j                  d      xs i }|	j                  d      xs i }|j                  d      xs |j                  d      }|j                  d      xs |j                  d      }|r|s|	j                  d      xs d	}|	j                  d      xs d	}|d	k(  r|d	k(  r|	j                  d      }t        |t              s)t        |t              r$t        |      j                         rt        |      nt        |d d       }|j                  |t        |      t        |      f      s
d d d d d ddn|dz  }j                  d      #j                  d      t        d          d<   t!        fddD              xr j                  d      dv}||z
  }|d	kD  rdn|d	k  rdnd}|j#                  d|
 |
d||||||d t%        |      ||||z   d!d"        |j'                  d# $       t(        j*                  j-                  d%d%&       t        j.                  |t        t(        d'      d()       t1        d* |D              }t3        d+t(         d,t5        |       d-| d.| d/|r|t5        |      z  d0z  nd	d1d2       y # t        $ r Y w xY w)3NzMissing dater   
   homeTeam	home_teamawayTeam	away_teamr   idvisitor_team	full_namename
home_score
away_scoreseason   r9   r+      r.   r/   c              3   D   K   | ]  }j                  |      d u  y w)Nr:   ).0rC   r)   s     r   	<genexpr>zmain.<locals>.<genexpr>   s     s1txx{$.ss    )r,   r-   r.   r0   r*   )r9   Nhomeawaydrawzcbb-cbb)	homeScore	awayScore)winnermargintotalPoints)rL   bdl_game_idsportrF   rR   rH   rJ   scoresr)   hasRealOddsresultc                 &    | j                  dd      S )NrF   r   rV   )r   s    r   <lambda>zmain.<locals>.<lambda>   s    155+ r   )keyT)parentsexist_okw   )indentc              3   D   K   | ]  }|j                  d       sd  yw)re   rT   NrV   )rW   gs     r   rX   zmain.<locals>.<genexpr>   s     6Q}!5q6s     zWrote z games=z matched_odds=z hasRealOdds=z (d   z.1fz%))GAMESexists
SystemExitjsonloadopenODDS_SNAPSHOTr:   rD   r   r   r;   r!   r   isdigitr   anyappendboolsortOUTparentmkdirdumpsumprintlen)gamesodds_lookupsnaprrF   rY   rZ   outmatched_oddsrp   gid	home_name	away_namehsa_srR   
season_inthas_realr`   r_   realr)   s                        @r   mainr   b   s   <<>8E7+,,IId5k"E24K
	99T-01D \f+Sb1uuZ(>AEE+,>uuZ(>AEE+,>4t>XYZ>[T4:tDz:;\ CL 7eeDkf#Sb)$uu[!'Ruu^$*HH[)=TXXf-=	HH[)=TXXf-=		UU< %AeeL!&Q7saxx$.vs$;
6SV@W\_`f\g\o\o\qS[x{  }A  BD  CD  }E  yF
d9otIGH!%!%""! D AL 88L!-$((<2H2P"'\(:";!;Ds8rss  ax|  yA  yA  BJ  yK  Sa  yac!A:fqjFf

, !!$&S9>!'6"s(S
 	W7r HH+H,JJTD1IIc4C=+6#66D	F3%ws3xj|nMRVQWWYqt[_`cdg`h[hil[lz{|  ZA  AC  D  EG  		s   !B3O$ $	O10O1__main__)__doc__ru   pathlibr   typingr   r   r   r   BASErr   rx   r~   r   r   r   r   r!   r"   r<   rD   r   __name__ r   r   <module>r      s      - -,-w%y #::
Y..7C 7C 7	8E? 		# 	-D -T -`TEn zF r   