
    Omj                     Z    S r SSKJrJr  SrS rS rS rS rS r	S	 r
S
 rSrSrS rS rg)u   Недельная арифметика: границы недели, прогресс против ступени ВОЗ, вес.    )date	timedelta   c                 P    U [        U R                  5       S9-
  nX[        SS9-   4$ )uk   Понедельник и воскресенье недели, в которую попадает день.days   )r   weekday)todaymondays      /home/rasp/health-digest/week.pyweek_boundsr      s*    YEMMO44FI1----    c                 (    U R                  5       S-   $ )uJ   Номер дня внутри недели, 1 — понедельник.   r
   r   s    r   	day_indexr      s    ==?Qr   c                 (    SU R                  5       -
  $ )uU   Сколько дней недели осталось, включая сегодня.r   r   r   s    r   	days_leftr      s    u}}r   c                 j   ^^ [        U5      u  mm[        UU4S jU R                  5        5       5      $ )u@   Сумма exercise-минут за текущую неделю.c              3   x   >#    U  H/  u  pTUs=::  a  T::  d  M  O  M  UR                   =(       d    S v   M1     g7f)r   N)exercise_min).0dayrowr   sundays      r   	<genexpr>!cardio_minutes.<locals>.<genexpr>   s?      $HCS"F" 	" 	A$s   :::)r   sumitems)r   r   r   r   s     @@r   cardio_minutesr"      s1     'NFF 

  r   c                     [        U5      u  p#[        U  Vs1 s H>  nUR                  (       d  M  X$R                  s=::  a  U::  d  M.  O  M2  UR                  iM@     sn5      $ s  snf )uk   Число дней недели с силовой тренировкой (день, а не сессия).)r   lenis_strengthr   )workoutsr   r   r   ws        r   strength_daysr(   "   sc     'NF!== 	#uu66 	6 	x   s   A#A#A#A#c                 &   U[        [        S-
  S9-
  nU R                  5        VVs/ s H2  u  p4X#s=::  a  U::  d  M  O  M  UR                  c  M&  UR                  PM4     nnnU(       a!  [	        [        U5      [        U5      -  S5      $ S$ s  snnf )uf   Среднее по замерам веса за последние 7 календарных дней.r   r   N)r   WEIGHT_WINDOW_DAYSr!   weightroundr    r$   )r   r   window_startr   r   weightss         r   rolling_weightr/   +   s    9*<q*@AAL 

$HC'%' 	' 	,/JJ 	

$  
 5<5WG,a0EEs   BBBBc                     U R                  5        VVs/ s H!  u  pUR                  c  M  XR                  4PM#     nnnU(       a  [        US S9$ S$ s  snnf )uE   Последний замер веса: (дата, кг) или None.Nc                     U S   $ )Nr    )pairs    r   <lambda>last_weigh_in.<locals>.<lambda>9   s    $q'r   key)r!   r+   max)r   r   r   measureds       r   last_weigh_inr:   6   sI    26**,Y,hc#**!jj!,HY6>3x12HDH Zs
   AA      c                    [        U5      n[        SU S   U-
  5      n[        SU S   U-
  5      nU(       a  U[        ::  a  gU(       a0  U* U-  * n[        [        U* S-  * S-  5      nX:  a  SU S3$ SU S3$ U(       a  g	g
)u   Что сделать сегодня, чтобы неделя закрылась. Чистая арифметика, без Claude.r   
cardio_minr(   uT   Силовая 35–45 мин — без неё неделя не закроется   u   Прогулка ~u9    мин — закроет неделю по кардиоu    минu   Силовая 35–45 минu?   Неделя закрыта, сегодня по желанию)r   r8   STRENGTH_URGENT_DAYSMIN_WALK_MIN)	stagecardiostrengthr   left
cardio_gapstrength_gapper_dayminutess	            r   
suggestionrJ   @   s    UDQl+f45Jq%08;<L 44eK4'(lwh!m$4q$89 'y0ijj#G9G44.Lr   c                 z    [        U S S9nUS   nU H$  n[        R                  " US   5      U::  d  M"  UnM&     U$ )u<   Ступень ВОЗ, действующая на дату.c                     U S   $ )Nfromr2   )ss    r   r4   stage_for.<locals>.<lambda>X   s    1V9r   r6   r   rM   )sortedr   fromisoformat)stagesr   orderedcurrentrB   s        r   	stage_forrU   V   sE    V!45GajGeFm,5G  Nr   N)__doc__datetimer   r   r*   r   r   r   r"   r(   r/   r:   rA   r@   rJ   rU   r2   r   r   <module>rX      sQ    I $ .

FI  M,r   