
    j"                    4   d Z ddlmZ ddl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 ddlmZmZ ddlm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ddZddZy)zHDisabled-customer registry projection and activation authority receipts.    )annotationsN)deepcopy)Path)Anycast)canonical_digestc               `    t        |       dk7  st        d | D              rt        | d      y )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_projection.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      s5    
5zR3ZTYZZE7"EFGG [    c                  t        |       }|j                  d      }t        |t              st	        d      |D cg c](  }t        |t
              r|j                  d      |k(  r|* }}t        |      dk7  rt	        d|       t        t
        t        t        f   |d         }|j                  d      durt	        d	      t        |      |d
<   |j                  dd        t        |      |d<   |S c c}w )N	customersz!registry customers must be a listcustomer_key   zunknown customer: r   enabledFz<nutrition onboarding projection requires a disabled customerprofilenutrition_profileplan)r   get
isinstancelistr   dictr   r   strobjectpop)	documentr   r   r    	projectedr   customermatchestargets	            r   project_nutrition_documentr-      s     "Ik*Ii&<== "!Hh%(,,~*F,*V 	!  
 7|q-l^<==$sF{#WQZ0Fzz)E)WXX !23F9
JJ"D)d^F6Ns   -C5c          	     X   t        |d       t        |d       t        |       j                         }|dz  dz  }|dz  }|j                  ddd	       |d
z  }	|dz  }
t	        j
                  |	t        j                  t        j                  z  d      }t	        j                  |d      5 }t        j                  |j                         t        j                         t        j                  |j                  d            }t!        |t"              st%        d      t'        ||||      }t)        |      }t+        |
      }|D ]  }|j-                  d      |k7  s|j-                  d      dk7  r,|j-                  d      |k(  r>|j-                  d      |k(  r*|j-                  d      |k(  rt#        |      c cd d d        S t%        d       t)        ||||d      }d|d||||d}t/        |
|       t1        ||       i |ddi}t/        |
|       |cd d d        S # 1 sw Y   y xY w)Nartifact_bundle_digestr   readiness_receipt_digestr   zregistry.jsondata  Tmodeparentsexist_okz%.nutrition-onboarding-projection.lockz-nutrition-onboarding-projection-journal.jsonl  zr+butf-8encodingz#registry document must be an objectr   r   r    r   state	committedcustomer_projection_digestz2conflicting nutrition onboarding projection replay)r   r/   r1   r?   nutrition_projection_v1prepared)schema_versiontransaction_idr=   r   r/   r1   r?   )r   r   resolvemkdirosopenO_CREATO_RDWRfdopenfcntlflockfilenoLOCK_EXjsonloads	read_textr"   r$   r   r-   r   _projection_rowsr!   _append_journal_atomic_registry_write)profile_rootr   r   r    r/   r1   rootregistry_path	data_root	lock_pathjournal_path
descriptorlockr(   r)   projection_digestpriorrowrC   rA   r>   s                        r   %apply_nutrition_onboarding_projectionr`   1   s    *2JK,4NO%%'D;&8MvIOOtO<CCINNLBJJ$:EBJ	:u	%DKKM5==1::m55w5GH(D)BCC.%/	
	 -Y7 .Cww~&,6#''':Jk:Y015KKGG67;SSGG89=NNCy + 
&	%, QRR  * ,*@,D.?	
 8,(&<(@*;'
 	h/}i8'I('IG['I	i0Y 
&	%	%s   +DH AH  H)c                |    d|fd|fd|fd|ffD ]  \  }}t        ||        d| ||||d}i |dt        |      iS )	Nr1   readiness_bundle_digestr?   input_reconciliation_digestr0   nutrition_activation_v2)rB   r   r1   rb   r?   rc   digestr   r   )r   r1   rb   r?   rc   r   r   receipts           r   %build_nutrition_activation_receipt_v2rh   r   sy     
$%=>	"$;<	%'AB	&(CD	u 	U+ 4$$<#:&@'BG <g;x!1'!:;;r   c                    t        | j                  d      d| v r| j                  d      n| j                  d      | j                  d      d      S )Nr   r   r   r    r<   )r   r!   )r*   s    r   $customer_nutrition_projection_digestrj      sQ    $LL8 ( Y'\\"56LL(	

 
r   c                t    d|fd|fd|ffD ]  \  }}t        ||        d| |||d}i |dt        |      iS )Nactivation_receipt_digestregistry_projection_digestowner_digestr0   (nutrition_legacy_activation_authority_v1)rB   r   rl   rm   rn   re   rf   )r   rl   rm   rn   r   r   manifests          r   !build_legacy_activation_authorityrq      sm     
%&?@	%'AB	&u
 	U+ E$%>&@$H >h="28"<==r   c               f     t        ||||      }t         fd|j                         D              S )N)r   rl   rm   rn   c              3     K   | ]A  \  }}t        j                  |      t              xr t        j                  |   |       C y w)N)r"   r!   r%   hmaccompare_digest)r   keyr   rp   s      r   r   z7validate_legacy_activation_authority.<locals>.<genexpr>   sM       +JC 	8<<$c* 	6u5	6*s   AA
)rq   allitems)rp   r   rl   rm   rn   expecteds   `     r   $validate_legacy_activation_authorityrz      s@     1!";#=!	H   #..*  r   c                    | j                         sg S g }| j                  d      j                         D ]C  }t        j                  |      }t        |t              st        d      |j                  |       E |S )Nr9   r:   z$invalid nutrition projection journal)	existsrQ   
splitlinesrO   rP   r"   r$   r   append)pathrowsliner   s       r   rR   rR      sj    ;;=	$&D0;;=ZZ%%&CDDE	 >
 Kr   c                   | j                   j                  ddd       t        j                  | t        j                  t        j
                  z  t        j                  z  d      }t        j                  |d      5 }|j                  t        j                  |dd      j                         dz          |j                          t        j                  |j                                d d d        y # 1 sw Y   y xY w)	Nr3   Tr4   r8   ab),:)	sort_keys
separators   
)parentrE   rF   rG   rH   O_APPENDO_WRONLYrJ   writerO   dumpsencodeflushfsyncrM   )r   r_   r[   handles       r   rS   rS      s    KK5$>rzzBKK7"++EuMJ	:t	$JJsdzBIIKeS	
 	
! 
%	$	$s   <A,C11C:c                f   | j                         j                  dz  }t        j                  d| j                        \  }}t        |      }	 t        j                  ||       t        j                  |dd      5 }t        j                  ||dd	       |j                  d
       |j                          t        j                  |j                                d d d        t        j                  ||        t        j                   | j                  t        j"                  t        j$                  z        }	 t        j                  |       t        j&                  |       	 |j)                  d       y # 1 sw Y   xY w# t        j&                  |       w xY w# |j)                  d       w xY w)Ni  z
.registry.)prefixdirwr9   r:   F   )ensure_asciiindent
T)
missing_ok)statst_modetempfilemkstempr   r   rF   fchmodrJ   rO   dumpr   r   r   rM   replacerG   O_RDONLYO_DIRECTORYcloseunlink)r   r(   original_moder[   	temporary	temp_pathr   	directorys           r   rT   rT      s(   IIK''%/M$,,LdkkRJ	YI*
		*m,YYz39VIIhU1ELLLLNHHV]]_%	 :
 	

9d#GGDKKr~~)EF		 HHYHHYD) :9 HHYD)s>   .F <AE6AF 8F F 6E?;F FF F0)r   r%   r   r%   returnNone)
r(   dict[str, object]r   r%   r   r   r    r   r   r   )rU   r   r   r%   r   r   r    r   r/   r%   r1   r%   r   r   )r   r%   r1   r%   rb   r%   r?   r%   rc   r%   r   dict[str, str])r*   r   r   r%   )
r   r%   rl   r%   rm   r%   rn   r%   r   r   )rp   r   r   r%   rl   r%   rm   r%   rn   r%   r   bool)r   r   r   zlist[dict[str, object]])r   r   r_   r   r   r   )r   r   r(   r   r   r   )__doc__
__future__r   rK   rt   rO   rF   r   copyr   pathlibr   typingr   r   )checkin_cli.nutrition_onboarding_contractr   r   r-   r`   rh   rj   rq   rz   rR   rS   rT   r   r   r   <module>r      sr   N "    	     FH
  )	
  6>> > )	>
 >  > "> >B<< "< !	<
 !$< "%< <4>>  #> !$	>
 > >.   #	
 !$  
*	"*r   