
    $ii4                     p    S r SSKrSSKrSSKJrJr  SSKJr  SSKJr  SSK	J
r
  \" \5      r " S S5      rg)	zMock TAB API client for testing without API access.

Provides realistic sample data for development and testing when TAB API
access is not available or for faster testing.
    N)datetime	timedelta)Any)
get_logger)get_settingsc                       \ rS rSrSrS rS rS rS rS\	S\	4S	 jr
  SS\	S\	S\	S
-  S\	S
-  S\\\	\4      4
S jjrS\	S\\	\4   4S jrS\	S\\	\4   4S jr   SS\	S\	S\	S
-  S\	S
-  S\S\\	\4   4S jjrSrg
)MockTABClient   z-Mock TAB API client that returns sample data.c                 L    [        5       U l        [        R                  S5        g)zInitialize mock client.zAInitialized MockTABClient - using sample data instead of real APIN)r   settingsloggerinfoselfs    D/root/tipsharks/tipsharks-elo-api/packages/tab_client/mock_client.py__init__MockTABClient.__init__   s    $WX    c                    #    U $ 7f)zAsync context manager entry. r   s    r   
__aenter__MockTABClient.__aenter__   s
     s   c                 @   #    U R                  5       I Sh  vN   g N7f)zAsync context manager exit.N)close)r   exc_typeexc_valexc_tbs       r   	__aexit__MockTABClient.__aexit__   s     jjls   c                    #    g7f)zClose client (no-op for mock).Nr   r   s    r   r   MockTABClient.close"   s     s   seedreturnc                 l    [         R                  " UR                  5       5      R                  5       SS $ )zGenerate a deterministic ID from a seed string.

This ensures the same input always produces the same ID,
making tests reproducible.

Args:
    seed: String to hash

Returns:
    8-character hex string ID
N   )hashlibmd5encode	hexdigest)r   r"   s     r   _generate_deterministic_id(MockTABClient._generate_deterministic_id&   s)     {{4;;=)335bq99r   N	date_fromdate_tocategorycountryc                 F  #    U=(       d     U R                   R                  R                  nU=(       d     U R                   R                  R                  n[        R                  SU SU SU 35        [        R                  " S5      I Sh  vN   [        R                  " US5      n[        R                  " US5      n/ SQ/ SQ/ S	QS
.n/ nUn	X::  Ga%  UR                  X7S   5      n
SU	R                  S-  -   n[        U5       H  nX[        U
5      -     nU	R                  5        SU SU 3nU R                  U5      n/ n[        SS5       H>  nU SU 3nU R                  U5      nUR!                  UUSU 3SUS-
  S-  -   US.5        M@     UR!                  UUU	R                  5        S3U	R#                  S5      USSSS
.R                  US5      USSUS.
5        M     U	[%        SS9-  n	X::  a  GM%  [        R                  S[        U5       S35        U$  GN7f) a  Return mock meeting data matching TAB API structure.

Args:
    date_from: Start date (YYYY-MM-DD)
    date_to: End date (YYYY-MM-DD)
    category: Racing category filter ("T", "H", "G")
    country: Country filter

Returns:
    List of mock meeting dictionaries
z[MOCK] Fetching z meetings from  to g?Nz%Y-%m-%d)Auckland	Cambridge	AddingtonzAlexandra Park)	EllerslieTrentham	RiccartonHastings)Manukaur4   WanganuizPalmerston North)HTGr;         -	   -RRace      idrace_numbernamedistancer/   zT00:00:00+13:00z%Y%m%dHarnessThoroughbreds
GreyhoundsNZLGood
meetingrI   datemeeting_dater.   category_namer/   statetrack_conditionraces)daysz[MOCK] Returning z mock meetings)r   tabdefault_categorydefault_countryr   r   asynciosleepr   strptimegetdayrangelen	isoformatr*   appendstrftimer   )r   r,   r-   r.   r/   
start_dateend_datevenuesmeetingscurrent_date
venue_listnum_meetings	venue_idxvenuemeeting_seed
meeting_idrW   race_num
event_seedevent_ids                       r   get_meetingsMockTABClient.get_meetings4   sH    $ At}}00AA>T]]..>>xj	{$wiP	

 mmC    &&y*=
$$Wj9 JCI
 !&HSk:J 0 01 45L"<0	"s:#>?"."8"8":!;1UG1XJO!<<\J
  %aH$.<r(!<J#>>zJHLL"*+3&+H:$6(,1/C(C'. !, #- %#/#9#9#;"<O L(4(=(=h(G$,!*!0!-* #h	2#*!&+1!&) 1N I1--LY &\ 	'HnEFA 	!s   B
H!HE*H!:%H!rp   c                 4  #    [         R                  SU 35        [        R                  " S5      I Sh  vN   / n[	        SS5       H>  nU SU 3nU R                  U5      nUR                  UUSU 3SUS-
  S	-  -   S
S.5        M@     USSSSSS
SSUS.
$  Na7f)zReturn mock meeting details with races.

Args:
    meeting_id: Meeting ID

Returns:
    Mock meeting dictionary with races array
z[MOCK] Fetching meeting 皙?Nr>   rA   rB   rC   rD   rE   NZrF   r2   z2024-12-26T00:00:00+13:0020241226r;   rK   rN   rO   rP   )r   r   r\   r]   ra   r*   rd   )r   rp   rW   rq   rr   rs   s         r   get_meetingMockTABClient.get_meeting   s      	.zl;< mmD!!! aH&<r(4J66zBHLL"#+#H:. $1'; ;# $ "/&&%
 	
# 	"s   2BBA"Brs   c                   #    [         R                  SU 35        [        R                  " S5      I Sh  vN   [	        USS S5      S-  S-   nS[	        USS S5      S	-  -   n/ n/ n/ S
Qn/ SQn[        SUS-   5       GH  nU SU 3n	[	        [        R                  " U	R                  5       5      R                  5       SS S5      S-  n
X:H  =(       a    US:  n[	        USS S5      U-   [        U5      -  n[	        USS S5      U-   [        U5      -  n0 SSU SU 3_SU
_SSU 3_SU_SU_SU US::  a  SOS 3_SUS-
  S-  _SUU   _SX}   _SS_SU_S S!_S"US:H  _S#S!_S$SUS-  -   _S%US-  S&:X  a  S'OS(_S)S*_0 S+S,U 3_S-S.U 3_S/S,U S0U 3_S1S2_S3[        S4US5-  -   5      _S6S7_S8S9_S:S7_S;S7_S<S=_S>S7_S?S7_S@SAU 3_SBSC_SDS&S&SE._SF/ _SGSH_ESIS&SJUSK-  -   SLUSM-  -   SN.SO.EnUR                  U5        U(       a  GM  US::  d  GM  UR                  SU SU 3USU 3UUUS:X  a  S&OUS-
  SL-  SP.5        GM     US-  S&:X  a  SQOSRnUSS-  S&:w  a  STOSUn0 SVU_SWSXUSS  3_SYS_SZS_S[U_S\S]U 3_S^S__S`Sa_SBSC_SbSc_SdSeUS-
  Sf-  -   _SgU_ShU_SiSj_SkSlSmU-    Sn3_SoSj_SpSlSmU-    Sn3_SqSrSsStSuUSSS7S7S7S7S7/ S4SvSwSx.Sy.EnUUU/ / U(       a  US&   OSS/ / S7Sz.
$  GN7f){zReturn mock event details with runners and results.

Args:
    event_id: Event ID

Returns:
    Mock event dictionary with race, runners, and results
z[MOCK] Fetching event rw   Nr?      r%   r>         )z
John Smithz
Mary JoneszDavid BrownzSarah WilsonzMichael Taylorz
Emma DaviszJames AndersonzLucy MartinzRobert WhitezEmily JacksonzWilliam HarriszSophie Clark)zTom MitchellzJane RobertszPeter ThompsonzLisa Walkerz
Mark Lewisz	Amy Youngz
Chris HallzKaren Allenz-horse-i 
   
entrant_idzentrant-r@   horse_idrI   zMock Horse runner_numberbarrierbarrier_positionFBhandicapjockeytrainer_nametrainer_locationr2   is_scratchedis_late_scratchedF	favouritemoveragesexr   r=   McolourBrownsirezSire damzDam breedingz x Dam last_twenty_starts
12345678x0prize_moneyi'  i  gear silk_colourszBlue and Whitesilk_url_64x64silk_url_128x128class_levelC1apprentice_indicatorallowance_weightownerszOwner r/   rx   weight)	allocatedcarriedform_indicatorsmarket_nameWinTg      @g      ?g      ?g?)winplace)primary_marketscratch_timeodds)r   positionrI   r   r   margin_lengthTrotPace   MobileStandingrs   rp   zmeeting-meeting_namedisplay_meeting_namerH   descriptionz
Mock Race statusResultedtyperK   rU   rN   rJ   rD   rE   
start_typegaitadvertised_startikeadvertised_start_stringz2024-12-26T   z:00:00+13:00actual_startactual_start_stringFinerO   Rightg     @o@Truei  i  )123)weatherrV   track_directiontrack_home_straightrail_positionentrant_countpositions_paid
form_guidecommentsilk_base_urlsilk_urlgrouptipsprize_monies)
racerunnersresults	dividendsderivativesr   r   big_bets	live_betserror)r   r   r\   r]   intra   r&   r'   r(   r)   rb   strrd   )r   rs   rH   num_runnersr   r   driver_namestrainer_namesi
horse_seedr   r   
driver_idxtrainer_idxrunnerr   r   	race_datas                     r   	get_eventMockTABClient.get_event   s     	,XJ78 mmD!!! 8BQ<,q0A5 3x!}b1A56
	
 q+/*A$:WQC0JGKK
 1 1 34>>@!DbIFR 
 +@b0@L hrlB/!3s<7HHJx!}b1A5]9KKK(
!A37(H( +aS)(  	(
 1( #qca#S)A$B( QUbL( ,(  :( #J( ( $U( Q!V(  !(" qAE{#($ a!eqjsc%(& ''(( %s)(* aSz+(, eA3gaS1-(. %l/(0 s51t8#341(2 3(4  05(6 !"7(8 #B9(: t;(< '=(> #B?(@ F1#,A(B 4C(D a8E(F "2G(H uI(J #' ! #a#ga#gFO(FR NN6"  <AF(0
!A3&?$%"-aS 1#$)*./1f1q5C-	w +N %qA-v6!,qA!5X:
 
 
HXbq\N3 
 J 
 #J	 

 ; 
 Z}5 
 j 
 I 
 t 
 U 
 a366 
 * 
 D 
 
 
 &R+5E4Fl'S 
  J! 
" "[k1A0B,#O# 
$ %&#(#("'d>? 
	F '.D
 	
a 	"s   2K#K GK#K#CK#
meet_types	countrieslimitc           	        #    [         R                  SU SU 35        U R                  XX45      I Sh  vN n/ nU H>  nUR                  S/ 5       H%  n	UR	                  0 U	EUS   US   US   S.E5        M'     M@     USU SS	.$  NR7f)
zReturn mock race list.

Args:
    date_from: Start date (YYYY-MM-DD)
    date_to: End date (YYYY-MM-DD)
    meet_types: Racing type filter
    countries: Country filter
    limit: Maximum results

Returns:
    Mock race list response
z[MOCK] Fetching race list from r1   NrW   rQ   rI   r.   )rp   r   r.   )rW   
page_token)r   r   rt   r_   rd   )
r   r,   r-   r   r   r   ri   rW   rQ   r   s
             r   get_races_listMockTABClient.get_races_listc  s     ( 	5i[WINO **9zUUGGR0&-i&8(/$+J$7	 1   6E]
 	
 Vs   1BBAB)r   )NN)NNd   )__name__
__module____qualname____firstlineno____doc__r   r   r   r   r   r*   listdictr   rt   rz   r   r   r   __static_attributes__r   r   r   r	   r	      s    7Y
:s :s :$  $"ZZ Z *	Z
 tZ 
d38n	Zx(
C (
DcN (
Tg
 g
S#X g
Z "& $(
(
 (
 $J	(

 :(
 (
 
c3h(
 (
r   r	   )r   r\   r&   r   r   typingr   packages.core.common.loggingr   packages.core.common.settingsr   r   r   r	   r   r   r   <module>r      s4      (  3 6	H	y
 y
r   