
    ^i                         d Z ddlZddlmZ ddlmZmZmZ  ed      Zedz  Z	g d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  Normalize soccer league historical files into the standard betting schema.

Handles two BallDontLie soccer game schemas:
- Schema A (nested teams): {date, home_team, visitor_team, home_score/away_score}
- Schema B (IDs): {kickoff, home_team_id, away_team_id, home_score, away_score, season}

For each league in LEAGUES:
- Input primary: data/<league>/games.json
- Input secondary: existing data/betting/<league>_historical.json (odds in various schemas)
- Output: data/betting/<league>_historical.json (standard schema)
    N)Path)DictOptionalTuplez/var/www/html/eventheodds/databetting)epl
bundesligalaligaligue1serieauclsreturnc                     dj                  | xs dj                         j                         j                               S )N  )joinstriplowersplit)r   s    D/var/www/html/eventheodds/scripts/build_soccer_leagues_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           
      
    t         j                  d      t              rXd j                  d      v sd j                  d      v r2t         j                  d      xs i       }|j                  dd       |S t	         fddD              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 )NoddsmoneylineHome	totalLinesourceunknownc              3   &   K   | ]  }|v  
 y wN ).0kr'   s     r   	<genexpr>z#extract_odds_any.<locals>.<genexpr>;   s     
D18
Ds   )home_mlaway_mlspreadtotalr4   r5   r6   r7   zthe-odds-apir*   moneylineAway
spreadHome
spreadAwayr+   r,   sportsbooks)fanduel
draftkingsbetmgmbovadalowvigbetonlineagbetusnone)

isinstancegetdict
setdefaultanyr&   r#   nextitervalues)r'   or<   	preferredchosenr2   s   `     r   extract_odds_anyrP   4   s6   #''&/4(o.PT_cfcjcjkqcrTr&B'	Xy)

DC
DD#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YIF  ^F kd;--/01&$#FJJy$9:#FJJy$9:"6::h#78!&**W"56eeHo7
 	
  r   c                     t         D ]+  } t        | z  }|dz  }|dz  }t        |  dz  }|j                         st	        |  d       Bt        j                  t        |            }i }|j                         r]	 t        j                  t        |            }|D ]8  }|j                  d      }	|j                  d      }
|	(|
s+|
|t        |	      <   : 	 i }|j                         r	 t        j                  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      rb|j                  d      P|j                  d      >t        |j                  d            d d	 }|j                  t        |j                  d                  xs t        |j                  d            }|j                  t        |j                  d                  xs t        |j                  d            }|j                  d      xs d}|j                  d      xs d}|j                  d      }t        |t              s t        |t              r|j                         rt        |      nt        |d d       }|j                  d      }nx|j                  d      xs dd d	 }|j                  d      xs i }|j                  d      xs i }|j                  d      xs$ |j                  d      xs |j                  d      }|j                  d      xs$ |j                  d      xs |j                  d      }|j                  d      xs |j                  d      xs d}|j                  d      xs |j                  d      xs d}|j                  d      }t        |t              s)t        |t              r$t        |      j                         rt        |      n|rt        |d d       nd }|j                  d      }|r|r|s|dk(  r|dk(  r|st        |d d       }|j                  |t        |      t        |      f      r|dz  }n	d d d d d dd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(| n|  d(| d(t        |       d)t        |       || | ||||||d*t'        |      ||||z   d+d,        |j)                  d- .       t        j+                  d/d/0       t        j,                  |t        |d1      d23       t/        d4 |D              }t	        |  d5t1        |       d6| d7|        . y # t        $ r Y mw xY w# t        $ r Y w xY w)8Nz
games.jsonz
teams.jsonz_historical.jsonz&: no games.json yet (skipping rebuild)idnamedater   
   homeTeam	home_teamawayTeam	away_teamr   kickoffhome_team_idaway_team_id
home_score
away_scoreseason   visitor_team	full_namehome_team_namevisitor_team_namehome_team_scorevisitor_team_score   rD   r8   r:   r;   c              3   D   K   | ]  }j                  |      d u  y wr/   rF   )r1   r2   r)   s     r   r3   zmain.<locals>.<genexpr>   s     wq488A;d2ws    )r*   r9   r:   r+   r,   )rD   Nhomeawaydraw-z-at-)	homeScore	awayScore)winnermargintotalPoints)rR   bdl_game_idsportleaguerT   r_   rV   rX   scoresr)   hasRealOddsresultc                 &    | j                  dd      S )NrT   r   ri   )r"   s    r   <lambda>zmain.<locals>.<lambda>   s    quuVB/ r   )keyT)parentsexist_okw   )indentc              3   D   K   | ]  }|j                  d       sd  yw)rw   rg   Nri   )r1   gs     r   r3   zmain.<locals>.<genexpr>   s     :QUU=%91:s     z: wrote z games, matched_odds=z, hasRealOdds=)LEAGUESBASEBETTINGexistsprintjsonloadopenrF   r%   r    rP   r   r   rE   isdigitr   rI   appendboolsortmkdirdumpsumlen) ru   
league_dir
games_file
teams_fileout_filegames
team_by_idteamsttidrS   odds_lookupexistingrrT   rj   rk   outmatchedr   hsa_s
season_val
season_intgidhome_objaway_objhas_realrq   rp   realr)   s                                   @r   mainr   c   s    o_F]
,.
,.
x'788  "VHBCD		$z*+
		$z"23 4A%%+C55=D4/3
3s8,	4 79??
99T(^4! VAEE&M/R"5D55,Bk0BD55,Bk0BDt4 BRSTBUKtDz4: >?V  A	AuuYQUU>%:%FQUUSaMbMn155+,Sb1!~~c!%%*?&@A_S~I^E_!~~c!%%*?&@A_S~I^E_UU<(-AeeL).QUU8_
0::s0KPZ[egjPkpz  qC  qC  qES_  LO  PT  UW  VW  PX  LY
eeDk f+Sb155-35506B||K0cHLL4HcAEERbLc||K0fHLL4HfAEEReLfUU,-I|1DIee01MQUU<5HMAUU8_
0::s0KPZ[egjPkpst~p  qH  qH  qJS_  cg  RU  VZ  []  \]  V^  R_  mq
eeDkt4Qw3!8 bq]
??D$t*d4j#ABD1 &*%)"&"&!%$ xx%1dhh|6L6T&+D,>&?%?\"w<vww  e  }A  }E  }E  FN  }O  We  }eH#XF%zV&1*&FJJ+.?#'6(!D6QRSWX\S]R^^bcghlcmbn@o" $  (*=#H~%+vbSVhW iA	F 	/0dT2		#tHS)!4:c::S
*?yW[V\]^_o_*    s2   ;AX8X8X8*B/Y8	YY	YY__main__)__doc__r   pathlibr   typingr   r   r   r   r   r   r   r   r   r#   r%   r&   rG   rP   r   __name__r0   r   r   <module>r      s   
   ( (,-


?7C 7C 7	8E? 		# 	,$ ,4 ,^p_f zF r   