
    fi                     N   d dl Z d dlmZmZ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 d dlmZmZ d dlmZ  ee          Z G d	 d
          Zdee         dededee         fdZdee         dededee         fdZdee         dededee         fdZdee         dededee         fdZdee         dededee         fdZdedee         dededee         f
dZdee         dededee         fdZdee         dededee         fdZdee         dededee         fdZ dee         dededee         fdZ!dee         dededee         fdZ"dee         dededee         fdZ#dee         dededee         fdZ$dee         dededee         fdZ%dS )    N)datedatetime	timedelta)DictAnyOptionalList)Path)config)HealthDataQuery)ManualLogStorageDailyManualLog)setup_loggerc                       e Zd Zeddedefd            Zeddedededefd            Zeddededefd	            Zeddededededef
d            Ze	 	 	 ddedede	e         defd            Z
dS )HealthReaderNtarget_datereturnc                    	 | s?|                     d          p)|                     d          p|                     d          } | sdS t          j        |           }t                      }|                    |          }|                     d          st          j                    |z
  j        dk    rt                              d|  d           	 d	d
l	m
}  |            }|                                 |                    ||d           |                    |          }t                              d           n4# t          $ r'}t                              d|            Y d}~nd}~ww xY wd|  dg}|                     d          r|                    d           |d                                         D ]\  }	}
t#          |
t$                    rmd                    d |
                                D                       }t)          |          dk    r|dd         dz   }|                    d|	 d|            |                    d|	 d|
            |                     d          r|                    d           |d         D ]v}|                    d|                     dd           d|                     dd	          dz   d|                     d d	           d!|                     d"d#                      wt+                                          |          }|j        r+|                    d$t)          |j                   d%           |j        r+|                    d&t)          |j                   d%           |j        r|                    d'|j                    |j        r+|                    d(t)          |j                   d%           t)          |          dk    rd)                    |          nd*|  d+S # t          $ r9}t                              d,|            d-t7          |           cY d}~S d}~ww xY w).z
        Get all available health metrics and activities for a specific day.
        Args:
            target_date: ISO format date string (YYYY-MM-DD)
            **kwargs: Catch-all for hallucinated arguments.
        
start_dater   dayz/Error: target_date (or start_date) is required.metrics   zData missing for z, attempting auto-sync...r   )HealthDataSyncT)forcez%Auto-sync completed, re-queried data.zAuto-sync failed: Nu   📊 **Health Report for **z
**Metrics:**, c                 f    g | ].\  }}t          |t          t          t          f          '| d | /S )=)
isinstanceintfloatstr).0kvs      4/root/projects/butler/slack_bot/tools/health_read.py
<listcomp>z9HealthReader.get_daily_detailed_stats.<locals>.<listcomp>=   sA    0x0x0x1WabcfikpruevWwWw0xA0x0x0x       z...- : 
activitiesz
**Activities:**activity_typeActivityduration_seconds<   z mins, caloriesz kcal, Avg HR average_heart_ratezN/Az
**Diet:**  entriesz**Alcohol:** z**Fasting:** z**Feelings:** 
zNo data found for .zError getting detailed stats: zError retrieving data: )getr   fromisoformatr   get_daily_summarytodaydaysloggerinfohealth.services.data_syncr   authenticatesync_all_metrics	Exceptionerrorappenditemsr   dictjoinlenr   load_logdiet_entriesalcohol_entriesfasting_modefeeling_entriesr"   )r   kwargsdquerydatar   syncersync_errlineskeyvalsummary_stractmanuales                  r&   get_daily_detailed_statsz%HealthReader.get_daily_detailed_stats   s6   C	6 b$jj66a&**V:L:LaPVPZPZ[`PaPa IHH";//A#%%E**1--D 88I&& BDJLL1,<+Ba+G+GVVVVWWW	BHHHHHH+^--F'')))++Aq+=== 22155DKK GHHHH  B B BLL!@h!@!@AAAAAAAAB A@@@AE xx	"" 8-... $Y 5 5 7 7 	8 	8HC!#t,, 8&*ii0x0x		0x0x0x&y&y{++c11*5dsd*;e*CK%>#%>%>%>%>????%6#%6%6%6%67777 xx%% G0111- G GCLL  "Fcggoz&J&J  "F  "FcggVhjkNlNlnpNp  "F  "Fy|  zA  zA  BL  NO  zP  zP  "F  "F  `c  `g  `g  h|  ~C  `D  `D  "F  "F  G  G  G  G &''0033F" PNC0C,D,DNNNOOO% TRS1G-H-HRRRSSS" DBV-@BBCCC% USc&2H.I.ISSSTTT'*5zzA~~499U###;^P[;^;^;^^ 	6 	6 	6LL=!==>>>5SVV55555555	6sQ   AP B	P A+D= <P =
E.E)$P )E..J"P 
Q.Q	QQmetric_typer   end_datec                    	 d|v r|s|d         }|d         }| sdS |r|sdS t          j        |          }t          j        |          }||z
  j        dz   }|dk    rYt                              d| d           ddd	d	d
}|                    | |           }t                              |||g          S t                      }	|		                    | ||          }
|
sd|  d| d| dS dt          |
           d|  dt          |
          z   S # t          $ r<}t                              d|            d|  dt          |           cY d}~S d}~ww xY w)z
        Get historical data for a specific metric (e.g., steps, sleep_score, heart_rate, hrv, weight).

        For time ranges > 7 days, automatically uses aggregated analysis for better insights.
        r   zFError: Metric type is required (e.g., 'steps', 'sleep', 'heart_rate').,Error: Start date and end_date are required.r      zTime range z! days - using aggregated analysisrhrsleep)
heart_rateresting_heart_ratesleep_scoresleep_quality)r   r[   r   zNo z data found from  to r5   zFound z records for z:
zError getting metric history: zError retrieving z
 history: N)r   r7   r:   r;   r<   r6   r   get_aggregated_analysisr   get_metric_rangerF   r"   r@   rA   )rZ   r   r[   rL   startendtime_span_daysmetric_mappingmetric_namerN   	data_listrX   s               r&   get_metric_historyzHealthReader.get_metric_history[   s   3	G&&z&#M2
!-0 `__ FX FEE&z22E$X..C "Ek/!3N !![.[[[\\\ #(*/#*%,	" " -00kJJ $;;)%(M <    $%%E..{E3GGI WV[VV:VV8VVVV JC	NNIIIIICPYNNZZ 	G 	G 	GLL=!==>>>F{FFc!ffFFFFFFFF	Gs4   D D BD 62D )%D 
E1E
EEc                    	 d|v r| s|d         } |d         }| r|sdS t          j        |           }t          j        |          }t                      }|                    ||          }|s	d|  d| dS d|  d| dg}|D ]}|                    dd	          d
d         }	|                    dd          }
|                    dd          }|                    dd          }|                    dd          }|                    d|	 d|
 d|dz   d| d|dz  dd           d                    |          S # t          $ r9}t          	                    d|            dt          |           cY d
}~S d
}~ww xY w)zB
        Get list of activities/workouts in a date range.
        r   r]   zNo activities found from re   r5   z**Activities from :**
start_timezUnknown DateN
   r-   zUnknown Activitydistance_metersr   r/   r1   r*   r+   z | r0   z mins | z kcal |   .2fz kmr4   z Error getting activity history: z#Error retrieving activity history: )r   r7   r   get_activities_ranger6   rB   rE   r@   r;   rA   r"   )r   r[   rL   rh   ri   rN   r,   rR   rV   date_strtype_strdist_mdur_scalrX   s                  r&   get_activity_historyz!HealthReader.get_activity_history   s   
	B&&z&#M2
!-0 FX FEE&z22E$X..C#%%E33E3??J ON:NN8NNNNG*GG(GGGHE! q q77<@@"E77?4FGG!2A66 2A66ggj!,,o(oohoo5"9oocoo[abf[foooopppp99U### 	B 	B 	BLL?A??@@@AQAAAAAAAA	Bs*   D; AD; 5CD; ;
E>.E93E>9E>allcategoryc                    	 |rt                               d|            |r|} |}| r|sdS t          j        |           }t          j        |          }t	                      }|                    ||          }|s	d|  d| dS g }	|D ]!}
d|
j         d}g }|dv rj|
j        rc|                    d	t          |
j                   d
           |
j        D ]0}|                    d|j
         d|j         d|j         d           1|dv ri|
j        rb|                    dt          |
j                   d           |
j        D ]/}|                    d|j
         d|j         d|j                    0|dv ri|
j        rb|                    dt          |
j                   d           |
j        D ]/}|                    d|j
         d|j         d|j                    0|dv rq|
j        rj|                    dt          |
j                   d           |
j        D ]7}|                    d|j
         d|j         d|j         d|j                    8|dv r$|
j        r|                    d|
j                    |r*|	                    |           |	                    |           #|	rd                    |	          nd| dS # t2          $ r9}t                               d|            dt7          |           cY d}~S d}~ww xY w) a  
        Get manual logs (diet, alcohol, supplements, feelings, fasting) over a date range.
        Args:
            start_date: YYYY-MM-DD
            end_date: YYYY-MM-DD
            category: 'diet', 'alcohol', 'supplements', 'feelings', 'fasting', 'all'
            target_date: Optional alias for single-day query (sets start=end=target)
            **kwargs: Catch-all for hallucinated arguments (e.g. dosage, name) to prevent crashes.
        z-get_manual_history received unexpected args: z?Error: Please provide start_date and end_date (or target_date).zNo manual logs found from re   r5   r   rp   )dietr}   z  Diet: z itemsz    - [z]  ())alcoholr}   z  Alcohol: r3    )supplementsr}   z  Supplements: )feelingsr}   z  Feelings: z/10): )fastingr}   z  Fasting: r4   zNo manual data for 'z' found in range.zError getting manual history: z!Error retrieving manual history: N)r;   warningr   r7   r   get_logs_in_rangelog_daterH   rB   rF   timedescription	meal_typerI   amountalcohol_typesupplement_entriessupplement_namedosagerK   feeling_typeseverityrJ   extendrE   r@   rA   r"   )r   r[   r~   r   rL   rh   ri   storagelogsrR   logdate_header	day_linesrX   s                 r&   get_manual_historyzHealthReader.get_manual_history   s   9	@ YWvWWXXX  '(
& YX YXX&z22E$X..C&((G,,UC88D POJOOHOOOOE , ,43<444	..33C.$$%MC4D0E0E%M%M%MNNN - ^ ^!(()\16)\)\Q])\)\ak)\)\)\]]]]111c6I1$$%U3s7J3K3K%U%U%UVVV 0 Z Z!(()X16)X)XQX)X)X)X)XYYYY555#:P5$$%\s3;Q7R7R%\%\%\]]] 3 ] ]!(()[16)[)[Q=N)[)[QRQY)[)[\\\\222s7J2$$%VC8K4L4L%V%V%VWWW 0 r r!(()p16)p)pQ^)p)pqz)p)paban)p)pqqqq111c6F1$$%E33C%E%EFFF ,LL---LL+++',d499U###2d2d2d2dd 	@ 	@ 	@LL=!==>>>?s1vv????????	@s*   )K AK IK 
L.L LLr   c           
      "	   	 |s%t          j                                                    }| s9t          j        |          t	          d          z
  }|                                } t          j        |           }t          j        |          }|sg d}t                      }d|  d| dg}|                    d||z
  j         d           |D ]g}	 |                    |||          }	|	s,|                    d	|	                                 d
           I|                    dd            |                    d|	                                
                    dd           d           |                    d            |dv r&|                    t          |	||                     n'|dk    r&|                    t          |	||                     n|dk    r&|                    t          |	||                     n|dk    r&|                    t          |	||                     n|dk    r&|                    t!          |	||                     nw|dv r&|                    t#          |	||                     nM|dk    r&|                    t%          |	||                     n!|dk    r%|                    t'          |	||                     n|dv r%|                    t)          |	||                     n|dk    r%|                    t+          |	||                     n|dv r%|                    t-          |	||                     ny|dv r%|                    t/          |	||                     nP|dk    r%|                    t1          |	||                     n%|                    t3          ||	||                     	# t4          $ rS}
t6                              d| d|
            |                    d	| d t;          |
                      Y d!}
~
ad!}
~
ww xY wd                    |          S # t4          $ r9}t6                              d"|            d#t;          |           cY d!}~S d!}~ww xY w)$a  
        Get comprehensive health trend analysis over a large time window.

        This method aggregates data and calculates statistics to minimize AI tool calls.
        Instead of returning raw data, it provides a pre-analyzed report with trends,
        averages, and comparisons.

        Args:
            start_date: Start date in YYYY-MM-DD format
            end_date: End date in YYYY-MM-DD format
            metrics: List of metrics to analyze. If None, analyzes common metrics:
                    ['resting_heart_rate', 'hrv', 'sleep', 'stress', 'steps']
            **kwargs: Catch-all for hallucinated arguments

        Returns:
            Formatted analysis report with trends, statistics, and comparisons
        i  )r:   )r_   hrvr`   stressstepsu   📊 **Health Trend Analysis (re   z)**zTime span: z days
u   
❌ **z**: No data availabler4   z<============================================================u   📈 **_r   r   )rb   r_   r   r`   r   r   )spo2blood_oxygenrespiration	hydration)floorsfloors_climbedbody_battery)intensity_minutes	intensity)weightbody_weightlifestyle_loggingzError analyzing r+   z**: Error - NzError in aggregated analysis: zError generating analysis: )r   r9   	isoformatr7   r   r   rB   r:   rg   upperreplacer   _analyze_resting_heart_rate_analyze_hrv_analyze_sleep_analyze_stress_analyze_steps_analyze_spo2_analyze_respiration_analyze_hydration_analyze_floors_analyze_body_battery_analyze_intensity_minutes_analyze_weight_analyze_lifestyle_logging_analyze_genericr@   r;   rA   r"   rE   )r   r[   r   rL   rh   ri   rN   rR   metricrm   
metric_errrX   s               r&   rf   z$HealthReader.get_aggregated_analysis  s   0G	: 4:<<1133 /*844yc7J7J7JJ"__..
&z22E$X..C  EDDD#%%ESjSShSSSTELLBe'9BBBCCC " -S -S,S % 6 6vuc J JI$ !%U%U%U%UVVV LLf///LL!O6<<>>+A+A#s+K+K!O!O!OPPPLLF--- !>>>%@ESV%W%WXXXX5\)UC%H%HIIII7**^Iuc%J%JKKKK8++_Ys%K%KLLLL7**^Iuc%J%JKKKK#;;;]9eS%I%IJJJJ=00%9)UC%P%PQQQQ;..%7	5#%N%NOOOO#???_Ys%K%KLLLL>11%:9eS%Q%QRRRR#EEE%?	5RU%V%VWWWW#<<<_Ys%K%KLLLL#666%?	5RU%V%VWWWW %5fiPS%T%TUUU  S S SLL!JF!J!Jj!J!JKKKLL!QF!Q!QJ!Q!QRRRRRRRRS 99U### 	: 	: 	:LL=!==>>>9Q99999999	:sW   CQ AOQ J>OQ 
P3 AP.(Q .P33Q 
R.R	R	R)N)NNN)NN)NNr}   N)__name__
__module____qualname__staticmethodr"   rY   rn   r|   r   r	   rf    r(   r&   r   r      s       J6 J6c J6s J6 J6 J6 \J6X 9G 9G 9G 9GVY 9Gor 9G 9G 9G \9Gv #B #B #Bs #BX[ #B #B #B \#BJ C@ C@s C@S C@SV C@mp C@  GJ C@ C@ C@ \C@J !^: ^:^:^: c^:
 
^: ^: ^: \^: ^: ^:r(   r   rm   rh   ri   r   c           	      2   g }g g }| D ]l}|                     d          p|                     d          }|r>                    |           |                    |                     dd                     msdgS t                    t                    z  }t	                    }t                    }	|                    d|dd| d	|	 d
           |                    dt                     d           i }
| D ]f}|                     d          p|                     d          }d|v r6|r4|d         dd         }||
vrg |
|<   |
|                             |           gt          |
          dk    r|                    d           d}t          |
                                          D ]}t          |
|                   t          |
|                   z  }d}|r?||z
  }||z  dz  }|dk     rdnd}d| dt          |          ddt          |          dd}|                    d| d|dd|            |}fdt                    D             }t          |          dk    rt          |          t          |          z  }t                    dk    r:t          dt                    dz                     t                    dz  z  n|}||z
  }|d k     rd!n	|dk    rd"nd#}|                    d$|dd%| d
           |S )&z"Analyze resting heart rate trends.r_   rb   r    z No valid resting heart rate data   📊 Overall: .1fz bpm (range: -r      Data points:  daysN   r      
📅 Yearly Trends:d   r      ↓   ↑r   r   z bpm, %)   r+   z bpmc                 F    g | ]\  }}t                    |z
  d k    |S )   )rF   )r#   ir%   valuess      r&   r'   z/_analyze_resting_heart_rate.<locals>.<listcomp>  s1    JJJtq!CKK!Or4I4I4I4I4Ir(      r0         ✅ Improvedu   ⚠️ Elevated   🔄 Stable   
🎯 Recent 30 days: z bpm ()
r6   rB   sumrF   minmaxsortedkeysabs	enumerate)rm   rh   ri   rR   datesitemrhr_valavg_allmin_valmax_valyearly_avgsyearprev_avgyear_avg
change_strchangepct	direction	recent_30
recent_avgbaselinestatusr   s                         @r&   r   r   e  s   E FE / /((5//CTXX.B%C%C 	/MM'"""LL&"--... 4233 &kkCKK'G&kkG&kkG	LLP'PPPGPPgPPPQQQ	LL6CKK666777 K . .((5//CTXX.B%C%CT>>g><#D;&&$&D!$$W---
;!,---;++--.. 		  		 D;t,--K4E0F0FFHJ V!H,(C/%+aZZEEU	U)UUc&kkUUUSXXUUUU
LLEtEExEEEEEFFFHH KJJJy00JJJI
9~~^^c)nn4
FI&kkTVFVFV3vos6{{A~o.//3v;;>BB\ch&#)B;;RS4E4EYfNzNNNVNNNOOOLr(   c                    g }g }g }g }| D ]}d}d|v r	|d         }n&d|v r	|d         }nd|v r	|d         }nd|v r|d         }|sd|v r~t          |d         t                    rc|d                             di           }	|	                    d          }|	                    d          }
|
r|
d	k    r|                    |
           |r\|d	k    rV|                    |           |                    d
          p|                    d          }|r|                    |           |sdgS t	          |          t          |          z  }|                    d|dd           |                    dt          |           d           |r9t	          |          t          |          z  }|                    d|dd           i }| D ]}|                    d          }|s5d|v r1|d                             di           }	|	                    d          }d|v r<|r:|d	k    r4|d         dd         }||vrg ||<   ||                             |           t          |          dk    r|                    d           d}t          |                                          D ]}t	          ||                   t          ||                   z  }d}|rL||z
  }||z  dz  }|d	k    rdnd}|d	k    rdnd}d| d| dt          |          dd t          |          dd!	}|                    d"| d#|dd|            |}|r_|	                    d$          }|	                    d%          }t          |          }|                    d&| d'| d(||z  dz  d)d!           t          |          d*k    r
|d+d         n|}t          |          d,k    rt	          |          t          |          z  }t          |          d-k    r:t	          |dt          |          d.z                     t          |          d.z  z  n|}||z
  }|d/k    rd0n	|d1k     rd2nd3}|                    d4|dd5| d6           |S )7z,Analyze HRV (Heart Rate Variability) trends.N	hrv_valueaverage_hrv_rmssd	hrv_rmssdlastNightAvgraw_data
hrvSummary	weeklyAvgr   r   
hrv_statuszNo valid HRV datar   r   z ms (last night average)r   r   z   Weekly Average: z msr   r   r   r   r   r   r   r      ✅   ⚠️r   r   z ms, r   r   r+   BALANCED
UNBALANCEDu   
🎯 Recovery Status: /z days BALANCED (.0fr   r   r0   r      r   u   ⚠️ Declinedr   z   Recent 30 days: z ms (r   )
r   rD   r6   rB   r   rF   r   r   r   count)rm   rh   ri   rR   r   weekly_avgsstatusesr   hrv_valhrv_summaryweeklyr   r   
avg_weeklyr   r   r   r   r   r   r   r   balanced_countunbalanced_counttotalr   r   r   s                               r&   r   r     sk   E FKH ( ( $;'GG D((./GGD  ;'GGt##>*G  	+:--*T*=Mt2T2T-z*..|R@@K!oon55G !__[11F +&1**""6*** 	(w{{MM'""" XXh''A488L+A+AF (''' %#$$&kkCKK'G	LLG'GGGGHHH	LL6CKK666777  @%%K(8(88
>:>>>>??? K . .((;'' 	6:--z*..|R@@K!oon55GT>>g>'A++<#D;&&$&D!$$W---
;!,---;++--.. 
	  
	 D;t,--K4E0F0FFHJ ^!H,(C/%+aZZEEU	"(1**(]&]]9]]s6{{]]]SQTXX]]]]
LLDtDDxDDD
DDEEEHH  z!
33#>>,77HxxxxxXfglXlmpXpxxxxyyy !$Fr 1 1sttvI
9~~^^c)nn4
FI&kkTVFVFV3vos6{{A~o.//3v;;>BB\ch&#)A::QS3D3DYfI:IIIIIIJJJLr(   c                 d   g }g }g }g }g }| D ]}|                     dd          dz  }	|	dk    r|                    |	           |                     dd          dz  }
|
dk    r|                    |
           |                     dd          dz  }|dk    r|                    |           |                     d          p|                     dd          }|dk    r|                    |           |sdgS t          |          t          |          z  }|rt          |          t          |          z  nd}|rt          |          t          |          z  nd}|rt          |          t          |          z  nd}|                    d	           |                    d
|dd           |dk    r&||z  dz  }|                    d|dd|dd           |dk    r&||z  dz  }|                    d|dd|dd           |dk    r|                    d|dd           t          |          dk    r
|dd         n|}t          |          dk    rXt          |          t          |          z  }||z
  }t	          |          dk     rdnd}|                    d|dd| d           |S )zAnalyze sleep quality trends.total_sleep_secondsr   i  deep_sleep_secondsrem_sleep_secondsoverall_sleep_scorerc   zNo valid sleep datau   📊 Overall Averages:z   Total Sleep: r   z
 hrs/nightr   z   Deep Sleep: z hrs (r  r   z   REM Sleep: z   Sleep Score: /100r   r  Nr   333333?r   r   r   r   r6   rB   r   rF   r   )rm   rh   ri   rR   total_sleep_hrsdeep_sleep_hrsrem_sleep_hrssleep_scoresr   r  deepremscore	avg_totalavg_deepavg_rem	avg_scoredeep_pctrem_pctrecent_30_totalr   r   r   s                          r&   r   r     s8   EONML ' '.22T9199""5))) xx,a0047!88!!$''' hh*A..577  %%% .//M488M13M3M199&&& '%&&O$$s?';';;I<JQs>""S%8%888PQH9FMc-  3}#5#555AG9ELL!!C$5$5551I	LL*+++	LL=I====>>>!||y(C/KxKKK8KKKKLLL{{Y&#-HgHHHHHHHIII1}};	;;;;<<< 03?/C/Cr/I/Iocdd++O
?q  ))C,@,@@
i'f++++NzNNNVNNNOOOLr(   c                    g }g }d}| D ]9}|                     d          }| |                    |           |dk    r|dz  }:|sdgS t          |          t          |          z  }|                    d|dd	           |                    d
| dt          |           d|t          |          z  dz  dd           t          |          dk    r
|dd         n|}	t          |	          dk    rSt          |	          t          |	          z  }
|
|z
  }|dk     rdn	|dk    rdnd}|                    d|
dd| d           |S )zAnalyze stress level trends.r   average_stress_levelN2   r   zNo valid stress datau   📊 Average Stress: r   r  z   High stress days (>50): r  r   r   r  r   r   r  r   	   ✅ Lower   ⚠️ Higherr   r   /100 (r   r6   rB   r   rF   )rm   rh   ri   rR   avg_stress_valueshigh_stress_daysr   
avg_stressr   r   r   r   r   s                r&   r   r   B  s   E & &XX455
!$$Z000B A%  (&''#$$s+<'='==G	LL:::::;;;	LL  P/?  P  P#FWBXBX  P  P\lmp  rC  nD  nD  ]D  EH  ]H  P  P  P  P  Q  Q  Q ,//@+A+AR+G+G!#$$''M^I
9~~^^c)nn4
g% &FQJJTaNzNNNVNNNOOOLr(   c                    g }g }| D ].}|                     d          }|r|                    |           /|sdgS t          |          t          |          z  }|                    d|d           t          d |D                       }|                    d| dt          |           d|t          |          z  d	z  d
d           t          |          dk    r
|dd         n|}	t          |	          dk    r_t          |	          t          |	          z  }
|
|z
  }||z  d	z  }|dk    rdn	|dk     rdnd}|                    d|
dd| d|dd           |S )zAnalyze daily steps trends.total_stepszNo valid steps datau   📊 Average Daily Steps: z,.0fc              3   &   K   | ]}|d k    dV  dS )i  r   Nr   )r#   ss     r&   	<genexpr>z!_analyze_steps.<locals>.<genexpr>s  s&      99ADa99r(   z   Active days (>5k steps): r  r   r   r  r   r   r  Nr   i  r   ir   u   🔄r   z steps (r   +.0fr/  )rm   rh   ri   rR   step_valuesr   r   r   active_daysr   r   r   r   r   s                 r&   r   r   b  s   EK & &'' 	&u%%% '%&&+[!1!11G	LL<g<<<=== 9999999K	LLzzzc+>N>NzzR]^abm^n^nRnorRrzzzz{{{ &)%5%5%;%;CDD!!I
9~~^^c)nn4
g%3& 3,,HH6]z]]]]]QT]]]]^^^Lr(   r   c                 V    dt          |           g}|                    d           |S )z*Generic analysis for unknown metric types.zData points: zV(Use specific metrics like 'resting_heart_rate', 'hrv', 'sleep' for detailed analysis))rF   rB   )r   rm   rh   ri   rR   s        r&   r   r     s0    -S^^--.E	LLijjjLr(   c           	      X   g }g g }}| D ]}|                     d          pi }|                     d          p|                     d          }|                     d          p|                     d          }	|r|dk    r|                    |           |	r|	dk    r|                    |	           |sdgS t          |          t          |          z  }
|rt	          |          nd}t          d	 |D                       }|                    d
|
dd           |r|                    d|dd           |                    dt          |           d           |r1|                    d| d|t          |          z  dz  dd           n|                    d           t          |          dk    r
|dd         n|}t          |          dk    rSt          |          t          |          z  }||
z
  }|dk    rdn	|dk     rdnd}|                    d|dd| d            |S )!z#Analyze blood oxygen (SpO2) trends.r   average_spo2averageSpO2min_spo2
lowestSpO2r   zNo valid SpO2 dataNc              3   &   K   | ]}|d k     dV  dS )^   r   Nr   r#   r%   s     r&   r7  z _analyze_spo2.<locals>.<genexpr>  &      11!b&&1&&&&11r(   u   📊 Average SpO2: r   %z   Lowest reading: r   r   u$   ⚠️  Nights with min SpO2 < 94%: r   r   r  r   u   ✅ No nights with SpO2 < 94%r   r  r   r  
   ✅ Betterg333333ӿu   ⚠️ Lowerr   r   z% (r   )r6   rB   r   rF   r   )rm   rh   ri   rR   avg_valsmin_valsr   rdavglowoverall_avgoverall_minbelow_94r   r   r   r   s                    r&   r   r     s}   ERhH ! !XXj!!'Rhh~&&?"&&*?*?hhz"":bff\&:&: 	!377OOC    	!377OOC    &$%%h--#h--/K#+5#h---K11h11111H	LL9{9999::: ?=;====>>>	LL8CMM888999 6jHjjQTU]Q^Q^H^_bHbjjjjkkkk4555"%h--2"5"58I
9~~^^c)nn4
k)!'#Vd]]>>XeKzKKK&KKKLLLLr(   c                 ,   g }g }| D ]4}|                     d          }|r|dk    r|                    |           5|sdgS t          |          t          |          z  }t	          |          }t          |          }	|                    d|dd           |                    d|dd|	dd           |                    d	t          |           d
           t          d |D                       }
|
r|                    d|
            t          |          dk    r
|dd         n|}t          |          dk    rSt          |          t          |          z  }||z
  }|dk     rdn	|dk    rdnd}|                    d|dd| d           |S )zAnalyze breathing rate trends.average_respiration_rater   zNo valid respiration datau   📊 Average Respiration: r   z breaths/minz
   Range: u    – r   r   c              3   &   K   | ]}|d k    dV  dS )   r   Nr   rC  s     r&   r7  z'_analyze_respiration.<locals>.<genexpr>  rD  r(   u#   ⚠️  Days above 20 breaths/min: r   r  Nr   g      r,  g      ?r-  r   r   z breaths/min (r   )r6   rB   r   rF   r   r   )rm   rh   ri   rR   rG  r   rT   rL  rM  overall_maxelevatedr   r   r   r   s                  r&   r   r     s   EH ! !hh122 	!377OOC    -+,,h--#h--/Kh--Kh--K	LLKkKKKKLLL	LLQkQQQKQQQQRRR	LL8CMM888999 11h11111H GE8EEFFF"%h--2"5"58I
9~~^^c)nn4
k) &fsll??XeVzVVVVVVVWWWLr(   c                    g }g g }}| D ]f}|                     d          }|                     d          }|r|dk    r|                    |           |r|dk    r|                    |           g|sdgS t          |          t          |          z  }	|	dz  }
|                    d|
dd|	d	d
           |                    dt          |           d           |rt          |          t          |          z  }t          d t	          ||          D                       }|                    d|dz  dd| dt          |           d|t          |          z  dz  d	d	           t          |          dk    r
|dd         n|}t          |          dk    rVt          |          t          |          z  dz  }||
z
  }|dk    rdn	|dk     rdnd}|                    d|dd| d           |S ) z"Analyze daily water intake trends.total_intake_mlgoal_mlr   zNo valid hydration datart   u   📊 Average Daily Intake: ru   z L (r  z ml)r   r   c              3   ,   K   | ]\  }}||k    d V  dS r   Nr   )r#   r   gs      r&   r7  z%_analyze_hydration.<locals>.<genexpr>  s*      KKTQAFFqFFFFKKr(   z   Daily goal: u    L — Hit goal: r   days (r   r   r   r  Nr   g?   ✅ Moreg   ⚠️ Lessr   r   z L/day (r   )r6   rB   r   rF   zip)rm   rh   ri   rR   intake_vals	goal_valsr   intakegoalavg_mlavg_lavg_goalgoal_hitr   recent_avg_lr   r   s                    r&   r   r     s   EK # #+,,xx	"" 	'fqjjv&&& 	#D1HHT""" +)**K 0 00FTME	LLNuNNNfNNNNOOO	LL;C$4$4;;;<<< Vy>>C	NN2KKSi%@%@KKKKK  Ux}  U  U  U8  U  UVYZeVfVf  U  Uowx{  }H  yI  yI  pI  JM  pM  U  U  U  U  	V  	V  	V%(%5%5%;%;CDD!!I
9~~9~~I6=%%||&4--UbR|RRRRRRSSSLr(   c                    g }g g }}| D ]f}|                     d          }|                     d          }||dk    r|                    |           |r|dk    r|                    |           g|sdgS t          |          t          |          z  }	t	          |          }
|                    d|	dd           |                    d	|
 d
           |                    dt          |           d           |rt          |          t          |          z  }t          d t          ||          D                       }|                    d|dd| dt          |           d|t          |          z  dz  dd	           t          |          dk    r
|dd         n|}t          |          dk    rSt          |          t          |          z  }||	z
  }|dk    rdn	|dk     rdnd}|                    d|dd| d           |S ) zAnalyze floors climbed trends.r   
floor_goalNr   zNo valid floors datau   📊 Average Floors Climbed: r   z/dayz   Best day: z floorsr   r   c              3   ,   K   | ]\  }}||k    d V  dS rY  r   )r#   frZ  s      r&   r7  z"_analyze_floors.<locals>.<genexpr>  s*      LLTQQ!VVqVVVVLLr(   z	   Goal (r  z floors): hit r  r[  r   r   r   r  r   r   r\  r]  r   r   z floors/day (r   )r6   rB   r   rF   r   r^  )rm   rh   ri   rR   climbed_valsr`  r   climbedrb  
avg_floors
max_floorsre  rf  r   r   r   r   s                    r&   r   r     s   E ")L # #((+,,xx%%7a<<((( 	#D1HHT""" (&''\""S%6%66J\""J	LLEEEEEFFF	LL4444555	LL<C$5$5<<<=== Jy>>C	NN2LLSy%A%ALLLLL  I  I  I  IX  I  ILHYHY  I  Ibjkno{k|k|b|  ~A  cA  I  I  I  I  	J  	J  	J&),&7&72&=&=STT""<I
9~~^^c)nn4
j(%zz}}Q^UzUUUFUUUVVVLr(   c                 h   g }g g g g f\  }}}}| D ]}|                     d          }	|                     d          }
|                     d          }|                     d          }|	G|
E|                     d          pg }|r,d |D             }|rt          |          }	t          |          }
|	|                    |	           |
|                    |
           ||                    |           ||                    |           |s|sdgS |rt	          |          t          |          z  }|rt	          |          t          |          z  nd}|                    d	|d
d           ||                    d|d
d           |                    dt          |           d           n&|                    dt          |           d           |rt|rrt	          |          t          |          z  }t	          |          t          |          z  }||z
  }|dk    rdnd}|                    d|d
d|d
d|dd| d	           |rt	          d |D                       }|r@|                    d| dt          |           d|t          |          z  dz  d
d           t          |          dk    r
|dd         n|}t          |          d k    rSt	          |          t          |          z  }||z
  }|d!k    rd"n	|d#k     rd$nd%}|                    d&|d
d'| d           |S )(z)Analyze Body Battery charge/drain trends.highest_valuelowest_valuechargeddrainedNtimelinec                 P    g | ]#\  }}t          |t          t          f          !|$S r   )r   r    r!   )r#   r   r%   s      r&   r'   z)_analyze_body_battery.<locals>.<listcomp>/  s/    QQQAZC<5P5PQ1QQQr(   zNo valid Body Battery datau   📊 Average Daily Peak: r  r  z   Average Daily Low: r   r   u   📊 Data points: r   u   ✅ Net positiveu   ⚠️ Net negativez   Avg charged: +z | Avg drained: -z | Net: r8  r   r   c              3   &   K   | ]}|d k     dV  dS )r*  r   Nr   rC  s     r&   r7  z(_analyze_body_battery.<locals>.<genexpr>Q  s&      >>Qq2vvqvvvv>>r(   u   ⚠️  Low peak days (<50): r  r   r   r   r  r   r  rF  r  u   ⚠️ Worser   u   
🎯 Recent 30 days: avg peak r.  )r6   r   r   rB   r   rF   )rm   rh   ri   rR   	peak_valslow_valscharged_valsdrained_valsr   peakrK  rt  ru  rv  tl_valsavg_peakavg_lowavg_chargedavg_drainednetr   low_battery_daysr   r   r   s                            r&   r   r   !  s   E68"b"n3Ix| ) )xx((hh~&&((9%%((9%%<CKxx
++1rH 'QQQQQ 'w<<Dg,,CT"""?OOC   (((((( .	 .,-- Dy>>C	NN23;E#h--#h--//CCCCCDDDLLC'CCCCDDD=I===>>>>B#l*;*;BBBCCC { {,''#l*;*;;,''#l*;*;;K''*Qww##4Iyyyy;yyydgyyypvyyyzzz 
]>>)>>>>> 	KLL  J9I  J  JCPYNN  J  J^nors|o}o}^}  B  _B  J  J  J  J  K  K  K'*9~~';';IcddOO	y>>QY#i..8J(*F%+aZZ\\vPR{{^^XeFLL[J[[[RX[[[\\\Lr(   c                    g }g g }}| D ]h}|                     dd          pd}|                     dd          pd}|dk    s|dk    r*|                    |           |                    |           i|sdgS t          |          t          |          z  }	t          |          t          |          z  }
|	|
dz  z   dz  }|                    d           |                    d|	d	d
|
d	d           |                    d|d	d           |dk    r|                    d           nd|z
  }|                    d|d	d           i }| D ]~}|                     dd          }|                     dd          pd}|                     dd          pd}|dd         }|r*||vrg ||<   ||                             ||dz  z              t          |          dk    r|                    d           t	          |                                          D ]J}t          ||                   t          ||                   z  }|                    d| d|d	d           K|S )zIAnalyze active intensity minutes vs WHO weekly target (150 min moderate).moderate_minutesr   vigorous_minuteszNo valid intensity minutes datar   r^   u   📊 Average Daily Minutes:z   Moderate: r  z min/day | Vigorous: z min/dayz   Weekly equivalent: z min/week (WHO target: 150)   u4   ✅ Meeting WHO 150 min/week aerobic activity targetu   ⚠️ Below WHO target by ~z	 min/weekr   r   Nr   r   u0   
📅 Yearly Average (daily equivalent minutes):r   r+   )r6   rB   r   rF   r   r   )rm   rh   ri   rR   moderate_valsvigorous_valsr   modvigavg_modavg_vigavg_weekly_equivalentgapyearlyrM   r   yr_avgs                    r&   r   r   _  s   E#%r=M & &hh)1--2hh)1--277cAgg  %%%  %%% 3122-  3}#5#55G-  3}#5#55G$w{2a7	LL/000	LLXXXX7XXXXYYY	LL`*?````aaa##KLLLL))FCFFFFGGG F / /HHVR  hh)1--2hh)1--2!u 	/6!!!t4LcAg...
6{{QHIII6;;==)) 	= 	=D&&VD\):)::FLL;t;;v;;;;<<<<Lr(   c                    g }g g g g f\  }}}}| D ]}|                     d          }	|                     d          }
|                     d          }|                     dd          }|	r0|	dk    r*|                    |	           |                    |           |
r|
dk    r|                    |
           |r|dk    r|                    |           |sdgS t          |          t          |          z  }|                    d|d	d
           |                    dt          |           d           t          |          dk    rQ|d         }|d         }||z
  }|dk    rdnd}|                    d| dt	          |          d	d|d	d|d	d	           |rt          |          t          |          z  }|                    d|d	d           t          |          dk    rE|d         |d         z
  }|dk    rdnd}|                    d| dt	          |          d	d           |r9t          |          t          |          z  }|                    d|d	d           |S )z+Analyze body weight and composition trends.	weight_kgbody_fat_percentagemuscle_mass_kgr   r   r   zNo valid weight datau   📊 Average Weight: r   z kgr   z measurementsr   rl  u
   ▲ gainedu   ▼ lostz   Period change: r   z
 kg (from re   r   z   Body fat: z% (avg)u   ▲u   ▼z   Body fat change: rE  z   Muscle mass: z	 kg (avg)r  )rm   rh   ri   rR   weight_valsfat_valsmuscle_valsr   r   wrk  mrM   
avg_weightstart_wend_wdeltar   avg_fat	fat_delta
avg_muscles                        r&   r   r     s   E02BB-K; " "HH[!!HH*++HH%&&HHVR   	Qq!!!LLOOO 	QOOA 	"Qq!!! (&''[!!C$4$44J	LL<<<<<===	LLCC$4$4CCCDDD
;1a.B$)AIILL:	m)mmc%jjmmmPWmmmafmmmmnnn Sh--#h--/9W9999:::x==A x{2I!*QEILLQ	QQC	NNQQQQRRR C%%K(8(88
A
AAAABBBLr(   c           
         g }t          |           }| sdgS t          d | D                       }t          d | D                       }t          d | D                       }t          d | D                       }t          d | D                       }	t          d | D                       }
t          d | D                       }t          d	 | D                       }t          d
 | D                       }t          d | D                       }t          d | D                       }t          d | D                       }|                    d| d           |                    d           |                    d| d||z  dz  dd           |r.|                    d| d|t          |d          z  dd           |                    d| d||z  dz  dd           |                    d           |                    d| d| d||z  dz  dd           |s|s|r{g }|r|                    d |            |r|                    d!|            |r|                    d"|            |                    d#d$                    |                      |                    d%           |                    d&|	 d|	|z  dz  dd           |                    d'|
 d|
|z  dz  dd           |                    d(| d||z  dz  dd           |                    d)           |                    d*| d||z  dz  dd           |                    d+| d||z  dz  dd           |S ),z;Analyze Garmin Lifestyle Logging behaviors over the period.zNo lifestyle logging data foundc              3   D   K   | ]}|                     d           dV  dS )alcohol_loggedr   Nr6   r#   rM   s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s4      GGQquu5E/F/FGqGGGGGGr(   c              3   D   K   | ]}|                     d           dV  dS )morning_caffeine_loggedr   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s4      TT1559R3S3ST1TTTTTTr(   c              3   D   K   | ]}|                     d           dV  dS )late_caffeine_loggedr   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s4      NNa6L0M0MNNNNNNNr(   c              3   D   K   | ]}|                     d           dV  dS )light_exerciser   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s4      HHa6F0G0GHHHHHHHr(   c              3   D   K   | ]}|                     d           dV  dS )healthy_mealsr   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s3      KK!AEE/4J4JKAKKKKKKr(   c              3   D   K   | ]}|                     d           dV  dS )heavy_mealsr   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s3      GG!%%2F2FG!GGGGGGr(   c              3   D   K   | ]}|                     d           dV  dS )
late_mealsr   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s3      EEq|1D1DEEEEEEEr(   c              3   D   K   | ]}|                     d           dV  dS )intermittent_fastingr   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s4      MMQquu5K/L/LMqMMMMMMr(   c              3   B   K   | ]}|                     d d          V  dS )alcohol_beerr   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  0      AA!QUU>1--AAAAAAr(   c              3   B   K   | ]}|                     d d          V  dS )alcohol_winer   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  r  r(   c              3   B   K   | ]}|                     d d          V  dS )alcohol_spiritr   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s1      EEaquu-q11EEEEEEr(   c              3   B   K   | ]}|                     d d          V  dS )morning_caffeine_coffeer   Nr  r  s     r&   r7  z-_analyze_lifestyle_logging.<locals>.<genexpr>  s1      NNqquu6::NNNNNNr(   u   📊 Lifestyle Behaviors (z days logged):u   
☕ Caffeine:z   Morning caffeine: r[  r   r  r   z   Total coffees: z cups (r   r   z/logged day)z   Late caffeine: u   
🍺 Alcohol:z   Drinking days: r  r   u   beer×u   wine×u   spirit×z   Breakdown: r   u   
🍽️ Meals:z   Healthy meals: z   Heavy meals: z   Late meals: u   
⚡ Activity & Fasting:z   Light exercise logged: z   Intermittent fasting: )rF   r   rB   r   rE   )rm   rh   ri   rR   
total_daysalcohol_daysmorning_caf_dayslate_caf_dayslight_ex_dayshealthy_meal_daysheavy_meal_dayslate_meal_daysfasting_days
total_beer
total_winetotal_spirittotal_coffeepartss                     r&   r   r     s   EYJ 3122 GG)GGGGGLTTiTTTTTNN9NNNNNMHH9HHHHHMKKyKKKKKGGYGGGGGOEEIEEEEENMM)MMMMML AAyAAAAAJAAyAAAAAJEE9EEEEELNNINNNNNL	LLHjHHHIII	LL#$$$	LLi)9iiBRS]B]^aBaiiiijjj wu,uu|CP`abLcLc?cuuuuvvv	LL`m``M*<TUX<X````aaa	LL#$$$	LLflffZff<PZCZ[^C^ffffggg :Z :< : 	0LL.*../// 	0LL.*../// 	4LL2L223338dii&6&688999	LL$%%%	LLh&7hh@QR\@\]`@`hhhhiii	LLbObbOJ<VWZ<Zbbbbccc	LL_>__.:STW:W____```	LL-...	LLhmhhMR\D\]`D`hhhhiii	LLe\ee,zBYZ]B]eeeefffLr(   )&jsonr   r   r   typingr   r   r   r	   pathlibr
   healthr   health.services.queryr   "health.services.manual_log_storager   r   health.utils.logging_configr   r   r;   r   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r&   <module>r     s3    . . . . . . . . . . , , , , , , , , , , , ,             1 1 1 1 1 1 O O O O O O O O 4 4 4 4 4 4	h		U: U: U: U: U: U: U: U:p
94: 9d 9 9RVWZR[ 9 9 9 9xbDJ bt b$ b49 b b b bJ9d4j 9 9D 9T#Y 9 9 9 9xtDz $ T d3i    @d4j  D T#Y    @S T$Z  4 TXY\T]    &T$Z & &4 &DI & & & &R!DJ !t !$ !4PS9 ! ! ! !H"$t* "T " "c " " " "J#tDz #$ #T #d3i # # # #L;T$Z ; ;4 ;DQTI ; ; ; ;|0$t* 0T 0 0QUVYQZ 0 0 0 0f,tDz ,$ ,T ,d3i , , , ,^4$t* 4T 4 4QUVYQZ 4 4 4 4 4 4r(   