
    oigC                        d Z ddlZddlmZmZmZ ddlmZ ddlmZm	Z	m
Z
 ddlZej                            d e ee          j        j        j                             ddlmZ ddlmZ ddlmZ  ee          Zd	ed
efdZdee
eef                  d
efdZd*dee
eef                  ded
efdZded
dfdZdede	e         d
dfdZ  ej!                    d+d            Z"e"#                                 ej$        dd          d,dee         d
dfd                        Z%e"#                                 ej$        d           ej$        d           ej$        d           ej&        ddd           dededed!e'd
df
d"                                                            Z(e"#                                 ej$        d           ej$        d           ej&        d#d$d%&          d,deded$ee         d
dfd'                                                Z)e"#                                d+d(            Z*ed)k    r e"             dS dS )-zs
CLI commands for querying health data.

Provides command-line interface for viewing and analyzing health metrics.
    N)datedatetime	timedelta)Path)OptionalListUnion)config)HealthDataQuery)setup_loggerdate_objreturnc                 ,    |                      d          S )zuFormat date for display.

    Args:
        date_obj: Date to format

    Returns:
        Formatted date string
    z%Y-%m-%d (%A))strftime)r   s    )/root/projects/butler/health/cli/query.pyformat_dater      s     _---    secondsc                 f    | dS t          |           } | dz  }| dz  dz  }| dz  }|dd|dd|dS )zConvert seconds to HH:MM:SS format.

    Args:
        seconds: Number of seconds (int or float)

    Returns:
        Formatted time string
    NN/Ai  <   02d:int)r   hoursminutessecss       r   format_seconds_to_hmsr   $   s`     u 'llGtOE~"$GR<D222'2222222r   valuedecimalsc                 H    | dS |dk    r| d| dS t          |           dS )zSafely format a number with thousand separators.

    Args:
        value: Number to format
        decimals: Number of decimal places

    Returns:
        Formatted number string or 'N/A'
    Nr   r   z,.f,r   )r    r!   s     r   format_numberr%   :   s@     }u!||'8'''''e**   r   summaryc                 @   t          j        | d                                                   }t          dd            t          dt	          |                      t          d d           |                     di           }d|v r|d         }t          d           t          dt          |                    d	                                |                    d
          r+t          d|                    d
d          dz  dd           |                    d          r3t          dt          |                    d                     d           t                       d|v r||d         }t          d           |                    d          r2t          dt          |                    d                                |                    d          r2t          dt          |                    d                                |                    d          r2t          dt          |                    d                                |                    d          r2t          dt          |                    d                                |                    d          &t          d|                    d           d            t                       d!|v r|d!         }t          d"           |                    d#          r&t          d$|                    d#           d%           |                    d&          r&t          d'|                    d&           d%           |                    d(          r&t          d)|                    d(           d%           |                    d*          r&t          d+|                    d*           d%           t                       d,|v r|d,         }t          d-           |                    d.          r't          d/|                    d.          d0d1           |                    d2          r%t          d3|                    d2                      t                       d4|v r|d4         }t          d5           |                    d6          &t          d7|                    d6           d            |                    d8          &t          d9|                    d8           d            t                       d:|v r|d:         }t          d;           |                    d<          r%t          d=|                    d<                      |                    d>          r%t          d?|                    d>                      |                    d@          &t          dA|                    d@           d            |                    dB          &t          dC|                    dB           d            t                       dD|v r|dD         }	t          dE           |	                    dF          r&t          dG|	                    dF           dH           |	                    dI          r&t          dJ|	                    dI          d0           |	                    dK          r't          dL|	                    dK          d0dM           t                       dN|v r|dN         }
t          dO           |
                    dP          r't          dQ|
                    dP          d0d%           |
                    dR          r't          dS|
                    dR          d0d%           |
                    dT          r't          dU|
                    dT          d0d%           t                       dV|v r|dV         }|                    dW          rt          dX           t          dQ|                    dW          d0dM           |                    dY          r't          dS|                    dY          d0dM           |                    dZ          r't          dU|                    dZ          d0dM           t                       d[|v r|d[         }|                    d\          r|t          d]           t          d^|                    d\                      |                    d_          r%t          d`|                    d_                      t                       da|v r |da         }|                    db          |                    dc          t          dd           |                    db          &t          de|                    db           df           |                    dc          &t          dg|                    dc           df           |                    dh          &t          di|                    dh           df           t                       dj|v r|dj         }|                    dk          r~t          dl           t          dm|                    dk           dn           |                    do          r&t          dp|                    do           dn           t                       dq|v rdd!|vr`|dq         }|                    d#          rCt          dr           t          ds|                    d#           d%           t                       |                     dtg           }|rt          dut          |           dv           |D ]}|                    dwdx          }t          |                    dy                    }|                    dz          }d{| d|| }|r|d}|dz  ddz  }|                    d*          r)|d~t          |                    d*                     d%z  }t          |           t                       t          d d           dS )zZPrint a formatted daily summary.

    Args:
        summary: Daily summary dictionary
    r   
P================================================================================u   📊 Health Data Summary for metricsstepsu   🚶 Steps:z   Total Steps: total_stepstotal_distance_meters   Distance: r     .2f kmcalories_burned   Calories:  kcalsleepu   😴 Sleep:total_sleep_secondsz   Total Sleep: deep_sleep_secondsz   Deep Sleep: light_sleep_secondsz   Light Sleep: rem_sleep_secondsz   REM Sleep: sleep_scoreNz   Sleep Score: z/100
heart_rateu   💓 Heart Rate:resting_heart_ratez   Resting HR:  bpmmin_heart_ratez   Min HR: max_heart_rate   Max HR: average_heart_ratez   Average HR: hrvu"   📈 HRV (Heart Rate Variability):	hrv_valuez   HRV: z.1fz msstatusz   Status: stressu   😰 Stress:average_stress_levelz   Average Stress: max_stress_levelz   Max Stress: body_batteryu   🔋 Body Battery:chargedz   Charged: +drainedz   Drained: -highest_valuez   Highest: lowest_valuez   Lowest: weightu   ⚖️  Weight:	weight_kgz   Weight: z kgbmiz   BMI: body_fat_percentagez   Body Fat: %respirationu   🫁 Respiration:average_respiration_ratez   Average: min_respiration_ratez   Min: max_respiration_ratez   Max: spo2average_spo2u   🩸 Blood Oxygen (SpO2):min_spo2max_spo2floorsfloors_climbedu   🪜 Floors:z   Climbed: floors_descendedz   Descended: intensity_minutesmoderate_minutesvigorous_minutesu   ⏱️  Intensity Minutes:z   Moderate: z minz   Vigorous: total_minutesz
   Total: 	hydrationtotal_intake_mlu   💧 Hydration:z   Intake: z mlgoal_mlz	   Goal: rhru   ❤️  Resting Heart Rate:z   RHR: 
activities   🏃 Activities (z):activity_typeUnknownduration_secondsdistance_metersu      • z: z, z
, Avg HR: )	r   fromisoformatr   printr   getr%   r   len)r&   target_dater*   r+   r5   hrrB   rE   bbrM   resprV   rZ   imra   rd   re   activityrg   durationdistanceactivity_strs                         r   print_daily_summaryrx   M   s    (99>>@@K	-v--	
D+k*B*B
D
DEEE	V---kk)R((G ' nJuyy/G/G!H!HJJKKK99,-- 	YW%)),CQ"G"G$"NWWWWXXX99&'' 	VT-		:K0L0L"M"MTTTUUU ' n99*++ 	`^%:599EZ;[;[%\%\^^___99)** 	^\$9%))DX:Y:Y$Z$Z\\]]]99*++ 	`^%:599EZ;[;[%\%\^^___99()) 	\Z#8CV9W9W#X#XZZ[[[99]##/CUYY}%=%=CCCDDD w\"!"""66&'' 	HFBFF+?$@$@FFFGGG66"## 	@>'7 8 8>>>???66"## 	@>'7 8 8>>>???66&'' 	HFBFF+?$@$@FFFGGG en344477; 	<:SWW[11::::;;;778 	53 1 133444 7"o::,--9P

3I(J(JPPPQQQ::())5HFJJ/A$B$BHHHIII   ^$#$$$66) 	75"&&"3"35566666) 	75"&&"3"35566666/"".>!8!8>>>???66.!!-<~ 6 6<<<=== 7" !!!::k"" 	><

; 7 7<<<===::e 	64VZZ..444555::+,, 	LJ&**-B"C"CJJJJKKK }%"###88.// 	QO*D!E!EOOOOPPP88*++ 	IGTXX&<==GGGGHHH88*++ 	IGTXX&<==GGGGHHH v88N## 	.///@.!9!9@@@@AAAxx
## ><*!5!5<<<<===xx
## ><*!5!5<<<<===GGG 7"::&'' 	/"""?,<!=!=??@@@zz,-- IGvzz2D'E'EGGHHHGGG g%%()66$%%1RVV<N5O5O5[/000vv())5Fbff-?&@&@FFFGGGvv())5Fbff-?&@&@FFFGGGvvo&&2@266/#:#:@@@AAAGGG gK(	==*++ 	$%%%E	.? @ @EEEFFF}}Y'' A?)--	":":???@@@GGG L77en77'(( 	0111@SWW%9::@@@AAAGGG \2..J 5#j//555666" 	  	 H$LL)DDM,X\\:L-M-MNNH||$566H@]@@h@@L > =X_ = = = ==||011 e d]8<<H\;];]-^-^ d d dd,	V---r   metric_type	data_listc           	      $   |st          d|  d           dS t          dd            t          d|                                                     dd           dt          |           d	           t          d d           g d
g dg dg dg dg dg dddgd}|                    | dg          }d                    d |D                       }t          |           t          dt          |          z             |D ]}g }|D ]}|                    |d          }|dk    r|rt          |          nd}n|                    d          rt          |          }n_t          |t                    rt          |d          }n8t          |t                    rt          |          }n|t          |          nd}|                    |d           t          d                    |                     t          dd d           dS )zzPrint a formatted metric range.

    Args:
        metric_type: Type of metric
        data_list: List of metric data
    u   
❌ No data found for r(   Nr)   u   📊 _  - z records)r   r,   r-   r2   )r   r6   r7   r:   )r   r<   r>   r?   )r   rC   rD   )r   rF   rG   )r   rI   rJ   rK   rL   )r   rN   rO   rP   r   r<   )r+   r5   r;   rB   rE   rH   rM   rd   z | c                     g | ]}|d S )20 ).0fields     r   
<listcomp>z&print_metric_range.<locals>.<listcomp>'  s    ;;;5E;;;r   -r   _seconds   )r!   r   )rl   upperreplacern   rm   joinstrendswithr   
isinstancefloatr%   r   append)	ry   rz   display_configsfieldsheaderdatarowr   r    s	            r   print_metric_ranger   	  sw     8888999	-v--	
T+##%%--c377
T
TC	NN
T
T
TUUU	V--- UTTUUUXXX...FFFWWWEEE,-	 	O   vh77F ZZ;;F;;;<<F	&MMM	#F
    	& 	&EHHUD))E &+6E



++ C-e44E5)) C%ea888E3'' C%e,,&+&7E


UJJ%}}%%%%ejjoo	/v///r   c                      dS )zHealth data query CLI.Nr   r   r   r   clir   D  s	     	Dr   date_strF)requiredc                 $   	 | r(t          j        | d                                          }nt          j                    }t	                      }|                    |          }t          |           dS # t          $ r8}t          j	        d| d           t          j        d           Y d}~dS d}~wt          $ rR}t          j	        d| d           t                              d           t          j        d           Y d}~dS d}~ww xY w)	zShow health data summary for a specific day.

    DATE_STR: Date in YYYY-MM-DD format (default: today)

    Examples:
        python -m health.cli.query daily
        python -m health.cli.query daily 2024-01-15
    %Y-%m-%du0   ❌ Error: Invalid date format. Use YYYY-MM-DD. Terr   N   ❌ Error: zFailed to get daily summary)r   strptimer   todayr   get_daily_summaryrx   
ValueErrorclickechosysexit	Exceptionlogger	exception)r   ro   query_servicer&   es        r   dailyr   J  s(    	'"+HjAAFFHHKK*,,K ())11+>> 	G$$$$$   
IaIItTTTT   
$$$$////6777s%   A/A3 3
D=-B00D=AD

D
start_dateend_datez--statsTzShow statistics summary)is_flaghelpstatsc                    	 t          j        |d                                          }t          j        |d                                          }||k    rt          d          t	                      }|                    | ||          }t          | |           |r|rg dg dg ddgddgg d	g d
d}|                    | g           }	|	r|                    | |||	          }
t          d           |

                                D ]\  }}|d         dk    rt          | d           t          d|d                     t          d|d                     t          d|d         d           t          d|d                     t                       dS dS dS dS # t          $ r8}t          j        d| d           t          j        d           Y d}~dS d}~wt          $ rR}t          j        d| d           t                               d           t          j        d           Y d}~dS d}~ww xY w)ag  Show metric data over a date range.

    METRIC_TYPE: Type of metric (e.g., steps, sleep, heart_rate)
    START_DATE: Start date in YYYY-MM-DD format
    END_DATE: End date in YYYY-MM-DD format

    Examples:
        python -m health.cli.query range steps 2024-01-01 2024-01-07
        python -m health.cli.query range sleep 2024-01-01 2024-01-07 --stats
    r   .Start date must be before or equal to end date)r,   r-   r2   )r6   r7   r:   )r<   r>   r?   rC   rF   rG   )rI   rJ   rK   )rM   rO   rP   )r+   r5   r;   rB   rE   rH   rM   u   📈 Statistics Summary:
countr   r   z  Min: minz  Max: maxz  Avg: avgr0   z	  Count: r   Tr   r   NzFailed to get metric range)r   r   r   r   r   get_metric_ranger   rm   get_metric_statisticsrl   itemsr   r   r   r   r   r   r   )ry   r   r   r   startendr   rz   field_configsr   
statisticsr   statr   s                 r   ranger   l  s    0!*j99>>@@*55::<<3;;MNNN ())!22;sKK	 	;	222  	 Y 	  UTTUUUXXX#}13EF G G GBBB M #&&{B77F  *@@eUXZ`aa
3444#-#3#3#5#5    KE4G}q((kkk***5U556665U556669U999:::9$w-99:::1	  	  	  	           
$$$$////   
$$$$////5666s%   FF# #
H?--G  H?-AH::H?z--typerg   zFilter by activity type)r   c           
      \   	 t          j        | d                                          }t          j        |d                                          }||k    rt          d          t	                      }|                    |||          }|st          d           dS t          dd            t          dt          |           d           t          d d           |D ]}t          d	|                    d
           d|                    dd                      t          dt          |                    d                                |                    d          r*t          d|                    d          dz  dd           |                    d          r3t          dt          |                    d                     d           |                    d          r3t          dt          |                    d                     d           |                    d          r3t          dt          |                    d                     d           t                       t          d d           dS # t          $ r8}t          j        d| d           t          j        d            Y d}~dS d}~wt          $ rR}t          j        d| d           t                               d!           t          j        d            Y d}~dS d}~ww xY w)"a,  Show activities within a date range.

    START_DATE: Start date in YYYY-MM-DD format
    END_DATE: End date in YYYY-MM-DD format

    Examples:
        python -m health.cli.query activities 2024-01-01 2024-01-07
        python -m health.cli.query activities 2024-01-01 2024-01-07 --type running
    r   r   u   
❌ No activities found
Nr(   r)   rf   z found)u   📅 r   r~   rg   rh   z   Duration: ri   rj   r.   r/   r0   r1   rA   z   Avg HR: r=   r?   r@   caloriesr3   r4   r   Tr   r   zFailed to get activities)r   r   r   r   r   get_activities_rangerl   rn   rm   r   r%   r   r   r   r   r   r   r   )	r   r   rg   r   r   r   activities_listrt   r   s	            r   re   re     sJ   .!*j99>>@@*55::<<3;;MNNN ())'<<UCWW 	0111Fm6mm?#o"6"6???@@@mmm' 	 	H](,,v..]]8<<QZ3[3[]]^^^["7EW8X8X"Y"Y[[\\\||-.. WUhll3D&E&E&LUUUUVVV||011 ][M(,,?S2T2T$U$U[[[\\\||,-- YWM(,,?O2P2P$Q$QWWWXXX||J'' VTmHLL4L4L&M&MTTTUUUGGGGmmm   
$$$$////   
$$$$////3444s,   BJ G0J 
L+-KL+AL&&L+c                      t          d           t          j                                        D ]!\  } }t          d| dd|d                     "t                       dS )z List all available metric types.u   
📋 Available Metric Types:
u     • r   r~   descriptionN)rl   r
   DATA_TYPE_CONFIGr   )ry   type_configs     r   typesr     so     

,---$*$;$A$A$C$C H H [F{FFF+m*DFFGGGG	GGGGGr   __main__)r   )r   N)N)+__doc__r   r   r   r   pathlibr   typingr   r   r	   r   pathinsertr   __file__parenthealthr
   health.services.queryr   health.utils.logging_configr   __name__r   r   r   r   r   r%   dictrx   r   groupr   commandargumentr   optionboolr   re   r   r   r   r   <module>r      s    


 . . . . . . . . . .       ( ( ( ( ( ( ( ( ( (  33ttH~~,3:;; < < <       1 1 1 1 1 1 4 4 4 4 4 4	h			.$ 	.3 	. 	. 	. 	.38E#u*,=#> 33 3 3 3 3,! !%U
"34 ! !C ! ! ! !&y y$ y y y yx8C 8DJ 84 8 8 8 8v 	 	 	 	
 
U+++ HSM T    ,+ @ 
i,EFFF;s ; ;s ;4 ;D ; ; ; GF    
;| 
h.GHHH8 83 8# 8hsm 8W[ 8 8 8 IH   8v     zCEEEEE r   