
    4iL                        d Z ddlZddlZddlZddlZddlmZ ddlmZmZm	Z	m
Z
 ddlZddlZddlmZmZmZmZmZmZ ddl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# ddl$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/m0Z0 ddl1m2Z2 ddl3m4Z4  ejj                  d      Z6	 	 ddede
e	e7      de8dee7ef   fdZ9de7de7dede2de8dee7ef   fdZ:y)z
Main orchestrator for Publishing Integrity validation runs.

Coordinates:
1. Morning full build
2. Midday confirmation
3. Pre-game final check
    N)datetime)DictAnyListOptional   )is_league_enabledPUBLISHING_INTEGRITY_ENABLED
get_policyLEAGUE_FLAGSLOG_DIRLOG_FILE)RunTypeValidationStateAuditAction)!ingest_availability_from_injuriesingest_rosters_from_pgmingest_today_gamesingest_forecast_props)ingest_market_propsingest_market_from_sgo_odds)reconcile_player_teamdetect_identity_collisionsdetect_stale_mappings)determine_prop_eligibility)suppress_ineligible_propsrestore_props_if_valid)get_connectionPropEligibilityRepoAuditLogRepoRegressionRepo)PropEligibilityRegressionFailure)IntegrityAuditLogger)trigger_alertzpub-integrityrun_typeleaguesdry_runreturnc           	         t         st        j                  d       ddiS t        t	        j
                               dd }t        || j                        }|xs* t        j                         D cg c]
  \  }}|s	| c}}}t        j                  d       t        j                  d| j                   d|        t        j                  d	d
j                  |       d|        t        j                  d       t               }d|_        i }		 |D ]#  }
t        |
      st        ||
|| ||      }||	|
<   % |s|j                          n|j!                          |j'                          |j)                         }|	|d<   t        j                  dt+        j,                  |dt                      |S c c}}w # t"        $ r' |j!                          t        j%                  d        w xY w# |j'                          w xY w)z
    Execute a full validation pass.

    Args:
        run_type: morning_full, midday_confirm, or pre_game_final
        leagues: optional filter; defaults to all enabled leagues
        dry_run: if True, don't modify any data
    u-   Publishing integrity is DISABLED — skippingstatusdisabledN   z<============================================================zPUBLISHING INTEGRITY RUN: z
 | run_id=z	Leagues: z, z | dry_run=FzValidation run failedleague_statszRun complete:    )indentdefault)r
   loginfostruuiduuid4r$   valuer   itemsjoinr   
autocommitr	   _validate_leaguecommitrollback	Exception	exceptionclosesummaryjsondumps)r&   r'   r(   run_idauditlenabledtarget_leaguesconn	all_statsleaguer.   rA   s                J/var/www/html/rainmaker/backend/scripts/publishing_integrity/scheduling.pyrun_validationrM   1   s    (@A*%%s#F 8EU\5G5G5I Uzq'W UNHHXHH)(..)9F8LMHHy>23;wiHIHHXDDO "I$ 	-F$V,+ffhwL !-If	- KKMMMO 	

mmoG'GNHH~djjCHIJKNI !V4  -.
 	

s%   1
F5<F5AF; ;0G++G. .H rK   rD   rE   c                    t         j                  d|j                          d       t        | ||      }t	        | ||      }t        | |      }t        | |      }	t        | ||      }
t        | ||      }|
|z   }t        ||      }t        |	|      }|D ]>  }|j                  dd| d|j                          t        d|j                                @ |D ]$  }|j                  dd| d|j                          & g }|D ch c]  }|j                   }}|	D ]  }|j!                  d	d
      }||v r1t#        ||d   ||d   d
|t$        j&                  dd|d    dd
      }nd}|D ]R  }|d   |d   k(  s|j!                  d      }|r0t)        |t*              r|nt+        j,                  t/        |            } n t1        |d   |j!                  dd
      |d   ||j!                  dd
      |j!                  dd
      ||||g |      }t3        j4                  | |       |j7                  |       |j8                  j:                  rt<        j>                  nt<        j@                  }|jC                  ||d   |d   ||j8                  |jD                  |jF                  |jH                          tK        | |||      }d}|tL        jN                  tL        jP                  fv rtS        | ||      }|d   dkD  rt        d||d   ||jT                  d       tW        |      tW        |	      d||tW        |      tW        |      d}t         j                  d| d tW        |	       d!|d"    d#|d    d$|d%    d&|        |S c c}w )'z.Validate all player props for a single league.z--- z ---highzIdentity collision in z: identity_collisionmediumzStale mapping in normalized_name event_idplayer_nameSUPPRESSED_IDENTITY_COLLISIONzPlayer 'u6   ' has identity collision — appears on multiple teamsF)
rD   game_id	player_idrU   team_idrK   validation_statesuppress_reasonsuppress_reason_humanpublish_allowedN	starts_at	prop_type	home_team	away_team)rU   r_   rT   rK   r`   ra   
game_startrD   roster_entriesavailability_reportslineup_datamarket_props)actionrU   rW   rK   rZ   r[   detailconflictr   
suppressedprops_suppressed)rK   countrD   r&   )gamesforecast_props)restoredidentity_collisionsstale_mappings[z	] Props: z | Verified: verifiedz | Suppressed: z | Pending: pending_lineupz | Restored: ),r2   r3   upperr   r   r   r   r   r   r   r   	log_alertrh   r%   to_dictrX   getr"   r   rV   
isinstancer   fromisoformatr4   r   r   upsertappendrZ   is_suppressedr   
SUPPRESSED	PUBLISHEDlog_decisionr[   r\   conflict_payloadr   r   MIDDAY_CONFIRMPRE_GAME_FINALr   r7   len)rI   rK   rD   r&   rE   r(   rd   rc   rm   rn   rf   
market_sgo
all_marketidentity_conflictsstale_conflictsri   eligibilitiescidentity_collision_namespropnormeligrb   gsarg   suppress_statsrestored_countr.   s                                rL   r;   r;   k   s    HHtFLLN#4() =T66R,T66BNtV,E*48N 'tVV<L,T66BJ
*J 4NFK+NNKO& @"88??BS TU*H,<,<,>?@ $ S$5fXR?P"QRS ,.M5GHHH :
xx)2. ++"Z( /!0!N!N ?(0m1D0E FB 'C %D J Z=D$44{+B+5b(+CRI_I_`cdf`gIh
 . /((;3j)((;3((;3%-%9'D  	""4.T" ,0+@+@+N+N''T_TiTi]+$!22 00--** 	 		
c:
z /t]FGTN NG**G,B,BCC/mVL l#a'(#L1 	+
 	 Un-  #"#56o.L HHq	#n"5!6 7(45 6*<89 :'(89: ;()	+ , }  Is   N)NF);__doc__r5   rB   loggingsysr   typingr   r   r   r   psycopg2psycopg2.extrasconfigr	   r
   r   r   r   r   enumsr   r   r   official_ingestr   r   r   r   market_ingestr   r   reconciliationr   r   r   eligibilityr   suppressionr   r   repositoriesr   r   r    r!   modelsr"   r#   rE   r$   alertsr%   	getLoggerr2   r4   boolrM   r;        rL   <module>r      s      
  , ,    9 8  L 
 4 J  7 ' !g(
 $(77d3i 7 7 
#s(^	7tAA A 	A
  A A 
#s(^Ar   