
    i                     4   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ZddlmZm	Z	m
Z
 ddlmZmZmZmZ ej                   j#                  dej                   j%                  ej                   j'                  e                   ddlmZ ej                   j#                  dej                   j%                  e             	 ddlmZmZmZmZ dZd
ZddddddddddddddZ g dg ddg dg dddg didg d id!Z!g d"Z"g d!Z#g d#Z$g d$Z%d%ee&e&f   fd&Z' G d' d(      Z(d) Z)d*e&d%ee&e&f   fd+Z*	 d5d,e(d-ee&   d.e+fd/Z,	 d5d,e(d-ee&   d.e+fd0Z-	 	 d6d,e(d-ee&   d.e+fd1Z.	 d5d,e(d-ee&   d.e+fd2Z/d3 Z0e1d4k(  r e2 e0              yy# e$ r dZ ed	       Y w xY w)7a>  
The Odds API Extended Markets Fetcher

Handles sport-level market fetches that don't fit the per-event prop model:
- Period markets (quarters, halves, periods)
- Team totals and alternate team totals
- Soccer specials (BTTS, draw no bet, double chance, 3-way)
- Alternate totals

Usage:
    python theoddsapi_extended_markets.py --periods          # Period markets (Q1-Q4, H1-H2, P1-P3)
    python theoddsapi_extended_markets.py --team-totals      # Team totals & alt team totals
    python theoddsapi_extended_markets.py --soccer           # Soccer specials (BTTS, DNB, DC, 3-way)
    python theoddsapi_extended_markets.py --alt-totals       # Alternate totals
    python theoddsapi_extended_markets.py --all              # All of the above
    python theoddsapi_extended_markets.py --dry-run --all    # Preview without writing
    N)datetimetimezone	timedelta)OptionalDictListTuple)normalize_to_full)log_ingestion_startlog_ingestion_completeupsert_bookmaker_oddsget_or_create_sports_gameTFz-Warning: unified_odds_ingestion not availablezhttps://api.the-odds-api.com/v4basketball_nbaamericanfootball_nflicehockey_nhlbaseball_mlbbasketball_ncaabamericanfootball_ncaaf
soccer_eplsoccer_germany_bundesligasoccer_italy_serie_asoccer_spain_la_ligasoccer_france_ligue_onesoccer_uefa_champions_leaguesoccer_usa_mls)nbanflnhlmlbncaabncaafepl
bundesligaseriealaligaligue1uclmls)h2h_q1
spreads_q1	totals_q1h2h_q2
spreads_q2	totals_q2h2h_q3
spreads_q3	totals_q3h2h_q4
spreads_q4	totals_q4)h2h_h1
spreads_h1	totals_h1h2h_h2
spreads_h2	totals_h2)quartershalves)r)   r*   r+   periods)	h2h_p1
spreads_p1	totals_p1h2h_p2
spreads_p2	totals_p2h2h_p3
spreads_p3	totals_p3innings)h2h_1st_1_inningsspreads_1st_1_inningstotals_1st_1_inningsh2h_1st_3_inningsspreads_1st_3_inningstotals_1st_3_inningsh2h_1st_5_inningsspreads_1st_5_inningstotals_1st_5_inningsh2h_1st_7_inningsspreads_1st_7_inningstotals_1st_7_innings)r   r   r   r   )bttsdraw_no_betdouble_chance	h2h_3_way)r   r   r   r   r    r!   )r"   r#   r$   r%   r&   r'   r(   returnc                  n   d} d}d}	 t        | d      5 }|D ]  }|j                  d      rE|j                  dd      d   j                         j                  d      j                  d      d	   }Y|j                  d
      sk|j                  dd      d   j                         j                  d      } 	 ddd       |xs2 t
        j                  j                  dd      j                  d      d	   }|xs t
        j                  j                  d      }||fS # 1 sw Y   fxY w# t        $ r Y tw xY w)z'Load database URL and API key from .envz/var/www/html/eventheodds/.envNrzSPORTS_DATABASE_URL==   "?r   zTHE_ODDS_API_KEY=SPORTS_DATABASE_URL THE_ODDS_API_KEY)open
startswithsplitstripFileNotFoundErrorosenvironget)env_pathdb_urlapi_keyflines        &scripts/theoddsapi_extended_markets.pyload_configrp   c   s*   /HFG(C  	GA G??#9:!ZZQ/288:@@EKKCPQRSF__%89"jja0399;AA#FG	G	G Nrzz~~&;R@FFsKANF;(:;G7?	G 	G  s/   D( A-D4D7D( D%!D( (	D43D4c                       e Zd ZddededefdZddededee   fd	Z	 dd
ede	e   dede	e   fdZ
	 dd
edede	e   dedee   f
dZy)ExtendedMarketsFetcherrl   rk   dry_runc                 |    || _         || _        || _        t        j                         | _        d| _        d | _        y )Nr   )rl   rk   rs   requestsSessionsession
quota_usedquota_remaining)selfrl   rk   rs   s       ro   __init__zExtendedMarketsFetcher.__init__z   s6    '')#    NendpointparamsrX   c                 l   |i }| j                   |d<   t         | }	 | j                  j                  ||d      }t	        |j
                  j                  dd            | _        t	        |j
                  j                  dd            | _        |j                  dk(  rt        d	       y|j                  d
k(  ry|j                  dk(  rt        d       y|j                  dk7  rt        d|j                   d|        y|j                         S # t        $ r}t        d|        Y d}~yd}~ww xY w)z Make API request and track quotaNapiKey   )r~   timeoutzx-requests-usedr   zx-requests-remainingi  zERROR: Invalid API keyi  i  zERROR: Quota exceeded   zERROR: API returned z for zERROR: Request failed: )rl   BASE_URLrw   ri   intheadersrx   ry   status_codeprintjson	Exception)rz   r}   r~   urlrespes         ro   _requestzExtendedMarketsFetcher._request   s(   >F<<x
8*%	<<##C#CD!$,,"2"23Da"HIDO#&t||'7'78NPQ'R#SD 3&.03&3&-/3&,T-=-=,>eH:NO99; 	+A3/0	s0   BD ,D <D *D D 	D3D..D3	sport_keymarketsregionsc                 d    |dj                  |      dd}| j                  d| d|      }|xs g S )zGet odds for specific markets,americanr   r   
oddsFormat/sports//oddsjoinr   )rz   r   r   r   r~   results         ro   get_odds_with_marketsz,ExtendedMarketsFetcher.get_odds_with_markets   sB     xx($

 )E:FC|r|   event_idc                 ^    |dj                  |      dd}| j                  d| d| d|      S )z)Get event-level odds for specific marketsr   r   r   r   z/events/r   r   )rz   r   r   r   r   r~   s         ro   get_event_oddsz%ExtendedMarketsFetcher.get_event_odds   s?     xx($

 }}x	{(8*EJFSSr|   F)N)us)__name__
__module____qualname__strboolr{   dictr   r   r   r   r    r|   ro   rr   rr   y   s    $ $S $4 $ d htn @ /3	s 	T#Y 	(+	7;Dz	 ;?T Ts T $S	T47TCKD>Tr|   rr   c                    | j                         }|j                  d       |j                  d       |j                  d       |j                         s	 |j                  d       |j                  d       |j                         s	 |j                  d       | j	                          |j                          y#  | j                          Y hxY w#  | j                          Y LxY w)zEnsure required tables exist.

    Existing tables (PeriodOdds, GameOddsAltLine, GameOdds) already have schemas.
    Only create PropSnapshot if it doesn't exist yet.
    a  
        CREATE TABLE IF NOT EXISTS "PropSnapshot" (
            id SERIAL PRIMARY KEY,
            league VARCHAR(20),
            "theoddsapiEventId" VARCHAR(100),
            "gameDate" TIMESTAMP,
            "homeTeam" VARCHAR(100),
            "awayTeam" VARCHAR(100),
            bookmaker VARCHAR(50),
            "marketType" VARCHAR(50),
            "playerName" VARCHAR(100),
            "propLine" DOUBLE PRECISION,
            "overPrice" INTEGER,
            "underPrice" INTEGER,
            "capturedAt" TIMESTAMP DEFAULT NOW(),
            source VARCHAR(50) DEFAULT 'theoddsapi',
            "createdAt" TIMESTAMP DEFAULT NOW()
        )
    z
        CREATE INDEX IF NOT EXISTS idx_prop_snapshot_event
        ON "PropSnapshot"(league, "theoddsapiEventId", "playerName", "capturedAt")
    z
        SELECT column_name FROM information_schema.columns
        WHERE table_name = 'PeriodOdds' AND column_name = 'bookmaker'
    z2ALTER TABLE "PeriodOdds" ADD COLUMN bookmaker TEXTz
        SELECT column_name FROM information_schema.columns
        WHERE table_name = 'PeriodOdds' AND column_name = 'source'
    zDALTER TABLE "PeriodOdds" ADD COLUMN source TEXT DEFAULT 'theoddsapi'N)cursorexecutefetchonerollbackcommitclose)conncurs     ro   ensure_tablesr      s     ++-C KK  	& KK  	 KK  	 <<>	KKLM
 KK  	 <<>	KK`a 	KKMIIK	MMO	MMOs   B: C :CC%
market_keyc                     d| v r| j                  dd      }|d   |d   fS | j                  dd      }t        |      dk(  r
|d   |d   fS | dfS )zParse a period market key like 'h2h_q1' into (market_type, period).

    Returns: (market_type, period) e.g. ('h2h', 'q1')
    _1st__r\   r      full)rd   rsplitlen)r   partss     ro   parse_period_market_keyr      sl     *  a(Qxq!!c1%E
5zQQxq!!vr|   fetcherleaguesrs   c                    |j                         }d}t        dd        t        d       t        dt        j                  t        j
                        j                                 t        d        |D ]  }t        j                  |      }t        j                  |      }|r|s3g }	|j                         D ]  }
|	j                  |
        |	s^t        dt        |	      d      D ]  }|	||dz    }t        d|j                          dd	j                  |d
d        dt        |       d       | j!                  ||      }|s_|D ]
  }|j                  d      }t#        |j                  dd      |      }t#        |j                  dd      |      }|j                  d      }d
}|r&	 t        j$                  |j'                  dd            }|j                  dg       D ]m  }|j                  dd      }|j                  dg       D ]B  }|j                  dd      }t)        |      \  }}|j                  dg       }d
x}x}}d
}|D ]  }|j                  dd      } | |k(  s| dk(  r5|j                  d      }|j                  d      B|j                  d      }T| |k(  s| dk(  r|j                  d      }p| dk(  sv|j                  d      } |||r)t        d | d!| d"| d#| d"| d$| d%| d&|        |d'z  }d
x}!x}"x}#x}$}%|d(v r
|}!|| nd
}"n|d)v r|}#n|d*v r|}$|}%|j+                  d+|||||||!|"|#|$|%|f       |d'z  }E p  t-        j.                  d'         |s|j1                          |j3                          t        d,|        t        d-| j4                          |S #  Y xY w).zFFetch period markets (quarters, halves, periods) for specified leaguesr   
<============================================================zFETCHING PERIOD MARKETSTime:      : Fetching r   N   z... (z	 markets)id	home_teamr`   	away_teamcommence_timeZ+00:00
bookmakerskeyunknownr   outcomesnameOverpricepointUnderDraw
    [DRY]  vs  |  : /z line=r\   )spreadsspread)totalstotal)h2h	moneylinea  
                            INSERT INTO "PeriodOdds" (
                                league, "gameId", "gameDate", "homeTeam", "awayTeam",
                                period, "spreadHome", "spreadAway", total,
                                "moneylineHome", "moneylineAway",
                                "snapshotType", "snapshotAt", bookmaker, source
                            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 'live', NOW(), %s, 'theoddsapi')
                            ON CONFLICT ("league", "gameId", "period", "snapshotType")
                            DO UPDATE SET
                                "spreadHome" = COALESCE(EXCLUDED."spreadHome", "PeriodOdds"."spreadHome"),
                                "spreadAway" = COALESCE(EXCLUDED."spreadAway", "PeriodOdds"."spreadAway"),
                                total = COALESCE(EXCLUDED.total, "PeriodOdds".total),
                                "moneylineHome" = COALESCE(EXCLUDED."moneylineHome", "PeriodOdds"."moneylineHome"),
                                "moneylineAway" = COALESCE(EXCLUDED."moneylineAway", "PeriodOdds"."moneylineAway"),
                                "snapshotAt" = NOW()
                        z
  Period markets captured:   Quota remaining: )r   r   r   nowr   utc	isoformat
SPORT_KEYSri   PERIOD_MARKETSvaluesextendranger   upperr   r   r
   fromisoformatreplacer   r   timesleepr   r   ry   )&r   r   r   rs   r   r   leaguer   period_configall_marketsgroup_marketsbatch_startbatcheventseventr   homeawaycommencecommence_dtbook	book_namemarketr   market_typeperiodr   	home_odds	away_odds	draw_odds
line_valueor   sp_homesp_awaytot_valml_homeml_aways&                                         ro   fetch_period_marketsr    s2    ++-CE	Bvh-	
#$	F8<<-779:
;<	VH eNN6*	&**62 *113 	.M}-	.  !C$4a8 V	KK!O<EBv||~&k#((5!92E1FeCPUJ<W`ab229eDF L# 99T?(;)CVL(;)CVL 99_5"&.&<&<X=M=McS[=\&] "IIlB7 ?#D $	 :I"&((9b"9 <#%+ZZr%:
.Ej.Q+V#)::j"#=<@@	@I	%)
!) 	;A#$55#4D#t|tv~,-EE'N	#$55>#=12wJ!%,-EE'N	!%,-EE'N		; %,1B$"!JtfDc&;-WZ%.Kr)Ai[zl#\ ]!QJE$ KONN'NGNg&*??&0G5?5KzkQUG(,??&0G(,@@&/G&/G %  #Hk4"GWg#Wi( 
y<#?#L#\ JJqMmV	eN IIK	)%
12	 7 78
9:LYs   /%N??O	c                    |j                         }d}t        dd        t        d       t        dt        j                  t        j
                        j                                 t        d        |D ]  }|t        vrt        j                  |      }|s%ddg}t        d|j                          d	       | j                  ||      }	|	s[|	D ])  }
|
j                  d
      }t        |
j                  dd      |      }t        |
j                  dd      |      }|
j                  d      }d}|r&	 t        j                  |j                  dd            }|
j                  dg       D ]  }|j                  dd      }|j                  dg       D ]a  }|j                  dd      }d|v }|j                  dg       D ]2  }|j                  d|j                  dd            }|j                  dd      j                         }|j                  d      }|j                  d      }||mt        ||      }||k(  rd}n ||k(  rd}n||
j                  d      k(  rdnd}d| }|rd| }|d k(  r|nd}|d!k(  r|nd}|r&t        d"| d#| d$| d%| d$| d&| d'|        |d(z  }|r)|j!                  d)||||||||k(  r|n|||||xs |f       n|j!                  d*||||||||||f
       |d(z  }5 d  , t#        j$                  d(        |s|j'                          |j)                          t        d+|        t        d,| j*                          |S #  Y xY w)-z+Fetch team totals and alternate team totalsr   r   r   zFETCHING TEAM TOTALSr   team_totalsalternate_team_totalsr   z: Fetching team totalsr   r   r`   r   r   Nr   r   r   r   r   r   	alternater   descriptionr   r   r   r   r   team_total_alt_team_total_overunderr   r   r   r   z: o=z u=r\   a  
                                INSERT INTO "GameOddsAltLine" (
                                    league, "gameId", "gameDate", "homeTeam", "awayTeam",
                                    team, opponent, market, bookmaker, "lineValue",
                                    "oddsAmerican", "fetchedAt", source
                                ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), 'theoddsapi')
                                ON CONFLICT ("league", "gameId", "bookmaker", "market", "team", "lineValue")
                                DO UPDATE SET "oddsAmerican" = EXCLUDED."oddsAmerican", "fetchedAt" = NOW()
                            a  
                                INSERT INTO "GameOdds" (
                                    league, "gameId", "gameDate", "homeTeam", "awayTeam",
                                    market, bookmaker, "lineValue",
                                    "overOdds", "underOdds", "fetchedAt", source
                                ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), 'theoddsapi')
                                ON CONFLICT ("league", "gameId", "bookmaker", "market")
                                DO UPDATE SET "lineValue" = EXCLUDED."lineValue",
                                    "overOdds" = EXCLUDED."overOdds",
                                    "underOdds" = EXCLUDED."underOdds",
                                    "fetchedAt" = NOW()
                            z
  Team totals captured: r   )r   r   r   r   r   r   r   TEAM_TOTAL_SPORTSr   ri   r   r   r
   r   r   lowerr   r   r   r   r   ry   )r   r   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   is_altr  	team_nameoutcome_typer  r   normalized_teamsidemarket_label	over_odds
under_oddss                                  ro   fetch_team_totalsr   ~  s    ++-CE	Bvh-	
 !	F8<<-779:
;<	VH f**NN6*	 "9:6<<>""89:..y'B V	#EyyH$UYY{B%?HD$UYY{B%?HDyy1HK"*"8"89I9I#x9X"YK 		,3 I# HHUI6	"hhy"5 F#F!'E2!6J(J6F#ZZ
B7 B#$%EE-vr9J$K	'(uuVR'8'>'>'@%&UU7^
 !g%-$ +<Iv*N*d2#)D,4#)D-6%))K:P-P6V\D)4TF';!-<TF+CL-9V-CE	.:g.EU4
"!JtfDc,qQ[P\\_%.KtI;c*#O P!QJE$ "KK )  !'+tT /D9PVZ ,i ) 7Z	"   KK )  !'+tT ,i ):"  
EB#	F#I#V	#p 	

1MfP IIK	&ug
./	 7 78
9:Lms   7%M##M(c                    |t         }|j                         }d}t        dd        t        d       t        dt        j                  t
        j                        j                                 t        d        |D ]   }|t         vrt        j                  |      }|s%t        d|j                          dd	j                  t                      | j                  |t              }|st        d|j                          d
       t        d|j                          dt        |       d       |D ]0  }	|	j                  d      }
t        |	j                  dd      |      }t        |	j                  dd      |      }|	j                  d      }d}|r&	 t        j                   |j#                  dd            }|	j                  dg       D ]  }|j                  dd      }|j                  dg       D ]h  }|j                  dd      }|j                  dg       }dx}x}}d}|D ]  }|j                  dd      }|j                  d      }|dk(  r|dk(  r|}3|dk(  s9|}<|dv re||k(  s||	j                  d      k(  r|}\||k(  s||	j                  d      k(  r|}x|dk(  r|}d |v sd!|k(  r|}d"|v sd#|k(  r|}d|v sd$|k(  s|}|d%k(  s||k(  s||	j                  d      k(  r|}||k(  s||	j                  d      k(  s|} ||||r't        d&| d'| d(| d(| d)| d*| d+|        |d,z  }H|j%                  d-||
||||||||f
       |d,z  }k  3 t'        j(                  d,        |s|j+                          |j-                          t        d.|        t        d/| j.                          |S #  Y xY w)0zFFetch soccer special markets (BTTS, draw no bet, double chance, 3-way)Nr   r   r   zFETCHING SOCCER SPECIALSr   r   r   r   z: No eventsr   z eventsr   r   r`   r   r   r   r   r   r   r   r   r   r   r   rT   YesNo)rW   rV   r   Home1Away2XrU   r   r   r   z: h=z a=z d=r\   a  
                        INSERT INTO "GameOdds" (
                            league, "gameId", "gameDate", "homeTeam", "awayTeam",
                            market, bookmaker, "lineValue",
                            "homeOdds", "awayOdds", "fetchedAt", source
                        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), 'theoddsapi')
                        ON CONFLICT ("league", "gameId", "bookmaker", "market")
                        DO UPDATE SET "homeOdds" = EXCLUDED."homeOdds",
                            "awayOdds" = EXCLUDED."awayOdds",
                            "fetchedAt" = NOW()
                    z
  Soccer specials captured: r   )SOCCER_LEAGUESr   r   r   r   r   r   r   r   ri   r   r   SOCCER_MARKETSr   r   r
   r   r   r   r   r   r   r   ry   )r   r   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r   s                              ro   fetch_soccer_specialsr+    s     
++-CE	Bvh-	
$%	F8<<-779:
;<	VH _'NN6*	6<<>"+chh~.F-GHI..y.IBv||~&k236<<>""S[M9: M	EyyH$UYY{B%?HD$UYY{B%?HDyy1HK"*"8"89I9I#x9X"YK 		,3 @ HHUI6	"hhy"5 =F!'E2!6J%zz*b9H8<<I<	I!%J% 2 uuVR0 !g%/#u},1	!%,1	'+II#t|tuyy7M/M,1	!%;9O1O,1	!%,1	!'43$;,1	!'43$;,1	!'43$;,1	'=8#t|tuyy7M/M,1	!%;9O1O,1	72: !(Y->9CT 
4&TF#j\!*4	{#i[I;X Y
  KK 
! +tT"Iz!9 QJE{=@M	^ 	

1_B IIK	*5'
23	 7 78
9:L[s   %OOc                    |j                         }d}t        dd        t        d       t        dt        j                  t        j
                        j                                 t        d        |D ]  }|t        vrt        j                  |      }|s%ddg}t        d|j                          d	       | j                  ||      }	|	s[|	D ]  }
|
j                  d
      }t        |
j                  dd      |      }t        |
j                  dd      |      }|
j                  d      }d}|r&	 t        j                  |j                  dd            }|
j                  dg       D ]x  }|j                  dd      }|j                  dg       D ]M  }|j                  dd      }|j                  dg       D ]"  }|j                  dd      }|j                  d      }|j                  d      }||=d|v r|dk(  r|nd}|dk(  r|nd}d}n<||k(  s||
j                  d      k(  r|nd}||k(  s||
j                  d      k(  r|nd}d}|r#t        d| d | d!| d"| d!| d#|        |d$z  }||||
j                  d      |
j                  d      fv r|n|dk(  rdnd}|||
j                  d      fv r|n|}|j                  d%|||||||||||f       |d$z  }% P {  t!        j"                  d$        |s|j%                          |j'                          t        d&|        t        d'| j(                          |S #  Y xY w)(zFetch alternate totalsr   r   r   zFETCHING ALTERNATE TOTALSr   alternate_totalsalternate_spreadsr   z: Fetching alternate linesr   r   r`   r   r   Nr   r   r   r   r   r   r   r   r   r   r   r   r   	alt_total
alt_spreadr   r   r   r   r   r\   aw  
                            INSERT INTO "GameOddsAltLine" (
                                league, "gameId", "gameDate", "homeTeam", "awayTeam",
                                team, opponent, market, bookmaker, "lineValue",
                                "oddsAmerican", "fetchedAt", source
                            ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), 'theoddsapi')
                            ON CONFLICT ("league", "gameId", "bookmaker", "market", "team", "lineValue")
                            DO UPDATE SET "oddsAmerican" = EXCLUDED."oddsAmerican", "fetchedAt" = NOW()
                        z
  Alt lines captured: r   )r   r   r   r   r   r   r   ALT_TOTAL_SPORTSr   ri   r   r   r
   r   r   r   r   r   r   r   ry   )r   r   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r   r  r  
alt_marketteam_name_for_altopp_names                                ro   fetch_alt_totalsr5  r  s    ++-CE	Bvh-	
%&	F8<<-779:
;<	VH L))NN6*	%':;6<<>""<=>..y'B <	#EyyH$UYY{B%?HD$UYY{B%?HDyy1HK"*"8"89I9I#x9X"YK 		,3 /# HHUI6	"hhy"5 ,#F!'E2!6J#ZZ
B7 )# uuVR0%&UU7^
 !g%-$#z115TI26'/tJ)4J15S^I_A_eiI26$,$%))T_J`B`fjJ)5J"!JtfDc*QzlZ]%.Kr%#: ;!QJE$ 59T4S^I_afajajkvaw<x4xD  JN  RX  JX  @F  ^e)+<uyyQ\G]@^+^4dh % #Hk4-x&	:!	 
S)#,#/#<	#| 	

1YL\ IIK	$UG
,-	 7 78
9:Lys   7%MMc            
      L	   t        j                  d      } | j                  ddd       | j                  ddd       | j                  d	dd
       | j                  ddd       | j                  ddd       | j                  dt        dd       | j                  ddd       | j	                         }t        |j                  |j                  |j                  |j                  |j                  g      s| j                          y|j                  rdx|_        x|_        x|_        |_	        t               \  }}|st        d       y|st        d       yt        |||j                        }|j                   j#                  d      D cg c]  }|j%                          }}t'        j(                  |      }t+        |       d }t,        r|j                  s	 t/        |ddd      }d}
d}	 |j                  r	 |
t3        ||||j                        z  }
|j                  r	 |
t5        ||||j                        z  }
|j                  r	 |
t7        ||||j                        z  }
|j                  r	 |
t9        ||||j                        z  }
t,        r&|r$|j                  s	 t;        |||
||dk(  rd$nd%&       t        d(d)        t        d*       t        d+|
        t        d,|        t        d-|j<                          t        d.|j>                          |j                  rt        d/       t        d)        |jA                          yc c}w # t0        $ r}	t        d|	        Y d }	~	d }	~	ww xY w# t0        $ r}	t        d |	        |dz  }Y d }	~	d }	~	ww xY w# t0        $ r}	t        d!|	        |dz  }Y d }	~	d }	~	ww xY w# t0        $ r}	t        d"|	        |dz  }Y d }	~	d }	~	ww xY w# t0        $ r}	t        d#|	        |dz  }Y d }	~	d }	~	ww xY w# t0        $ r}	t        d'|	        Y d }	~	d }	~	ww xY w# t,        rM|rJ|j                  s=	 t;        |||
||dk(  rd$nd%&       w # t0        $ r}	t        d'|	        Y d }	~	w d }	~	ww xY ww w w xY w)0Nz%The Odds API Extended Markets Fetcher)r  z	--periods
store_truezFetch period markets)actionhelpz--team-totalszFetch team totalsz--soccerzFetch soccer specialsz--alt-totalszFetch alt totals & spreadsz--allzFetch all extended marketsz	--leaguesznba,nfl,nhl,mlbz2Comma-separated leagues (default: nba,nfl,nhl,mlb))typedefaultr9  z	--dry-runzPreview without writingr\   Tz&ERROR: THE_ODDS_API_KEY not configuredz)ERROR: SPORTS_DATABASE_URL not configured)rs   r   ztheoddsapi-extendedmulti	scheduledz(Warning: Could not log ingestion start: r   zERROR in period markets: zERROR in team totals: zERROR in soccer specials: zERROR in alt totals: 	completedcompleted_with_errors)odds_createderrors_countstatusz+Warning: Could not log ingestion complete: r   r   zEXTENDED MARKETS COMPLETEz  Total records: z
  Errors: z  Quota used: r   z!  MODE: DRY RUN (no data written))!argparseArgumentParseradd_argumentr   
parse_argsanyr=   r  soccer
alt_totalsall
print_helprp   r   rr   rs   r   rd   re   psycopg2connectr   UNIFIED_AVAILABLEr   r   r  r   r+  r5  r   rx   ry   r   )parserargsrk   rl   r   lr   r   ingestion_idr   r   errorss               ro   mainrT    s   $$1XYF
L?UV
CVW

<>UV
|B^_
;WX
#7HQ  S
L?XYDd..T__dhhWXxxJNNNt'N$+!mOFG679:$WfdllKG"&,,"4"4S"9:Qqwwy:G:F#D$ L	B.t5JGU`aL EF(I<<-gtWdllSS
 *7D'4<<PP
 ;;.wgt||TT
 ??)'4$,,OO dllI&,!&!'*0A+;;R	 
Bvh-	%'	eW
%&	Jvh
 	N7--.
/0	 7 78
9:||13	VHJJLK ;  	B<QC@AA	B  1!56!  .qc23!  21#67!  -aS12!  ICA3GHHI dllI&,!&!'*0A+;;R	  ICA3GHHI 7Cs  MM 2Q ?N Q 'N+ Q O *Q 7O? 'P) 	M>%M99M>	N(
N#Q #N((Q +	O4OQ OQ 	O<O71Q 7O<<Q ?	P&P!Q !P&&Q )	Q2QQR#$Q<;R#<	RRR#RR#__main__r   )NF)3__doc__rC  ru   rL  r   rg   sysr   r   r   r   typingr   r   r   r	   pathinsertdirnameabspath__file__
team_namesr
   lib.unified_odds_ingestionr   r   r   r   rN  ImportErrorr   r   r   r   r*  r  r1  r)  r   rp   rr   r   r   r   r  r   r+  r5  rT  r   exitr   r|   ro   <module>rb     s\  "     	 
  2 2 . . 277??277??8#<= > ( 277??8, -;  
 - !%-$$')
&_\ :\
 	 9
 	 Z. G 1  B  SU38_ ,;T ;T|8v c3h $ */x"8 xc x"&xx ',y5 yd3i y#yx W[*/u#9 u$s) u#'ur &+_4 _T#Y _"_DcL zL e  ;	
9:;s   ?F FF