
    ?ri                         d Z ddlZddlmZmZ ddlmZmZmZmZ ddl	m
Z
mZmZmZ ddlmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlm Z m!Z!  ejD                  d      Z#de$de$de$de$de%e$   f
dZ&de$de$de$de$de$de$dee   de$deee$ef      deee$ef      deee$ef      deee$ef      de fdZ'y)z
Core eligibility engine: determines prop publish eligibility.

Orchestrates all validation checks and produces a final ValidationState.
    N)datetimetimezone)ListDictAnyOptional   )ValidationStateAvailabilityStatusLineupStatusAuditAction)
get_policyREQUIRE_MARKET_CONFIRMATION)canonicalize_team_identifierextract_player_canonical_idnormalize_player_namenormalize_team_name)validate_player_availability)validate_lineup_statusis_lineup_dependent)reconcile_player_team)check_market_presence)PropEligibilityConflictDetailzpub-integrityleague	home_team	away_teamevent_idreturnc                 &   t               }||fD ]"  }t        ||       }|s|j                  |       $ t        |xs d      j	                  d      D cg c]  }|s|	 }}|dd D ]"  }	t        |	|       }|s|j                  |       $ |S c c}w )N -r	   )setr   addstrsplit)
r   r   r   r   team_ids	team_name	canonicalpartpartstokens
             +scripts/publishing_integrity/eligibility.py_build_game_team_idsr/      s     H+ $	0FC	LL#$
 "(.b177<EdTEEEq $0?	LL#$
 O Fs   BBplayer_name	prop_type
game_startrun_idroster_entriesavailability_reportslineup_datamarket_propsc                    t        |      }t        |       }t        | |      }t        j                  t
        j                        }t        |||| d|      }|rt        |      dk  r0t        j                  |_        d|_        d|  d|_        d|_        |S d}|D ]*  }|j                  d      |k(  s|j                  d	d      } n ||_        |rt#        ||      }t%        ||||      }| xs ||v }|swt'        d
| |d|| d| ddd|  d| d| d| 	      }t        j(                  |_        d|_        |j*                  |_        |j-                         |_        d|_        ||_        |S |rht3        | ||||      \  }}|sT|rRt        j(                  |_        d|_        |j*                  |_        |j-                         |_        d|_        ||_        |S ||_        t5        | |	|j6                        \  }}|j8                  rht        j:                  |_        d|_        |r|j*                  nd|  d|j<                   |_        |r|j-                         |_        d|_        ||_        |S ||_        tA        | ||||
      \  }}|rRt        jB                  |_        d|_        |j*                  |_        |j-                         |_        d|_        ||_"        |S tG        ||      rU|jH                  sI|tJ        jL                  k(  r.t        jN                  |_        |jP                  |_        ||_"        n||_"        n||_"        tS        ||       }||_*        tV        r>|jX                  r2|s0t        jZ                  |_        d|_        d|  d|_        d|_        |S |j                  t        jN                  k7  rt        j\                  |_        d|_        d|_/        |S )z|
    Run all validation checks for a single player prop.
    Returns a PropEligibility with the final validation state.
    r!   )r3   game_id	player_idr0   team_idr      SUPPRESSED_NO_CANONICAL_IDz!Cannot resolve canonical ID for ''Fnormalized_nameteamPLAYER_WRONG_GAME	game_teamz vs highgame_team_checkzPlayer z is on z but game is z @ )	conflict_typer0   r:   fieldofficial_valueinternal_valueseveritysourcedetailSUPPRESSED_TEAM_MISMATCHSUPPRESSED_UNAVAILABLEz is !SUPPRESSED_NOT_IN_STARTING_LINEUP!SUPPRESSED_NO_MARKET_CONFIRMATIONzNo sportsbook market found for u/    — league policy requires market confirmationTall_gates_passed)0r   r   r   r   nowr   utcr   lenr
   r=   validation_statesuppress_reasonsuppress_reason_humanpublish_allowedgetr;   r   r/   r   rL   rK   to_dictconflict_payloadroster_verified_atr   r   blocking_statusesis_blockingrM   valueavailability_verified_atr   rN   lineup_verified_atr   is_confirmed_starterr   UNKNOWNVERIFIED_PENDING_LINEUPallow_pre_lineup_propsr   market_presence_flagr   require_market_presencerO   VERIFIEDwinning_source)r0   r1   r   r   r   r   r2   r3   r4   r5   r6   r7   policy	norm_namecanonical_idrQ   elig	prop_teamrosterprop_team_uppergame_team_idsteam_in_gameconflict
team_validteam_conflictavail_statusavail_conflictlineup_statuslineup_conflict
has_markets                                 r.   determine_prop_eligibilityrz   2   s   $ F%k2I.{FCL
,,x||
$CD I* / J J;'HUV%W"$ I  ::'(I5

62.I
 DL 6y&I,VY	8T**No.N%1'#!("+D<( WYK}#C	{4H %4$L$LD!#=D )1D&$,$4$4$6D!#(D &)D#K $9NL&%
!
M m$3$L$LD!#=D )6)=)=D&$1$9$9$;D!#(D &)D#K!D $@)6+C+C$ L.  / F F7?Mn&;&;.5k]$|GYGYFZ,[ 	"$2$:$:$<D!$(+%$'D! &<Y
K&"M?  / Q QB%4%;%;" / 7 7 9$"% 9f-m6X6XL000$3$K$KD!#)#@#@D &)D# '*D#"% '|[AJ *D"v'E'Ej / Q QB-k] ;9 : 	"  %  G GG / 8 8#,DK    )(__doc__loggingr   r   typingr   r   r   r   enumsr
   r   r   r   configr   r   normalizationr   r   r   r   availabilityr   lineup_validationr   r   reconciliationr   market_ingestr   modelsr   r   	getLoggerlogr&   r$   r/   rz    r{   r.   <module>r      sO    ' , , Q Q ;  7 J 1 0 3g(  	
 	X,]]] ] 	]
 ] ] "] ] c3h(] tCH~.] d38n%] tCH~&] ]r{   