
    gni                         d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZ dd	lmZ  ee          Z G d
 d          ZdS )zj
Query service for health data analysis.

Provides methods to query and analyze health data from storage.
    N)date	timedelta)Path)DictListOptionalAnyUnion)config)HealthRepository)HealthStorage)setup_loggerc                   p   e Zd ZdZ	 ddee         dee         ddfdZdede	e
ef         fdZd	e
d
ededee	e
ef                  fdZ	 dd
ededee
         dee	e
ef                  fdZd	e
d
ededee
         de	e
e	e
ef         f         f
dZd	e
dee
         fdZdd	e
dedee	e
ef                  fdZdS )HealthDataQueryz/Service for querying and analyzing health data.Nstoragereporeturnc                 Z    |pt                      | _        |pt                      | _        dS )zInitialize query service.

        Args:
            storage: Optional storage service instance
            repo: Optional repository instance
        N)r   r   r   r   )selfr   r   s      ./root/projects/butler/health/services/query.py__init__zHealthDataQuery.__init__   s+     1-//.,..			    target_datec           	         t                               d|            |                                i g d}t          j                                        D ]/}|dv r| j                            ||          }|r||d         |<   0| j        	                    ||          }|D ]?}| j        
                    |d                   }|r|d                             |           @| j                            d|          }|r||d         d<   t                               dt          |d                    d	t          |d                    d
           |S )zGet a summary of all health metrics for a specific day.

        Args:
            target_date: Date to query

        Returns:
            Dictionary containing all available metrics for the day
        z!Querying health data summary for )r   metrics
activities)r   weightr   activity_idr   r   Found z metrics and  activities)loggerinfo	isoformatr   DATA_TYPE_CONFIGkeysr   load_daily_metricr   get_activities_by_date_rangeload_activityappendlen)	r   r   summarymetric_typedatar   activityactivity_dataweight_datas	            r   get_daily_summaryz!HealthDataQuery.get_daily_summary#   s    	EEEFFF  ))++
 
 "27799 	7 	7K666<11+{KKD 726	";/ Y;;KUU
" 	< 	<H L66x7NOOM <%,,];;; l44X{KK 	7+6GIx(bS+,,bb3w|?T;U;Ubbb	
 	
 	
 r   r,   
start_dateend_datec                    |t           j        vrFd                    t           j                                                  }t	          d| d|           t
                              d| d| d|            g }|}||k    rK| j                            ||          }|r|	                    |           |t          d          z  }||k    Kt
                              d	t          |           d
|            |S )a}  Get a specific metric's data over a date range.

        Args:
            metric_type: Type of metric (e.g., "steps", "sleep", "heart_rate")
            start_date: Start date of range
            end_date: End date of range

        Returns:
            List of metric data dictionaries, ordered by date

        Raises:
            ValueError: If metric_type is invalid
        z, zInvalid metric type: z. Valid types: z	Querying  from  to    daysr   z records for )r   r$   joinr%   
ValueErrorr!   r"   r   r&   r)   r   r*   )r   r,   r2   r3   valid_typesresultscurrent_dater-   s           r   get_metric_rangez HealthDataQuery.get_metric_rangeP   s     f555))F$;$@$@$B$BCCKQQQKQQ   	MMM:MM8MMNNN!h&&<11+|LLD %t$$$I1----L	 h&& 	ES\\EEEEFFFr   activity_typec                    t                               d| d|            | j                            ||          }g }|D ]U}|r|                    d          |k    r| j                            |d                   }|r|                    |           Vt                               dt          |           d           |S )a  Get all activities within a date range.

        Args:
            start_date: Start date of range
            end_date: End date of range
            activity_type: Optional filter by activity type

        Returns:
            List of activity data dictionaries
        zQuerying activities from r6   r@   r   r   r    )	r!   r"   r   r'   getr   r(   r)   r*   )r   r2   r3   r@   activity_indicesr   idxr/   s           r   get_activities_rangez$HealthDataQuery.get_activities_rangeu   s     	J
JJJJKKK  9AA*hWW 
# 	1 	1C !9!9]!J!J L66s=7IJJM 1!!-0009S__999:::r   fieldsc           
         t                               d| d| d| d|            |                     |||          }i }|D ]}g }|D ])}	||	v r#|	|         |                    |	|                    *|r]t	          |          t          |          t          |          t          |          z  t          |          t          |          d||<   dddddd||<   |S )a  Calculate statistics for specific metric fields over a date range.

        Args:
            metric_type: Type of metric
            start_date: Start date of range
            end_date: End date of range
            fields: List of field names to calculate statistics for

        Returns:
            Dictionary mapping field names to their statistics (min, max, avg, count)
        zCalculating statistics for z	 fields: r5   r6   N)minmaxavgcountsumr   )r!   r"   r?   r)   rH   rI   rL   r*   )
r   r,   r2   r3   rF   	data_liststatsfieldvaluesr-   s
             r   get_metric_statisticsz%HealthDataQuery.get_metric_statistics   s&    	h+hhhhjhh^fhh	
 	
 	

 ))+z8LL	  	 	EF! / /D==T%[%<MM$u+... v;;v;;v;;V4 [[v;;   e     e r   c                     t           j        |         d         }t           j        |z  }g }|                                rt	          |                                          D ]}|                                st	          |                                          D ]X}|                                st	          |                    d                    D ]}|j        }|	                    |           Yt	          |          S )zGet all available dates for a metric type.

        Args:
            metric_type: Type of metric

        Returns:
            List of date strings in ISO format
        storage_pathz*.json)
r   r$   DATA_DIRexistssortediterdiris_dirglobstemr)   )	r   r,   rS   	base_pathdatesyear_dir	month_dir	file_pathdate_strs	            r   get_available_datesz#HealthDataQuery.get_available_dates   s    .{;NKOl2	 	/"9#4#4#6#677 	/ 	/(( !'(8(8(:(:!;!; / /I$++-- ! %+INN8,D,D%E%E / /	#,>X....// e}}r      r9   c                     t          j                    }|t          |dz
            z
  }|                     |||          S )zGet the most recent data for a metric.

        Args:
            metric_type: Type of metric
            days: Number of days to look back (default: 7)

        Returns:
            List of metric data dictionaries for the last N days
        r7   r8   )r   todayr   r?   )r   r,   r9   r3   r2   s        r   get_latest_datazHealthDataQuery.get_latest_data   s@     :<<	tax 8 8 88
$$[*hGGGr   )NN)N)rb   )__name__
__module____qualname____doc__r   r   r   r   r   r   strr	   r1   r   r?   rE   rQ   ra   intre    r   r   r   r      s       99 [_
/ 
/.
/=EFV=W
/	
/ 
/ 
/ 
/+T +d38n + + + +Z##,0#<@#	d38n	# # # #L PT *.?G}	d38n	   B..,0.<@.JNs).	c4S>!	". . . .`s tCy    <H H3 Hc H$tCQTH~BV H H H H H Hr   r   )ri   jsondatetimer   r   pathlibr   typingr   r   r   r	   r
   healthr   health.db.repositoryr   health.services.storager   health.utils.logging_configr   rf   r!   r   rl   r   r   <module>ru      s     $ $ $ $ $ $ $ $       3 3 3 3 3 3 3 3 3 3 3 3 3 3       1 1 1 1 1 1 1 1 1 1 1 1 4 4 4 4 4 4	h		]H ]H ]H ]H ]H ]H ]H ]H ]H ]Hr   