
    ʙj                       U d Z ddlm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mZ ddlmZ ddlmZmZmZmZmZmZ dd	lm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#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*  ed      Z+ ejX                  d      Z- edd      Z. G d de      Z/ e0e/jb                  e/jd                  e/jf                  e/jh                  e/jj                  e/jl                  e/jn                  e/jp                  h      Z9de:d<   e9 e0e/jv                  h      z  Z<de:d<    G d de      Z= G d de      Z> G d de      Z? G d de      Z@ G d d e      ZA G d! d"e      ZB G d# d$e      ZC G d% d&e      ZD G d' d(e      ZE G d) d*e      ZFd+ZGd,e:d-<    edd.       G d/ d0             ZH edd.       G d1 d2             ZI G d3 d4e      ZJ G d5 d6e      ZK G d7 d8e      ZL G d9 d:e      ZM G d; d<e      ZN G d= d>e      ZO G d? d@e      ZP G dA dBe      ZQ G dC dDe      ZR G dE dFe      ZS G dG dHeS      ZT G dI dJeS      ZU G dK dLeS      ZV G dM dNeS      ZW G dO dPe      ZX G dQ dRe      ZYddSZZddTZ[dddU	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddWZ\	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddXZ]ddYZ^ddZZ_dd[Z`dd\Zadd]Zbdd^Zcdd_Zddd`ZeddaZfebZgecZhedZieeZjddbZkddcZldddZmddeZnddfZodddde=j                  dgddddh		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddiZq G dj dke      Zrdddddldldddddm
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddnZsdoeDj                  dp	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddqZudddddddr	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddsZvddddt	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dduZwddvZxddwZyddxZzddyZ{ddzZ| G d{ dVe      Z}dd|Z~dd}Zdd~Z G d de      Z G d de      Zy)zCCanonical profile-contract models and internal derived-view values.    )annotationsN)	dataclass)datedatetimetime	timedelta)StrEnum)Mapping)AnyFinalLiteralNotRequired	TypedDictUnpack)ZoneInfo)AliasChoices	BaseModel
ConfigDictFieldmodel_validatorValidationError)ADHERENCE_SIGNAL_SCHEMA_VERSIONAdherenceSignalCanonicalAdherenceSignal#adherence_signal_from_target_actual build_canonical_adherence_signalderive_adherence_signal!derive_canonical_adherence_signal)TrainerIntensityTrainerSessionPayloadz
Asia/Seoulz6^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?\+09:00$Tforbidfrozenextrac                  l    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d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)	EventTypez:Allowed append-only event types from the profile contract.raw_payload_archivedhistory_importedcheck_in_receivedcheck_in_validated
correctionsafety_flagcoaching_responsedecisionmorning_checkinnutrition_checkinworkout_recordsafety_audittrainer_session_recordpayment_recordsatisfaction_recordoperator_time_recorddraft_createddraft_editeddraft_approved
draft_sentschedule_referenceschedule_correctionschedule_confirmationN)__name__
__module____qualname____doc__RAW_PAYLOAD_ARCHIVEDHISTORY_IMPORTEDCHECK_IN_RECEIVEDCHECK_IN_VALIDATED
CORRECTIONSAFETY_FLAGCOACHING_RESPONSEDECISIONMORNING_CHECKINNUTRITION_CHECKINWORKOUT_RECORDSAFETY_AUDITTRAINER_SESSION_RECORDPAYMENT_RECORDSATISFACTION_RECORDOPERATOR_TIME_RECORDDRAFT_CREATEDDRAFT_EDITEDDRAFT_APPROVED
DRAFT_SENTSCHEDULE_REFERENCESCHEDULE_CORRECTIONSCHEDULE_CONFIRMATION     c/home/cube/projects/richard/.worktrees/nutricoach-v140-impl/dualcoach/profile/checkin_cli/models.pyr&   r&   +   s    D1)+-JK+H'O+%N!L5%N/1#M!L%NJ-/3rZ   r&   zFinal[frozenset[EventType]]_PILOT_EVENT_TYPES_PILOT_SAFETY_EVENT_TYPESc                  (    e Zd ZdZdZdZdZdZdZdZ	y)	ContractStatusz0Allowed status values from the profile contract.acceptedneeds_clarificationunsafe	duplicate
supersededarchivedN)
r>   r?   r@   rA   ACCEPTEDNEEDS_CLARIFICATIONUNSAFE	DUPLICATE
SUPERSEDEDARCHIVEDrY   rZ   r[   r_   r_   V   s$    :H/FIJHrZ   r_   c                      e Zd ZdZdZdZy)SafetyLevelnonemonitorstop_and_escalateN)r>   r?   r@   NONEMONITORSTOP_AND_ESCALATErY   rZ   r[   rm   rm   a   s    DG+rZ   rm   c                  $    e Zd ZdZdZdZdZdZdZy)SafetyClassurgentpaindiseaseeating_riskdrugsextreme_manipulationN)	r>   r?   r@   URGENTPAINDISEASEEATING_RISKDRUGSEXTREME_MANIPULATIONrY   rZ   r[   ru   ru   g   s!    FDGKE1rZ   ru   c                      e Zd ZdZdZy)SafetySourceFlowcustomer_checkintrainer_sessionN)r>   r?   r@   CUSTOMER_CHECKINTRAINER_SESSIONrY   rZ   r[   r   r   p   s    )'OrZ   r   c                  $    e Zd ZdZdZdZdZdZdZy)
SafetyRuleS1S2S3S4S5S6N)	r>   r?   r@   r   r   r   r   r   r   rY   rZ   r[   r   r   u   s     	B	B	B	B	B	BrZ   r   c                  X    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dZdZdZdZdZdZdZdZy)SafetyMatchedField	free_textpain_summaryoperator_notecalories_kcalstated_goalstructured_testbody_weight_kgsleep_hourssleep_quality_1to5readiness_1to5training_plantraining_summaryworkout_completionworkout_quality_1to5digestion_summarymeal_summarywater_litersappetite_stress_summarynotesN)r>   r?   r@   	FREE_TEXTPAIN_SUMMARYOPERATOR_NOTECALORIES_KCALSTATED_GOALSTRUCTURED_TESTBODY_WEIGHT_KGSLEEP_HOURSSLEEP_QUALITY_1TO5READINESS_1TO5TRAINING_PLANTRAINING_SUMMARYWORKOUT_COMPLETIONWORKOUT_QUALITY_1TO5DIGESTION_SUMMARYMEAL_SUMMARYWATER_LITERSAPPETITE_STRESS_SUMMARYNOTESrY   rZ   r[   r   r   ~   sg    I!L#M#MK'O%NK-%N#M)-1+!L!L7ErZ   r   c                      e Zd ZdZdZy)PaymentKindinitialrenewalN)r>   r?   r@   INITIALRENEWALrY   rZ   r[   r   r      s    GGrZ   r   c                      e Zd ZdZy)PaymentMethodbank_transferN)r>   r?   r@   BANK_TRANSFERrY   rZ   r[   r   r      s    #MrZ   r   c                       e Zd ZdZdZdZdZdZy)OperatorTaskdraft_reviewcustomer_message
onboarding	reportingotherN)r>   r?   r@   DRAFT_REVIEWCUSTOMER_MESSAGE
ONBOARDING	REPORTINGOTHERrY   rZ   r[   r   r      s    !L)JIErZ   r   c                      e Zd ZdZdZy)
DraftActorairichardN)r>   r?   r@   AIRICHARDrY   rZ   r[   r   r      s    	BGrZ   r   
chest_painz
Final[str]CHEST_PAIN_FLAG)r#   slotsc                  :    e Zd ZU dZded<   ded<   ded<   ded<   y)	RecordRequestz5Untrusted message boundary supplied by the local CLI.str
message_idreceived_attext
str | None
supersedesN)r>   r?   r@   rA   __annotations__rY   rZ   r[   r   r      s    ?O
IrZ   r   c                  4    e Zd ZU dZded<   ded<   dZded<   y	)
RecordResultz-Observable result returned to the CLI caller.r   outcomer   event_idrY   tuple[str, ...]safety_flagsN)r>   r?   r@   rA   r   r   rY   rZ   r[   r   r      s    7L$&L/&rZ   r   c                      e Zd ZU dZeZ edd      Zded<    edd      Z	d	ed
<    eddd      Z
ded<    edd      Zded<   y)CheckinValuesz6Validated values used by the local current-state view.r     )gtlefloat	weight_kg0u  ger   intr   N   defaultr   r   float | Noner     r   
max_lengthr   workout)r>   r?   r@   rA   _STRICT_FROZENmodel_configr   r   r   r   r   r   rY   rZ   r[   r   r      sP    @!Lc*Iu*!.M3. %dqR @K@>GZ>rZ   r   c                      e Zd ZU dZeZded<    edd      Zded<    ed	      Z	ded
<    edd      Z
ded<    edd      Zded<   y)
ProvenancezDSource identity and immutable content digest required by the schema.r   source_type      
min_lengthr   
source_refz^[a-f0-9]{64}$patterncontent_sha256Ni   r   r   section_anchor   received_message_id)r>   r?   r@   rA   r   r   r   r   r  r  r  r  rY   rZ   r[   r   r      sT    N!LqT:J:(9:NC:!&t!DNJD&+DS&IIrZ   r   c                      e Zd ZU dZ edddd      Z ed edd      d      Zde	d<   d	e	d
<   de	d<    edd      Z
de	d<   de	d<    ed      edd              Zedd       Zy)SafetyReasonz1One bounded, typed explanation for a safety hold.Tr!   )r#   r$   populate_by_nameserialize_by_aliasclassclass_)aliasvalidation_aliasserialization_aliasru   r   source_flowr   matched_fieldr      r   r   excerptr   rule_idbeforemodec                    t        |t              rd|vr|S dj                  d t        |d         D              }dj                  |j	                               }t        |      }||d<   |S )Nr   c              3  \   K   | ]$  }t        |      d k\  st        |      dk7  s!| & yw)       N)ord).0	characters     r[   	<genexpr>z1SafetyReason.normalize_excerpt.<locals>.<genexpr>   s<       E8N9RUV_R`dhRhmpqzm{  @D  nDY8Ns   ,,, )
isinstancer
   joinr   splitdict)clsvalues
normalizedresults       r[   normalize_excerptzSafetyReason.normalize_excerpt   sp     &'*iv.EMWW  EF9<M8N  E  E
XXj..01
f&yrZ   c                .    | j                   j                  S )zDReturn the JSON-facing safety class without using the reserved word.)r  valueselfs    r[   
class_namezSafetyReason.class_name   s     {{   rZ   Nr)  r   returnr   r3  r   )r>   r?   r@   rA   r   r   r   r   r  r   r  r   classmethodr,  propertyr1  rY   rZ   r[   r
  r
     s    ;	L  %h8#FK 
 "!%%A#6GS6(#  $ ! !rZ   r
  c                      e Zd ZU dZeZded<    ed      Zded<   dZ	d	ed
<    edd      Z
ded<    ed      dd       Zy)Safetyz.Safety disposition required for unsafe events.rm   level   )r   r   signalsFboolcoaching_heldrY      r   ztuple[SafetyReason, ...]reasonsafterr  c                   t        d | j                  D              }t        t        |            t        |      k7  rt	        d      | j                  r3| j
                  r| j                  t        j                  u rt	        d      | S )Nc              3  b   K   | ]'  }|j                   |j                  |j                  f ) y wN)r  r  r  )r   reasons     r[   r"  z*Safety.validate_reasons.<locals>.<genexpr>  s)     gZfPVfnnf&:&:FNNKZfs   -/zDsafety reasons must be unique by rule_id, matched_field, and excerptz+safety reasons require held non-none safety)	tupler?  lenset
ValueErrorr=  r9  rm   rq   )r0  keyss     r[   validate_reasonszSafety.validate_reasons  sj    gZ^ZfZfggs4y>SY&cdd<<!3!3tzz[EUEU7UJKKrZ   N)r3  r8  )r>   r?   r@   rA   r   r   r   r   r;  r=  r?  r   rJ  rY   rZ   r[   r8  r8     sR    8!L$3G_3M4(-bQ(GG%G'" #rZ   r8  c                  F   e Zd ZU dZeZ eddd      Zded<    eddd	      Z	d
ed<    eddd	      Z
d
ed<    eddd	      Zd
ed<    eddd	      Zd
ed<    eddd	      Zded<    eddd	      Zd
ed<    eddd	      Zd
ed<    edd      Zded<    edd      Zded<    edd      Zded<    eddd	      Zd
ed<    edd      Zded<    edd      Zded <    eddd!	      Zded"<    edd      Zded#<    edd      Zded$<    edd      Zded%<   y)&ContractCheckinzGSchema-named representation of live or partial historical measurements.Nr   r   )r   r   r   r   r   r   r   
int | Noner   i  	protein_g  carbohydrate_gfat_gr   r   r      r   r   r   r   r   r   r   P   r   r   r   r      r   r   r   r   )r>   r?   r@   rA   r   r   r   r   r   r   rN  rP  rQ  r   r   r   r   r   r   r   r   r   r   r   r   r   rY   rZ   r[   rL  rL    sV   Q!L#(!#DNLD %dqU CM:C!$1?Iz?!&te!DNJDdqU;E:; %dqR @K@%*4A!%D
D!&ta!@NJ@#($#GjG %dt DM:D%*4B%G
G',TaA'F*F$)$4$HzH$TdCL*C!&tb!AL,A*/*NZN$TdCL*Cdt<E:<rZ   rL  c                       e Zd ZU dZeZded<   y)ImportManifestz@Typed source-day identity required for schema-2 history imports.r   observation_kst_dayNr>   r?   r@   rA   r   r   r   rY   rZ   r[   rV  rV  '  s    J!LrZ   rV  c                  R    e Zd ZU dZeZded<   ded<   ded<   ded<   ded	<   d
ed<   y)PaymentPayloadzBTyped payment record; pilot payment terms are intentionally exact.zLiteral[150000]
amount_krwr   paid_onperiod_start_onperiod_end_onzLiteral['bank_transfer']methodr   kindNrX  rY   rZ   r[   rZ  rZ  1  s-    L!LM$$
rZ   rZ  c                      e Zd ZU dZ eddd      Z edd edd      	      Zd
e	d<    e edd            Z
de	d<    edd      Zde	d<   edd       Zedd       Zy)SatisfactionPayloadz#Typed customer satisfaction record.Tr!   r#   r$   r  r   
   score_1to10score)r   r   r  r   collected_oncollection_dater  r   NrO  r   r   notec                    | j                   S rC  )rg  r/  s    r[   rh  z#SatisfactionPayload.collection_dateG         rZ   c                    | j                   S rC  )re  r/  s    r[   rf  zSatisfactionPayload.scoreK  s    rZ   r3  r   )r3  r   )r>   r?   r@   rA   r   r   r   r   re  r   rg  rj  r6  rh  rf  rY   rZ   r[   rb  rb  >  s|    -TDQLb<W^;_`K`^M^0_`L$`Td;D*;! !    rZ   rb  c                      e Zd ZU dZ eddd      Z ed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d            Zded<    eddd      Zded<   edd       Zy)OperatorTimePayloadzBTyped immutable operator work entry and retry/correction identity.Tr!   rc     rS  r   r   entry_id
attempt_idr   iX  r   r   minutesr   task	work_datework_onri  r   Nr   r  r   r   supersedes_entry_idc                    | j                   S rC  )rv  r/  s    r[   rw  zOperatorTimePayload.work_on\  s    ~~rZ   rn  )r>   r?   r@   rA   r   r   r   rr  r   rs  rt  r   rv  ry  r6  rw  rY   rZ   r[   rp  rp  P  s    LTDQLRB7Hc7rb9J9A#&GS&
\+y-QRItR&+DRTV&WW rZ   rp  c                      e Zd ZU dZ edd      Z edd      Zded	<   d
ed<    edd      Z	ded<    eddd      Z
ded<    eddd      Zded<    eddd      Zded<    eddd      Zded<   y)DraftPayloadz>Typed audit payload shared by the four draft lifecycle events.Tr!   r"   r      r   r   draft_idr   actori@  r   Nrx  r   
session_idedited_from_draft_idapproved_from_draft_idapproved_message_id)r>   r?   r@   rA   r   r   r   r~  r   r   r  r  r  r  rY   rZ   r[   r|  r|  a  s    HT:LQ37Hc7t4D#4"4A#NJ
N',TaTW'X*X).tVY)ZJZ&+DQSV&WWrZ   r|  c                      e Zd Zy)DraftCreatedPayloadNr>   r?   r@   rY   rZ   r[   r  r  q      rZ   r  c                      e Zd Zy)DraftEditedPayloadNr  rY   rZ   r[   r  r  u  r  rZ   r  c                      e Zd Zy)DraftApprovedPayloadNr  rY   rZ   r[   r  r  y  r  rZ   r  c                      e Zd Zy)DraftSentPayloadNr  rY   rZ   r[   r  r  }  r  rZ   r  c                      e Zd ZU dZeZ edd      Zded<   ded<   d	ed
<   ded<   ded<    edd      Z	ded<    edd      Z
ded<    ed      dd       Zy)ScheduleReferencePayloadzFMinimal, dual-confirmed source fact for the current training schedule.r   @   r   r   customer_keyr   session_kst_dater   session_start_kstr<  customer_confirmedowner_confirmedr   last_change_noteN^[0-9a-f]{64}$r   r  r   predecessor_digestr@  r  c                L    | j                   r| j                  st        d      | S )Nz.schedule reference requires both confirmations)r  r  rH  r/  s    r[   require_dual_confirmationz2ScheduleReferencePayload.require_dual_confirmation  s$    &&d.B.BMNNrZ   )r3  r  )r>   r?   r@   rA   r   r   r   r  r   r  r  r   r  rY   rZ   r[   r  r    so    P!Lr:L#:!Q3?c?%*4AR%S
S'" #rZ   r  c                      e Zd ZU dZeZ ed      Zded<    ed      Z	ded<    edd	
      Z
ded<    ed      Zded<   y)ScheduleConfirmationPayloadzEOperator confirmation pinned to one exact current schedule reference.^[a-z0-9][a-z0-9_-]{7,127}$r  r   reference_event_idr  reference_digestr   r}  r   actor_id
pin_digestN)r>   r?   r@   rA   r   r   r   r  r   r  r  r  rY   rZ   r[   r  r    sM    O!L#,JKK!*;<c<Q37Hc7$56J6rZ   r  c                6    dt        |        dt        |       S )Nzschedule-reference::_customer_key	_iso_date)r  r  s     r[   schedule_reference_dedupe_keyr    s"     |!< =QyIY?Z>[\\rZ   c                r    t        j                  d|      st        d      dt        |        d| d|d d  S )Nz[0-9a-f]{64}z)reference_digest must be a SHA-256 digestzschedule-confirmation:r  rq  )re	fullmatchrH  r  )r  r  r  s      r[    schedule_confirmation_dedupe_keyr    sJ    <<)9:DEE#M,$?#@BTAUUVWghkikWlVmnnrZ   )r   r  Eventc               f   t        |t              rt        j                  |      n|}	t	        t        |       t        j                  t        |            |	||||      }
|rt        j                  nt        j                  }t        | |      }|r| dt        |
      d d  }t        |d|
| ||j                  d      xs t        |       d|	j                          d|j                  d      |j                  d	      |j                  d
      |j                  dt         j"                        |      S )N)r  r  r  r  r  r  r  :correction:rq  r;   occurred_at_kstTz+09:00recorded_at_kstr   
provenancestatus)r  r  r   r  r  r   )r$  r   r   fromisoformatr  r  r   r  r&   rW   rV   r  _payload_digest_pilot_eventget	isoformatr_   rf   )r  r  r  r  r  r  r   r  kwargsparsed_startpayload
event_typekeys                r[   build_schedule_reference_eventr    s#    =GGXZ]<^4%%&78duL&"<0++I6F,GH&-')-G 3=..)B^B^J
'6F
GC\/'":3B"?!@A('<

#45zIFV<W;XXYZfZpZpZrYssy9z

#45

:@V::l+FJJxI`I`4a rZ   c                0   t        ||||      }t        t        j                  d|| t	        | ||      |j                  d      |j                  d      |j                  d      |j                  d      |j                  dt        j                        
      S )	N)r  r  r  r  r=   r  r  r   r  r  )r  r  r   r  r  )r  r  r&   rX   r  r  r_   rf   )r  r  r  r  r  r  r  s          r[   !build_schedule_confirmation_eventr    s     *-@PjG '')@'<(7IK[\

#45vzzRcGdJ'FJJ|4Lzz(N$;$;< rZ   c                    t        | t              r|D ]  }t        | |d       }||c S  y t        | t              r|D ]  }|| v s| |   | |   c S  y rC  )r$  r   getattrr
   )r.  namesname	candidates       r[   _valuer    sh    %#DtT2I$    %!Du}t!8T{"  rZ   c                    t        | t              r| j                         j                         S t        | t              r| j                         S t        j                  t        |       d d       j                         S )Nrd  )r$  r   r   r  r  r   r.  s    r[   r  r    s\    %"zz|%%''%  c%j"o.88::rZ   c                    t        j                  t        |             }|j                         }|j                  dd|j
                  dS )N04dz-W02d)r   r  r  isocalendaryearweek)r.  parsedisos      r[   	_iso_weekr    sB    	% 01F



Chhs^2chhs^,,rZ   c                \    t        | t              r| rt        |       dkD  rt        d      | S )Nr  zDcustomer_key must be a non-empty string no longer than 64 characters)r$  r   rF  rH  r  s    r[   r  r    s)    eS!#e*r/_``LrZ   c                6    dt        |        dt        |       S )Nztrainer-session:r  r  )r  kst_dates     r[   trainer_session_dedupe_keyr    s!    mL9:!Ih<O;PQQrZ   c                b    dt        |        dt        |      j                   dt        |       S )Nzpayment:r  )r  r   r.  r  )r  r`  r]  s      r[   payment_dedupe_keyr    s4    mL12!K4E4K4K3LAiXgNhMijjrZ   c                    t        |t              r|j                  d      st        |      n|}dt	        |        d| S )N20zsatisfaction:r  )r$  r   
startswithr  r  )r  iso_weekr  s      r[   satisfaction_dedupe_keyr    s?    &03&?xGZGZ[_G`9XfnD=67q??rZ   c                $    dt        |        d| S )Nzoperator-time:r  )r  )r  rr  s     r[   operator_time_dedupe_keyr  
  s    M,78(DDrZ   c                8   t        |       j                  }|t         j                  j                  t         j                  j                  t         j                  j                  t         j
                  j                  hvrt        d      | dt        |       d| S )Nz6draft dedupe keys require a draft lifecycle event typer  )r&   r.  rR   rS   rT   rU   rH  r  )r  r  r~  event_values       r[   draft_dedupe_keyr    s    J'--K%%$$  &&""	  QRR]!M,78(DDrZ   c                    t        j                  t        |       j                   d| j	                               j                         d d }d| S )Nr  r   pilot_)hashlibsha256r&   r.  encode	hexdigest)r  
dedupe_keydigests      r[   	_event_idr  !  sO    ^^y4::;1ZLIPPRS]]_`cacdFF8rZ   c                    t        | t              rt        j                  |       y	 t	        j
                  |       }|j                         t        d      k(  S # t        $ r Y yw xY w)NF	   )hours)	r$  r   _RFC3339_KSTr  r   r  rH  	utcoffsetr   )r.  r  s     r[   _is_kst_rfc3339r  &  sc    eS!\%;%;E%B%J''. !333  s   A 	A&%A&c                 P    t        j                  t              j                         S rC  )r   now_KSTr  rY   rZ   r[   _now_kstr  0  s    <<''))rZ   c                    t        | t              rS| j                  $| j                  t              j                         S | j                  t              j                         S t        |        dS )N)tzinfozT00:00:00+09:00)r$  r   r  replacer  r  
astimezoner  )days    r[   _at_kstr  4  sZ    #x ::;;d;+5577~~d#--//n_--rZ   c                    t        j                  | j                  d      ddd      }t        j                  |j                               j                         S )Njsonr  FT),r  )ensure_ascii	sort_keys
separators)r  dumps
model_dumpr  r  r  r  )r  encodeds     r[   r  r  <  sE    jj+++8uX\istG>>'..*+5577rZ   1.0)	r   r  r  r  r  schema_versionr   safetypayload_refc       	           t        |      }|xs
 t               }|xs' t        dd| d| j                   t	        |            }t
        j                  d|xs t        | |      d| d|xs |d|d	|
d
|d|	d|d|||d|d|i      S )Nmanualzpilot:r  )r   r  r  r   r  r  r  r  r  r  r   r  r  r  )r  r  r   r.  r  r  model_validater  )r  payload_namer  r  r  r   r  r  r  r  r  r   r  r  recordedsources                   r[   r  r  A  s    " !.L,(*H :L>:+;+;*<=&w/F
 EIj*$E*:(xn&f**'f;	
 rZ   c                  h    e Zd ZU 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<   y)TrainerSessionEventOptionszNotRequired[str | None]r  r  r   zNotRequired[Provenance | None]r  zNotRequired[ContractStatus]r  z"NotRequired[Literal['1.0', '2.0']]r  r   zNotRequired[Safety | None]r  r  N)r>   r?   r@   r   rY   rZ   r[   r  r  l  s8    ,,,,%%..''66''&&((rZ   r  r  )
session_doneperformance_1to5intensity_vs_planr   workout_summaryr   doneperformance	intensityrw   c       
        6   t        j                  ||n|||n|	||n|
||n|||d      }|j                  d      }t        | |      }|r| dt	        |      d d  }t        t        j                  d|| ||j                  d      xs t        |      |j                  d      |j                  d      |j                  d	      |j                  d
t        j                        |j                  dd      ||j                  d      |j                  d            S )N)r  r  r  r   r  r   r   r  rq  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&   rN   r  r_   rf   )r  r  r  r  r  r   r  r   r  r  r  rw   r  r  r   r  s                   r[   build_trainer_session_eventr  w  s#     $22,8,DL$$4$@ k &7%B!	,8,DL$.*	
G L)J
$\8
<C\/'":3B"?!@A((

#45J9J

#45J'::l+zz(N$;$;<zz"2E:zz(#JJ}- rZ   iI )r[  r_  c                  t        ||||||      }t        | |j                  |j                        }	t	        t
        j                  d|| |	|j                  d      xs t        |j                        |j                  d      |j                  d      |j                  d      |j                  dt        j                        |j                  dd	      |j                  d
      |j                  d      |j                  d            S )N)r[  r\  r]  r^  r_  r`  paymentr  r  r   r  r  r  r  r   r  r  r  )rZ  r  r`  r]  r  r&   rO   r  r  r\  r_   rf   )
r  r[  r\  r]  r^  r_  r`  r  r  r  s
             r[   build_payment_eventr    s     '#G \7<<9P9P
QC  

#45Q9Q

#45J'::l+zz(N$;$;<zz"2E:::l+zz(#JJ}- rZ   )re  rg  rj  rf  rh  r  c               >   t        ||n|||n||      }t        |j                        }	|||	k7  rt        d      t	        | |	      }
t        t        j                  d|| |
|j                  d      xs t        |j                        |j                  d      |j                  d      |j                  d      |j                  dt        j                        |j                  d	d
      |j                  d      |j                  d      |j                  d            S )N)re  rg  rj  z-iso_week must match satisfaction collected_onsatisfactionr  r  r   r  r  r  r  r   r  r  r  )rb  r  rg  rH  r  r  r&   rP   r  r  r_   rf   )r  re  rg  rj  rf  rh  r  r  r  expected_iso_weekr  s              r[   build_satisfaction_eventr!    s
    "#.#:K%1%=\?G
 "'"6"67,= =HII
!,0A
BC%%

#45VAUAU9V

#45J'::l+zz(N$;$;<zz"2E:::l+zz(#JJ}- rZ   )rv  rw  ry  c                  t        ||||||n||      }	t        | |	j                        }
t        t        j
                  d|	| |
|j                  d      xs t        |	j                        |j                  d      |j                  d      |j                  d      |j                  dt        j                        |j                  dd	      |j                  d
      |j                  d      |j                  d            S )N)rr  rs  rt  ru  rv  ry  operator_timer  r  r   r  r  r  r  r   r  r  r  )rp  r  rr  r  r&   rQ   r  r  rv  r_   rf   )r  rr  rs  rt  ru  rv  rw  ry  r  r  r  s              r[   build_operator_time_eventr$    s     "(4)'/G #<1A1A
BC&&

#45SARAR9S

#45J'::l+zz(N$;$;<zz"2E:::l+zz(#JJ}- rZ   c                   t        |j                  d      |j                  d      |j                  d      |j                  dd       |j                  dd       |j                  dd       |j                  dd             }t        | ||j                        }t	        | d	||||j                  d
      |j                  d      |j                  d      |j                  d      |j                  dt        j                        |j                  dd      |j                  d      |j                  d      |j                  d            S )Nr~  r  r   r  r  r  r  )r~  r  r   r  r  r  r  draftr  r  r   r  r  r  r  r   r  r  r  )r|  popr  r~  r  r  r_   rf   )r  r  r)  r  r  s        r[   _build_draft_eventr(    s   J'jj!ZZ::lD1#ZZ(>E%zz*BDI"JJ'<dCG :|W5E5E
FC

#45

#45J'::l+zz(N$;$;<zz"2E:::l+zz(#JJ}- rZ   c                @    t        t        j                  | f|||d|S N)r~  r  r   )r(  r&   rR   r  r~  r  r   r  s        r[   build_draft_created_eventr,  ;  s&    i55|yh^cjnyrxyyrZ   c                @    t        t        j                  | f|||d|S r*  )r(  r&   rS   r+  s        r[   build_draft_edited_eventr.  ?  s&    i44lxX]bimxqwxxrZ   c                @    t        t        j                  | f|||d|S r*  )r(  r&   rT   r+  s        r[   build_draft_approved_eventr0  C  s&    i66zx_dkozsyzzrZ   c                @    t        t        j                  | f|||d|S r*  )r(  r&   rU   r+  s        r[   build_draft_sent_eventr2  G  s&    i22Lv8[`gkvouvvrZ   c                  2   e Zd ZU dZeZ ed      Zded<   ded<   ded<   ded	<   d
Z	ded<   ded<   ded<    edd      Z
ded<    edd      Zded<   dZded<   dZded<   dZded<   dZded <   dZd!ed"<   dZd#ed$<   dZd%ed&<   dZd'ed(<   dZd)ed*<   dZd+ed,<    edd-.      Zded/<    ed01      ed=d2              Z ed31      d>d4       Zed?d5       Zed@d6       ZedAd7       ZedBd8       ZedCd9       Z edCd:       Z!edCd;       Z"edCd<       Z#y)Dr  z'One schema-conformant immutable record.r  r  r   r   r&   r  r  r  r  Literal['1.0', '2.0']r  r   r  r_   r  Nr  r   r   rq  r  r   r  zContractCheckin | Nonecheck_inSafety | Noner  TrainerSessionPayload | Noner   PaymentPayload | Noner  SatisfactionPayload | Noner  OperatorTimePayload | Noner#  DraftPayload | Noner&  zScheduleReferencePayload | Noner;   z"ScheduleConfirmationPayload | Noner=   zImportManifest | Noneimport_manifestr   r   r  r  r  c                   t        |t              s|S t        |      }|j                  d      dvr|S t	        t        |j                  d      d|j                  dd                  }t        |j                  d            }t        j                  j                  dt        j                  j                  dt        j                  j                  d	t        j                  j                  d
t        j                  j                  dt        j                  j                  dt        j                  j                  dt        j                   j                  dt        j"                  j                  dt        j$                  j                  dt        j&                  j                  dij                  |      }|r|j                  |      nd }d }|dk(  r8|6t)        |t+        |dd      xs t-        d|j                  d      i            }n|dk(  r$|"t/        |t+        |d      t+        |d            }n|d	k(  r|t1        |t+        |dd            }n|d
k(  r"| t3        |t	        t+        |d                  }n|dk(  r#|!t5        ||t	        t+        |d                  }nX|dk(  r|t7        |t+        |d            }n:|dk(  r5|3t9        |t	        t+        |d            t	        t+        |d                  }|Ot	        |j                  dd            }dt;        j<                  |j?                               jA                          }||d<   |S )Nr  )Nr  r  r.  r  r  r   r  r  r#  r&  r;   r=   r  rv  occurred_atr`  r]  rg  rh  rr  r~  r  r  r  r   zevent:)!r$  r
   r'  r  r   r  _infer_customer_keyr&   rN   r.  rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   r  r  _occurred_dater  r  r  r  r  r  r  r  r  r  )	r(  r)  datar  customerr  r  inferredr   s	            r[   fill_dedupe_keyzEvent.fill_dedupe_keye  s    &'*MF|88L!3K,!7$((<Y[B\]^
&txx'=>,,224E$$**I))//**00/##))7""(('$$**G  &&((..0D))//1E++113J
 #j/ 	 -9$((<(d#,,1D1w
K8 L!=$((=2I"JKH
 Y&7+>)(F7F4KVT[]nMopH^+0C.xYj9klH_,1D/#fWj>Y:Z[HW$)<'
Hc&R\B]>^_H11g6I4XvgOa?bcH449L7#fW.BCDc&QXZlJmFnH 488J34Hx/@ A K K MNOH%\rZ   r@  c                   t         j                  j                  ht         j                  j                  ht         j                  j                  ht         j
                  j                  ht         j                  j                  t         j                  j                  t         j                  j                  t         j                  j                  ht         j                  j                  t         j                  j                  ht         j                  j                  hd}| j                  j                  }|j                         D ]@  \  }}t        | |      d u}||v r|st!        | d|       |s-||vs2t!        | d|        | j                  t         j                  u r9| j"                  "| j$                  | j$                  j&                  t!        d      | j                  t         j                  u r| j"                  t!        d      | j(                  t*        j,                  u r| j.                  t!        d      | j                  t         j0                  u r| j(                  t*        j2                  urt!        d      | j4                  dk(  r| j6                  }t!        d	      | j6                  D| j6                  j8                  t;        j<                  | j>                        jA                         k7  r"t!        d
      | j6                  t!        d      | j                  tB        v r_| j.                  S| j(                  t*        j,                  u s| j.                  jD                  r!| j.                  jF                  st!        d      | j                  tH        v r| jJ                  t!        d      | j                  tH        v r| j4                  dk7  rt!        d      dD ]%  }tM        t        | |            rt!        | d       | S )N)r   r  r  r#  r&  r;   r=   z
 requires z is not valid for z@schedule correction requires supersession and predecessor digestz2schedule confirmation cannot supersede a referencezunsafe events require safetyz history imports must be archivedr  z5schema-1 history imports must not set import_manifestzHschema-2 history imports require a manifest day matching occurred_at_kstz2import_manifest is valid only for history_importedz@pilot unsafe/held events require at least one typed SafetyReasonz8pilot events must not set payload_ref (payload sidecars)z(pilot events must use schema version 1.0)r  r  z4 must be an RFC3339 timestamp with KST offset +09:00)'r&   rN   r.  rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   r  itemsr  rH  r   r;   r  r  r_   rh   r  rC   rk   r  r<  rW  r   r  r  r   r]   r=  r?  r\   r  r  )r0  payloadsr  
field_nameallowed_typespresents         r[   validate_discriminatorzEvent.validate_discriminator  sa    !* @ @ F FG!00667&::@@A'<<BBC''--&&,,((..$$**	 $-#?#?#E#EyGdGdGjGj"k&/&E&E&K&K%L
 oo++)1)9%JdJ/t;Gm+G K=
:,!GHH;m; J</A+!OPP *: ??i;;;&$*A*A*ITMdMdMwMwM !cdd??i===$//B]QRR;;.///DKK4G;<<??i888{{."9"99 !CDD""e+''3$%\]]$$,'';;))$*>*>?DDFG !^  !!-QRROO88' 5 559R9RKK''_``??00T5E5E5QWXX??00T5H5HE5QGHH@J"74#<= J</c!dee A rZ   c                    | j                   S rC  )r   r/  s    r[   r3   zEvent.trainer_session_record  s    ###rZ   c                    | j                   S rC  )r  r/  s    r[   r4   zEvent.payment_record  s    ||rZ   c                    | j                   S rC  )r  r/  s    r[   r5   zEvent.satisfaction_record  rl  rZ   c                    | j                   S rC  )r#  r/  s    r[   r6   zEvent.operator_time_record  s    !!!rZ   c                V    | j                   t        j                  u r| j                  S d S rC  )r  r&   rR   r&  r/  s    r[   r7   zEvent.draft_created  s"    !__	0G0GGtzzQTQrZ   c                V    | j                   t        j                  u r| j                  S d S rC  )r  r&   rS   r&  r/  s    r[   r8   zEvent.draft_edited  s"    !__	0F0FFtzzPDPrZ   c                V    | j                   t        j                  u r| j                  S d S rC  )r  r&   rT   r&  r/  s    r[   r9   zEvent.draft_approved  s"    !__	0H0HHtzzRdRrZ   c                V    | j                   t        j                  u r| j                  S d S rC  )r  r&   rU   r&  r/  s    r[   r:   zEvent.draft_sent  s"    !__	0D0DDtzzN$NrZ   r2  )r3  r  )r3  r7  )r3  r8  )r3  r9  )r3  r:  )r3  r;  )$r>   r?   r@   rA   r   r   r   r   r   r  r   r  r5  r  r   r  r  r#  r&  r;   r=   r<  r  r   r5  rD  rK  r6  r3   r4   r5   r6   r7   r8   r9   r:   rY   rZ   r[   r  r  K  s   1!L"@AHcA,1N)1"49WXJ
Xrc:J:'+H$+ FM 48O18%)G")/3L,304M-4!%E%:>7>@D=D-1O*1#DTBKB(#/  $/b '"; #;z $ $   ! ! " " R R Q Q S S O OrZ   c                    t        | d      }t        |t              r2|r0|j                  d      }t	        |      dk\  r|d   dv r
|d   r|d   S y)Nr  r     r   >   pilotrB  r   unknown_customer)r  r$  r   r&  rF  )r  r  partss      r[   r?  r?    sS    
L1J*c"z  %u:?uQx+@@U1X8OrZ   c                    | j                  d      }t        |t              rt        |      dk\  r|d d S t	        j
                         j                         S )Nr  rd  )r  r$  r   rF  r   todayr  )r)  occurreds     r[   r@  r@     sG    zz+,H(C S]b%8}::<!!##rZ   c                    	 t        | t              r| S t        j                  |       S # t        $ r}t	        dt        |      z         |d}~ww xY w)zCValidate an event against the package-owned strict canonical model.z,event does not conform to canonical schema: N)r$  r  r  r   rH  r   )eventexcs     r[   validate_eventr_    sQ    ]"5%0uQe6J6J56QQ ]G#c(RSY\\]s   ) ) 	AA

Ac                  *    e Zd ZU dZeZded<   ded<   y)CurrentViewz=Rebuildable current state containing only eligible check-ins.ztuple[CheckinValues, ...]eligible_checkinsr   r   NrX  rY   rZ   r[   ra  ra    s    G!L00!!rZ   ra  c                  j    e Zd ZU dZeZ ed      Zded<    ed      Z	ded<    ed      Z
ded<   y)	
WeeklyViewz-Small rebuildable weekly operational summary.r   )r   r   eligible_countclarification_counturgent_safety_countN)r>   r?   r@   rA   r   r   r   re  r   rf  rg  rY   rZ   r[   rd  rd    s6    7!L1+NC%${*${*rZ   rd  )r  r   r  date | datetime | strr3  r   )r  r   r  r   r  r   r3  r   )r  r   r  rh  r  z
time | strr  r<  r  r<  r  r   r   r   r  r   r  r   r3  r  )r  r   r  r   r  r   r  r   r  r   r  r   r3  r  )r.  r   r  r   r3  r   )r.  rh  r3  r   )r.  r   r3  r   )r  r   r  rh  r3  r   )r  r   r`  PaymentKind | strr]  rh  r3  r   )r  r   r  rh  r3  r   )r  r   rr  r   r3  r   )r  EventType | strr  r   r~  r   r3  r   )r  rj  r  r   r3  r   )r.  objectr3  r<  r4  )r  rh  r3  r   )r  r   r3  r   )r  r&   r  r   r  r   r  r   r  r   r   r   r  r   r  r   r  zProvenance | Noner  r_   r  r4  r   r   r  r6  r  r   r3  r  )r  r   r  rh  r  bool | Noner  rM  r  TrainerIntensity | str | Noner   r   r  r   r   r   r  rl  r  rM  r  rm  rw   r   r  z"Unpack[TrainerSessionEventOptions]r3  r  )r  r   r[  r   r\  
date | strr]  rn  r^  rn  r_  zPaymentMethod | strr`  ri  r  r   r3  r  )r  r   re  rM  rg  date | str | Nonerj  r   rf  rM  rh  ro  r  r   r  r   r3  r  )r  r   rr  r   rs  r   rt  r   ru  zOperatorTask | strrv  ro  rw  ro  ry  r   r  r   r3  r  )r  r&   r  r   r)  r   r3  r  )r  r   r~  r   r  zDraftActor | strr   r   r  r   r3  r  )r  r   r3  r   )r)  zMapping[str, Any]r3  r   )r]  zEvent | Mapping[str, Any]r3  r  )rA   
__future__r   r  r  r  dataclassesr   r   r   r   r   enumr	   collections.abcr
   typingr   r   r   r   r   r   zoneinfor   pydanticr   r   r   r   r   r   .checkin_cli.weekly_operations_domain_adherencer   r   r   r   r   r   r   ,checkin_cli.weekly_operations_domain_trainerr   r    r  compiler  r   r&   	frozensetrN   rO   rP   rQ   rR   rS   rT   rU   r\   r   rM   r]   r_   rm   ru   r   r   r   r   r   r   r   r   r   r   r   r   r
  r8  rL  rV  rZ  rb  rp  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  trainer_session_keypayment_keysatisfaction_keyoperator_time_keyr  r  r  r  r  rf   r  r  r  r   r  r!  r$  r(  r,  r.  r0  r2  r  r?  r@  r_  ra  rd  rY   rZ   r[   <module>r     s   I "   	 ! 4 4  # F F    
 rzzST4x84 46 3<((  %%&&  	3 /  :LiYbYoYoXpNq9q 6 qW ,' ,2' 2(w (
  ,' 
$G $7  
 + * $d#  $ $d#' ' $'?I ?	J 	J"!9 "!JY (=i =.Y 
Y 
 )  $) "X9 X 	, 		 		< 		| 	y (7) 7]o "%)  +  " 
         #     F+.BEQTbeqt
 ;-Rk@
E	E 1  * , 
4*.8  "&"&$(+44,1! "''' ' 	'
 ' '  '  ' "' ' *' ' ' '  !'V	) 	) !%#'7;#"/311#1 	1
 !1 51 1 1 1 1 1 -1 1 11 1n  #0"="=## # 	#
  # #  # # # #R #&*)-## # $	#
 # # '# # # #Z $(!%&*$$ $ 	$
 $ $ !$ $ $$ $ $N:zy{wiOI iOX$]") "+ +rZ   