#!/usr/bin/env python3
"""Apple Health Export — Quick Summary
Reads ~/Downloads/HealthExport/apple_health_export/export.xml
and prints a summary of key metrics for the last 30 days.
"""

import os
import sys
import xml.etree.ElementTree as ET
from datetime import datetime, timedelta
from collections import defaultdict
from pathlib import Path

EXPORT_PATH = Path.home() / "Downloads/HealthExport/apple_health_export/export.xml"

METRICS = {
    "HKQuantityTypeIdentifierStepCount": "Steps",
    "HKQuantityTypeIdentifierHeartRate": "Heart Rate (bpm)",
    "HKQuantityTypeIdentifierBodyMass": "Weight (kg)",
    "HKQuantityTypeIdentifierActiveEnergyBurned": "Active Energy (kcal)",
    "HKQuantityTypeIdentifierDistanceWalkingRunning": "Walk/Run Distance (km)",
    "HKQuantityTypeIdentifierRestingHeartRate": "Resting HR (bpm)",
}

def find_export():
    candidates = [
        EXPORT_PATH,
        Path.home() / "Desktop/apple_health_export/export.xml",
        Path("/tmp/apple_health_export/export.xml"),
    ]
    for p in candidates:
        if p.exists():
            return p
    return None

def parse_health(export_path, days=30):
    cutoff = datetime.now() - timedelta(days=days)
    data = defaultdict(list)

    print(f"Parsing {export_path}...")
    tree = ET.parse(export_path)
    root = tree.getroot()

    for record in root.iter("Record"):
        rtype = record.get("type", "")
        if rtype not in METRICS:
            continue
        date_str = record.get("startDate", "")[:19]
        try:
            dt = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
        except ValueError:
            continue
        if dt < cutoff:
            continue
        try:
            val = float(record.get("value", "0"))
        except ValueError:
            continue
        data[rtype].append((dt, val))

    return data

def summarize(data, days=30):
    print(f"\n{'='*50}")
    print(f"  Apple Health Summary — Last {days} days")
    print(f"  As of: {datetime.now().strftime('%Y-%m-%d')}")
    print(f"{'='*50}\n")

    for hk_type, label in METRICS.items():
        records = data.get(hk_type, [])
        if not records:
            print(f"  {label:35s} — no data")
            continue

        values = [v for _, v in records]
        avg = sum(values) / len(values)
        mn = min(values)
        mx = max(values)
        total = sum(values)

        # Steps and Energy → show daily average + total
        if hk_type in ("HKQuantityTypeIdentifierStepCount",
                        "HKQuantityTypeIdentifierActiveEnergyBurned"):
            days_with_data = len(set(dt.date() for dt, _ in records))
            daily_avg = total / max(days_with_data, 1)
            print(f"  {label:35s} avg/day: {daily_avg:,.0f}  (total: {total:,.0f})")
        else:
            print(f"  {label:35s} avg: {avg:.1f}  min: {mn:.1f}  max: {mx:.1f}")

    print()

def main():
    export = find_export()
    if not export:
        print(f"ERROR: Health export not found.")
        print(f"  Export from iPhone → Health → Profile → Export All Health Data")
        print(f"  Unzip to: {EXPORT_PATH.parent}")
        sys.exit(1)

    data = parse_health(export, days=30)
    summarize(data, days=30)

if __name__ == "__main__":
    main()
