
    j+                    N   d Z ddlmZ ddlmZ ddlmZ ddl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mZmZmZ dd	lmZmZmZmZmZmZ  ed
d
       G d d             ZddZddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ 	 	 	 	 	 	 	 	 ddZ!	 	 	 	 	 	 	 	 ddZ"ddZ#	 	 	 	 	 	 	 	 ddZ$y)z3Artifact-specific fail-closed readiness validators.    )annotations)Mapping)	dataclass)datetime)cast)&OwnerRiskAcceptanceFinalizationContext&validate_owner_risk_acceptance_receipt)BASELINE_FIELDSCALCULATION_FIELDSDIGEST_PATTERN	KB_FIELDSKSTPOLICY_FIELDSRECONCILIATION_FIELDS)number_in_rangepositive_numberrequiredvalid_digestvalid_rule_listvalid_week_targetsT)frozenslotsc                  "    e Zd ZU ded<   ded<   y)
Validationztuple[str, ...]reasonsz
str | NonedigestN)__name__
__module____qualname____annotations__     {/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/dualcoach/profile/checkin_cli/nutrition_readiness_validators.pyr   r   !   s    r"   r   c                p    | s|d nt        t        |d         }t        t        t	        |             |      S )Nr   )r   strr   tuplesorted)r   documentr   s      r#   _resultr)   '   s2     0Td3@R6SFeF7O,f55r"   c                    t               } |j                  d       nt         t              rt	               s|j                  d       nn j                  d      dur|j                  d       nIt         j                  d      t              r d   rt         fddD              r|j                  d	       t        |       S )
Nrestriction_kb_missingrestriction_kb_staleapprovedTrestriction_kb_unapprovedsourcesc              3  T   K   | ]  }t        j                  |              ! y wN)r   get.0fieldr(   s     r#   	<genexpr>zvalidate_kb.<locals>.<genexpr>7   s.      
  U 344s   %()	allergensintolerancesreligious_ethical_exclusionsmedication_condition_ruleshard_contraindicationscross_contact_rulessubstitution_rulesrestriction_sources_incomplete)
setaddr   r   r   r2   
isinstancelistanyr)   r(   r   s   ` r#   validate_kbrE   ,   s    G,-h	*,x2H*+	j	!	-/0x||I.5	" 

 
 	457H%%r"   c                   t               }||j                  d      nd }| t        |t              r}t        |       h dk7  sm| j                  d      dk7  sY| j                  d      dusF| j                  d      |r|j                  d      nd k7  s| j                  d	      |k7  st	        |       s|j                  d
       t        ||       S )Nclinical_clearance_receipt>   r   schema_versionbaseline_digestexternal_referencecleared_for_nonmedical_coachingrH   z1.0rK   TrI   source_baseline_digestr   baseline_invalid)r?   r2   rA   r%   r   r@   r)   )r(   baseliner   expected_digests       r#   validate_clinical_clearancerP   H   s     G  	12  	/3/x=

 <<()U2<<9:$F<<)*6>HLL12DJ<<!_4H%&'7H%%r"   c                B   t               }| |j                  d       nU| j                  d      dk7  st        | t              rt        |       s|j                  d       n| j                  d      |k7  r|j                  d       t        | j                  d      dd      rt        | j                  d	      d
d      s|j                  d       | j                  d      }t        |t              rt        |t              sd|cxk  rdk  sn |j                  d       | j                  d      s|j                  d       | j                  d      s|j                  d       | j                  d      }t        |t              rt        j                  |      |j                  d       | j                  d      }|;	 t        |t        |t        | j                  d            t        |                   | j                  d      dvr$| j                  d      s|s|j                  d       | j                  d      s| j                  d       r$| j                  d      s|s|j                  d!       t!        ||       S # t        $ r |j                  d       Y w xY w)"Nbaseline_missingrH   z2.0baseline_schema_invalidcustomer_key	height_cmg      Y@g     @o@	weight_kgg      >@g     u@measurement_implausible	adult_age   x   customer_not_adultcustomer_attested_at_kstbaseline_not_customer_attestedowner_review_receiptbaseline_owner_review_missinginput_reconciliation_digestowner_risk_acceptance_receiptrL   )rT   rI   reconciliation_digest)contextrM   pregnancy_breastfeeding>   Fnot_applicablerG   0pregnancy_breastfeeding_requires_clinical_review
conditionsmedicationsmedical_clearance_required)r?   r@   r2   r   r
   r   r   rA   intboolr%   r   	fullmatchr	   r   
ValueErrorr)   )r(   rT   r   rX   r`   owner_risk_receipts         r#   validate_baselinero   h   sH    G&'%&%//2H%-.<<'<7KK12LL%ue
 k!:D%HKK12LL-	9c*)T*)c)KK,-||67KK89||23KK78&.ll)'
# 6<''(CDLKK12%\\+
 )06&B%1(+$LL)AB) /27/ LL23,- 9:% KKB LL&||M*LL56!KK457H%%+  0./0s   >:J JJc                   t               }| yt        | t              rit        |       r^|\|Z| j	                  d      |j	                  d      k7  s7| j	                  d      |j	                  d      k7  s| j	                  d      dk7  r|j                  d       n%| j	                  d      g k7  r|j                  d       t        ||       S )	NrI   r   restriction_kb_digestresolution_statusresolved customer_restrictions_unresolved!unresolved_hard_contraindications hard_contraindication_unresolved)r?   r   r   r   r2   r@   r)   )r(   rN   kbr   s       r#   validate_reconciliationrx      s    
 G"78H%:<<)*hll8.DD<</0BFF84DD<<+,
:67	9	:b	@677H%%r"   c                   t               }| |j                  d       nt        | t              rt	        |       s|j                  d       n| j                  d      dk7  r|j                  d       | j                  d      dur|j                  d       | j                  d	      }| j                  d
      }t        |t              r|r||s!t        |t              s|j                  d       | j                  d      r| j                  d      dk7  r|j                  d       t        | j                  d      | j                  d      | j                  d            s|j                  d       |4| j                  d      |j                  d      k7  r|j                  d       |4| j                  d      |j                  d      k7  r|j                  d       t        ||       S )Ncalculation_missingcalculation_inputs_stale	method_idmifflin_st_jeor_1990calculation_method_unapprovedgoal_trajectory_safeTgoal_trajectory_unsafe%requested_trajectory_within_guardrailrecommended_target_datereviewed_byreview_decisionr-   calculation_review_missingweeksminimum_calories_kcalmaximum_calories_kcalweekly_targets_incompleterI   r   rq   )r?   r@   r   r   r   r2   rA   rk   r%   r   r)   )r(   rN   rw   r   requested_saferecommended_dates         r#   validate_calculationr      s   
 G)*h 23<;Q./<<$(>>KK78<<./t;KK01!3
 $<<%
 >40#3#?""#3S9 KK01||M*hll;L.MQ[.[KK45!LL!LL01LL01

 KK34HLL1B$Cx||T\G]$]KK23>hll+BCrvvhGWWKK237H%%r"   c                "    t               } |j                  d       nt         t              rt	               r j                  d      dust         j                  d      t              rt         j                  d      t              sht        t         d         dk  sRt         j                  d            r8 j                  d      dus% j                  d      rt         fd	d
D              r|j                  d       t        |       S )Nadjustment_policy_missingr-   Tminimum_observation_days   maximum_step_kcal manual_override_receipt_requiredr   c              3  B   K   | ]  }j                  |         y wr1   r2   r3   s     r#   r6   z"validate_policy.<locals>.<genexpr>	  s)      

 U##s   )adherence_inputsactual_intake_inputsactivity_change_inputsadjustment_thresholdsescalation_rulessafety_stop_rulesadjustment_policy_unapproved)r?   r@   r   r   r   r2   rA   rj   rk   r   r   rC   r)   rD   s   ` r#   validate_policyr      s    G/0X}-H%<<
#4/(,,'ABCHhll#=>EX89:Q>x||,?@A<<:;4G||M* 



 

 	237H%%r"   c                D    t               } |j                  d       nUt               s|j                  d       n7t         fd|j	                         D              r|j                  d        j                  d      dk7  s j                  d      s|j                  d        j                  d	      s|j                  d        j                  d
      dur|j                  d
        j                  d      dur|j                  d       	 t        j                  t         j                  d                  }|j                  |j                  t              |k  r|j                  d       	 t        |       S # t        $ r |j                  d       Y (w xY w)Nreadiness_receipt_missingreadiness_receipt_invalidc              3  L   K   | ]  \  }}j                  |      |k7    y wr1   r   )r4   keyvaluer(   s      r#   r6   z#validate_receipt.<locals>.<genexpr>$  s&     M<Ljc5x||C E)<Ls   !$authority_receipt_staleprivacy_consent_versionz
privacy-v1privacy_consent_digestprivacy_consent_missingr^   delivery_enabledFactivation_enabledfeature_flags_enabledexpires_at_kst)r?   r@   r   rC   itemsr2   r   fromisoformatr%   tzinfo
astimezoner   rm   r)   )r(   expectednowr   
expires_ats   `    r#   validate_receiptr     sV   
 G/0(#/0MHNN<LMMKK12LL23|C<< 89KK12||23KK12<<*+58KK*+<<,-U:KK/0	7!//HLLAQ4R0STJ   (J,A,A#,F#,M567H%%  	3KK12	3s   -F FFN)r   zset[str]r(   Mapping[str, object] | Nonereturnr   )r(   r   r   r   )r(   r   rN   r   r   r   )r(   r   rT   r%   r   r   )r(   r   rN   r   rw   r   r   r   )r(   r   r   zMapping[str, object]r   r   r   r   )%__doc__
__future__r   collections.abcr   dataclassesr   r   typingr   +checkin_cli.nutrition_onboarding_owner_riskr   r	   (checkin_cli.nutrition_readiness_contractr
   r   r   r   r   r   r   "checkin_cli.nutrition_readiness_ior   r   r   r   r   r   r   r)   rE   rP   ro   rx   r   r   r   r!   r"   r#   <module>r      s$   9 " # !      $d#  $
6
&8&)&)& &@M&)M&M& M&`&)&)& 	$& 	&,*&)*&)*& 	$*& 	*&Z&<&)&"& 
& 	&r"   