
    j                    *   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
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	Z G d
 de
      Z G d de
      Z G d de
      Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)z;Persisted, digest-bound deterministic reconciliation state.    )annotations)Mapping)date)Literal)	BaseModel
ConfigDictFieldfield_validatormodel_validator)POLICY_DIGESTPOLICY_VERSIONClarificationPolicyResultcompile_clarification_policy)QUESTION_FIELDScanonical_digestc               b    t        |       dk7  st        d | D              rt        | d      | S )N@   c              3  $   K   | ]  }|d v 
 yw)0123456789abcdefN ).0	characters     /home/cube/projects/richard/.worktrees/nutricoach-v140-impl/dualcoach/profile/checkin_cli/nutrition_onboarding_reconciliation.py	<genexpr>z"_require_digest.<locals>.<genexpr>   s     ZTYyy0BBTYs   z# must be a lowercase SHA-256 digest)lenany
ValueError)valuefields     r   _require_digestr       s4    
5zR3ZTYZZE7"EFGGL    c                      e Zd ZU  edd      Zded<   ded<   ded<    edd	
      Zded<    ed      e	dd              Z
 ed      e	dd              Zy)PersistedIssueforbidTextrafrozenstrissue_idr   reason_code      )
min_length
max_lengthquestion_koc                    t        |d      S )Nr)   r   )r    clsr   s     r   require_issue_digestz#PersistedIssue.require_issue_digest"   s     uJ77r!   c                ,    |t         vrt        d      |S )Nzissue field is not canonical)r   r   r2   s     r   require_fieldzPersistedIssue.require_field'   s     ';<<r!   N)r   r(   returnr(   )__name__
__module____qualname__r   model_config__annotations__r	   r/   r
   classmethodr4   r6   r   r!   r   r#   r#      so    HT:LMJc:K:Z 8  !8 W  r!   r#   c                  6    e Zd ZU  edd      Zded<   ded<   y)	PersistedHoldr$   Tr%   r(   r   z3Literal['sensitive_input_requires_clinical_review']r*   N)r8   r9   r:   r   r;   r<   r   r!   r   r?   r?   /   s    HT:LJDDr!   r?   c                     e Zd ZU  edd      Zded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   dZded<   dZded<   ded<    ed	ddd      e	d$d              Z
 ed !      d%d"       Zy#)&PersistedReconciliationr$   Tr%   z,Literal['nutrition_input_reconciliation_v2']schema_versionz0Literal['nutrition_onboarding_clarification_v1']policy_versionr(   policy_digestr   reference_datecompiler_digestz!Literal['clarifying', 'resolved']stateanswers_digestdict[str, object]advisoryztuple[PersistedIssue, ...]issuesztuple[str, ...]visible_issue_idsztuple[PersistedHold, ...]holdsr   z	tuple[()]clarificationsr   z
Literal[0]current_indexdigestc           
     D    t        |t        t        |dd                  S )N
field_namerP   r1   )r    r(   getattr)r3   r   infos      r   require_digestz&PersistedReconciliation.require_digestH   s     uClH0U,VWWr!   aftermodec                   | j                   t        k7  rt        d      | j                  rdnd}| j                  |k7  rt        d      t        d | j                  D              }t        |      t        t        |            k7  rt        d      | j                  |d d k7  rt        d      | j                  d	d
h      }t        |      | j                  k7  rt        d      | S )Nz%reconciliation policy digest is stale
clarifyingresolvedz*reconciliation state does not match issuesc              3  4   K   | ]  }|j                     y w)N)r)   )r   issues     r   r   z:PersistedReconciliation.validate_record.<locals>.<genexpr>T   s     BkU%..ks   z$reconciliation issues must be unique   zvisible issue slice is stalejsonrP   )rX   excludezreconciliation digest is stale)rD   r   r   rK   rG   tupler   setrL   
model_dumpr   rP   )selfexpected_state	issue_idspayloads       r   validate_recordz'PersistedReconciliation.validate_recordM   s    .DEE)-*::'IJJBdkkBB	y>SY00CDD!!Yr]2;<<//vz/BG$3=>>r!   N)r   r(   rT   objectr7   r(   )r7   z'PersistedReconciliation')r8   r9   r:   r   r;   r<   rN   rO   r
   r=   rU   r   rh   r   r!   r   rA   rA   6   s    HT:L@@DD,,&&&&$$ "NI" !M:!K_&79I8TX  UX '" #r!   rA   c                   |j                  d      }t        |      ddhk(  rW|j                  d      dv rDt        |t              r4t	        |      dk(  r&t        |      j                  d      st        |      }n-|j                  d      dk(  rdndt        t        |            d}d	t        t        | j                  j                         | j                  | j                  rd
nd| j                  || j                  D cg c]  }|j                  d       c}t!        | j"                        | j$                  D cg c]  }|j                  d       c}g dd}t        |      |d<   |S c c}w c c}w )NrP   status>   	availableunavailabler   r   rm   rl   )rk   rP   !nutrition_input_reconciliation_v2rZ   r[   r_   rW   r   )rB   rC   rD   rE   rF   rG   rH   rJ   rK   rL   rM   rN   rO   )getrb   
isinstancer(   r   
differencedictr   r   r   rE   	isoformatresult_digestrK   rH   rc   listrL   rM   )resultrJ   advisory_digestadvisory_payloadr]   holdrg   s          r   _record_payloadrz   _   sU    ll8,OH(H--LL"&BB, B&O$//0BC>
 <<)]:  &tH~6/
 >(& //99;!//!'J //$>DmmLmU5###0mL!&":":;;A<<H<4$//v/.<H"G )1GHN MHs   >E+;E0c                    t        |d       t        | |      }|j                  |k7  rt        d      t	        ||      }t
        j                  |      j                  d      S )NrH   r1   rE   &reconciliation answers digest is staler_   rW   )r    r   rH   r   rz   rA   model_validaterc   )answersrH   rJ   rE   rv   rg   s         r   build_reconciliationr      sf     N*:;)%F .ABBfh/G"11':EE6ERRr!   c                L    t         j                  |       j                  d      S )Nr_   rW   )rA   r~   rc   )r   s    r   load_reconciliationr      s!    "11%8CCCPPr!   c                  t         j                  |       }t        ||j                        }|j                  |k7  rt        d      t        ||j                        }t         j                  |      j                  d      S )Nr|   r}   r_   rW   )	rA   r~   r   rE   rH   r   rz   rJ   rc   )r   r   rH   recordrv   rg   s         r   recompute_reconciliationr      su     %33E:F),,F .ABBffoo6G"11':EE6ERRr!   c                   t         j                  |       }|j                  dk7  rt        d      |j                  |k7  rt        d      |j                  d      S )Nr[   z$input reconciliation is not resolvedz,input reconciliation answers digest is staler_   rW   )rA   r~   rG   r   rH   rc   )r   rH   r   s      r   require_resolved_reconciliationr      sZ    
 %33E:F||z!?@@.GHH&))r!   N)r   r(   r   r(   r7   r(   )rv   r   rJ   Mapping[str, object]r7   rI   )
r   r   rH   r(   rJ   r   rE   r   r7   rI   )r   ri   r7   rI   )r   ri   r   r   rH   r(   r7   rI   )r   ri   rH   r(   r7   rI   ) __doc__
__future__r   collections.abcr   datetimer   typingr   pydanticr   r   r	   r
   r   5checkin_cli.nutrition_onboarding_clarification_policyr   r   r   r   )checkin_cli.nutrition_onboarding_contractr   r   r    r#   r?   rA   rz   r   r   r   r   r   r!   r   <module>r      s   A " #   S S  XY *EI E&i &R&%&"& &RS!S S #	S
 S S$QSS "S 	S
 S"
*
* 
* 	
*r!   