
    j[                     0   d Z ddlmZ ddlZddl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 d	Z G d
 de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Zd7dZi ddddddddddd dd!dd"dd#dd$dd%dd&dd'dd(dd)dd*dd+ddddddddddddddddd,Zd8d-Z d9d.Z! G d/ d0e      Z" G d1 d2e"      Z# G d3 d4e"      Z$d:d5Z%	 	 	 	 	 	 d;d6Z&y)<zAStrict, privacy-minimizing value models for nutrition onboarding.    )annotationsN)date)Decimal)StrEnum)AnySelf)	BaseModel
ConfigDictFieldfield_serializerfield_validatormodel_validatorz2.0c                      e Zd ZdZdZdZy)OnboardingSessionStatusin_progress	completed	cancelledN)__name__
__module____qualname__IN_PROGRESS	COMPLETED	CANCELLED     x/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/dualcoach/profile/checkin_cli/nutrition_onboarding_models.pyr   r          KIIr   r   c                  8    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZy)OnboardingState
collectingcustomer_attestationreconcilingsafety_holdowner_review
finalizingreadyrejectedr   expiredconsent_revokedN)r   r   r   
COLLECTINGCUSTOMER_ATTESTATIONRECONCILINGSAFETY_HOLDOWNER_REVIEW
FINALIZINGREADYREJECTEDr   EXPIREDCONSENT_REVOKEDr   r   r   r   r      s:    J1KK!LJEHIG'Or   r   c                      e Zd ZdZdZdZy)ReviewDecisionpendingapprovedr'   N)r   r   r   PENDINGAPPROVEDr1   r   r   r   r5   r5   &   s    GHHr   r5   c                      e Zd ZdZdZdZy)PublicationStatusunpublished	published	withdrawnN)r   r   r   UNPUBLISHED	PUBLISHED	WITHDRAWNr   r   r   r;   r;   ,   r   r   r;   c                      e Zd ZdZdZdZy)EquationSexBasismalefemaledeclineN)r   r   r   MALEFEMALEDECLINEr   r   r   rC   rC   2   s    DFGr   rC   c                       e Zd ZdZdZdZdZdZy)ActivityCategory	sedentarylightmoderatevery_activeextra_activeN)r   r   r   	SEDENTARYLIGHTMODERATEVERY_ACTIVEEXTRA_ACTIVEr   r   r   rK   rK   8   s    IEHK!Lr   rK   c                      e Zd ZdZdZdZy)GoalTypelossmaintaingainN)r   r   r   LOSSMAINTAINGAINr   r   r   rW   rW   @   s    DHDr   rW   c                      e Zd ZdZdZy)StructuredItemStatusnoneprovidedN)r   r   r   NONEPROVIDEDr   r   r   r_   r_   F   s    DHr   r_   c                t    t        j                  ddt        j                  d|             j	                         S )Nz\s+ NFC)resubunicodedata	normalizestripvalues    r   _normalize_textrn   K   s+    66&#{44UEBCIIKKr   rD   rE   rF   u   남성u   남성입니다u   여성u   여성입니다u   선택 안 함u   선택 안 합니다u   선택하지 않겠습니다u   네 남성입니다u   네, 남성입니다u   넵 남성입니다u   넵, 남성입니다u   예 남성입니다u   예, 남성입니다u   네 여성입니다)u   네, 여성입니다u   넵 여성입니다u   넵, 여성입니다u   예 여성입니다u   예, 여성입니다zyes malez	yes, malezyep malez	yep, malez
yes femalezyes, femalez
yep femalezyep, femalezi prefer not to sayzprefer not to sayc                |    t        | t              syt        j                  t	        |       j                               S )z;Return an enum value only for an exact supported UI answer.N)
isinstancestr_EQUATION_SEX_BASIS_ANSWERSgetrn   casefoldrl   s    r   canonical_equation_sex_basisru   s   s.    eS!&**?5+A+J+J+LMMr   c                    t        | j                         d      }d|v r |j                  d      j                  d      }|xs dS )Nf.0)formatrj   rstrip)rm   rendereds     r   _canonical_decimalr}   z   s?    eoo'-H
h??3'..s3?sr   c                       e Zd Z edd      Zy)StrictFrozenModelforbidT)extrafrozenN)r   r   r   r
   model_configr   r   r   r   r      s    HT:Lr   r   c                  n    e Zd ZU ded<   ded<    edd      edd              Z ed      dd	       Zy
)StructuredItemsr_   statustuple[str, ...]itemsbeforemodec                   t        |t        t        f      st        d      g }t	               }|D ]z  }t        |t
              st        d      t        |      }|rt        |      dkD  rt        d      |j                         }||vsY|j                  |       |j                  |       | t        |      dkD  rt        d      t        |      S )Nzitems must be a sequencezstructured items must be text   z%structured item text is out of bounds(   ztoo many structured items)rp   listtuple
ValueErrorsetrq   rn   lenrt   addappend)clsrm   resultseenrawitemkeys          r   normalize_itemszStructuredItems.normalize_items   s     %$/788Cc3' !@AA"3'D3t9s? !HII--/C$d#  v;899V}r   afterc                    | j                   t        j                  u r| j                  rt	        d      | j                   t        j
                  u r| j                  st	        d      | S )Nz none status cannot contain itemszprovided status requires items)r   r_   rb   r   r   rc   )selfs    r   validate_statuszStructuredItems.validate_status   sQ    ;;.333

?@@;;.777

=>>r   N)rm   r   returnr   r   r   )	r   r   r   __annotations__r   classmethodr   r   r   r   r   r   r   r      sH      W8,  -& '" #r   r   c                     e Zd ZU  ed      Zded<    edd      Zded<    ed	d
      Zded<   ded<    e ed       ed            Z	ded<    e ed       ed            Z
ded<   ded<   dZded<   ded<    ed ed       ed            Zd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Zd+ed,<   dZd+ed-<   dZded.<   dZded/<    ed0d1d2      Zded3<   dZded4<   d5ed6<   d7ed8<   d9ed:<    edd;<      Zd=ed><   dZd!ed?<    edd.d/d4d@A      edFdB              Z edCA      dGdD       Z eddd       dHdE       Zy)INutritionOnboardingBaselinez^1\.0$)patternrq   schema_version   P   )
min_length
max_lengthcustomer_key   x   )geleint	adult_agerC   equation_sex_basis120250r   	height_cm35300	weight_kgrK   activity_category activity_rationalerW   	goal_typeN)defaultr   r   Decimal | Nonetarget_weight_kgzdate | Nonetarget_dater   dietary_preferencesdisliked_foods	allergiesintolerancesreligious_ethical_exclusions
conditionsmedicationszbool | Nonepregnancy_breastfeedingeating_disorder_riskcooking_accessbudget_band         
meal_countschedule_constraintsr   session_statusr5   review_decisionr;   publication_statusz^[0-9a-f]{64}$)r   r   
str | Nonesource_value_digestreference_dater   r   c                    |yt        |t              st        d      t        |      }t	        |      dkD  rt        d      |S )Nr   z free-text values must be stringsi  zfree-text value is too long)rp   rq   r   rn   r   )r   rm   
normalizeds      r   normalize_free_textz/NutritionOnboardingBaseline.normalize_free_text   sJ     =%%?@@$U+
z?S :;;r   r   c                   | j                   d uxs | j                  d u}| j                  t        j                  u r|rt        d      | j                  t        j                  ur#| j                   | j                  t        d      | S )Nz%maintain goal cannot specify a targetz#target weight and date are required)r   r   r   rW   r\   r   )r   
has_targets     r   validate_goalz)NutritionOnboardingBaseline.validate_goal   s}    **$6V$:J:JRV:V
>>X...:DEE>>!2!22!!)T-=-=-EBCCr   c                     |d S t        |      S )N)r}   )r   rm   s     r   serialize_decimalsz.NutritionOnboardingBaseline.serialize_decimals   s    }tC*<U*CCr   )rm   r   r   rq   r   )rm   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s   	2NC2r:L#:bS)Is)(('%.WU^DIwD'$-GENCIwC''  ',TgdmPWX]P^'_n_#K#((##!!"11  +/[/(,+,NCKA!2J2 "#"++##))&+DBS&TT"&NK&   '" # k;0BCD DDr   r   c                   |j                   | j                   z
  |j                  |j                  f| j                  | j                  fk  z
  }d|cxk  rdk  st        d       t        d      |S )Nr   r   z$adult age must be between 18 and 120)yearmonthdayr   )date_of_birthas_ofages      r   derive_adult_ager      sr    
**}))
)	eii M$7$79J9J#KKC ?@@ ?@@Jr   c                  dd l }dd l}t        |       }|j                  dd       }t	        |t
              st        d      t        j                  |      }t        ||      |d<   ||d<   |j                  |j                  | ddd	
      j                               j                         |d<   t        j                  |      S )Nr   r   zdate_of_birth is required)r   r   r   FT),:)ensure_ascii	sort_keys
separatorsr   )hashlibjsondictpoprp   rq   r   r   fromisoformatr   sha256dumpsencode	hexdigestr   model_validate)raw_answersr   r   r   payloadraw_dobr   s          r   build_onboarding_baseliner      s    
 ;Gkk/40Ggs#455&&w/M+MGGK %G%,^^

;Udz
Zaac&ik !" '55g>>r   )rm   rq   r   rq   )rm   objectr   r   )rm   r   r   rq   )r   r   r   r   r   r   )r   zdict[str, object]r   r   r   r   )'__doc__
__future__r   rg   ri   datetimer   decimalr   enumr   typingr   r   pydanticr	   r
   r   r   r   r    NUTRITION_ONBOARDING_API_VERSIONr   r   r5   r;   rC   rK   rW   r_   rn   rr   ru   r}   r   r   r   r   r   r   r   r   <module>r     s   G " 	      e e $)  g (g (W  w "w "w 7 
L!
F!h! y! f	!
 v! h! x! i! I! #I! 6! F! 6! F! 6!  F!!" 8#!$ %#$#$$"A! HN;	 ;' D>D"3 >DB?"? ? !	?r   