"""
Pydantic models for daily health metrics.

Includes models for steps, heart rate, sleep, stress, body battery, and more.
"""

from datetime import date as date_type, time as time_type
from typing import Optional, List, Dict, Any
from pydantic import BaseModel, Field


class StepsData(BaseModel):
    """Daily step count and related metrics."""

    date: date_type = Field(..., description="Date of the data")
    total_steps: Optional[int] = Field(default=None, description="Total steps taken")
    total_distance_meters: Optional[float] = Field(
        default=None, description="Total distance in meters"
    )
    calories_burned: Optional[int] = Field(
        default=None, description="Calories burned from steps"
    )
    step_goal: Optional[int] = Field(default=None, description="Daily step goal")
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class HeartRateData(BaseModel):
    """Daily heart rate metrics."""

    date: date_type = Field(..., description="Date of the data")
    resting_heart_rate: Optional[int] = Field(
        default=None, description="Resting heart rate in bpm"
    )
    min_heart_rate: Optional[int] = Field(
        default=None, description="Minimum heart rate in bpm"
    )
    max_heart_rate: Optional[int] = Field(
        default=None, description="Maximum heart rate in bpm"
    )
    average_heart_rate: Optional[int] = Field(
        default=None, description="Average heart rate in bpm"
    )
    heart_rate_zones: Optional[Dict[str, int]] = Field(
        default=None, description="Time in each heart rate zone (minutes)"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class SleepData(BaseModel):
    """Daily sleep metrics."""

    date: date_type = Field(..., description="Date of the sleep (night)")
    total_sleep_seconds: Optional[int] = Field(
        default=None, description="Total sleep time in seconds"
    )
    deep_sleep_seconds: Optional[int] = Field(
        default=None, description="Deep sleep time in seconds"
    )
    light_sleep_seconds: Optional[int] = Field(
        default=None, description="Light sleep time in seconds"
    )
    rem_sleep_seconds: Optional[int] = Field(
        default=None, description="REM sleep time in seconds"
    )
    awake_seconds: Optional[int] = Field(
        default=None, description="Time awake in seconds"
    )
    sleep_score: Optional[int] = Field(
        default=None, description="Overall sleep quality score (0-100)"
    )
    sleep_start_time: Optional[time_type] = Field(
        default=None, description="Sleep start time"
    )
    sleep_end_time: Optional[time_type] = Field(default=None, description="Sleep end time")
    sleep_levels: Optional[List[Dict[str, Any]]] = Field(
        default=None, description="Detailed sleep level timeline"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class StressData(BaseModel):
    """Daily stress level metrics."""

    date: date_type = Field(..., description="Date of the data")
    average_stress_level: Optional[int] = Field(
        default=None, description="Average stress level (0-100)"
    )
    max_stress_level: Optional[int] = Field(
        default=None, description="Maximum stress level (0-100)"
    )
    rest_stress_duration_seconds: Optional[int] = Field(
        default=None, description="Time in rest/low stress state"
    )
    activity_stress_duration_seconds: Optional[int] = Field(
        default=None, description="Time in activity stress state"
    )
    low_stress_duration_seconds: Optional[int] = Field(
        default=None, description="Time in low stress state"
    )
    medium_stress_duration_seconds: Optional[int] = Field(
        default=None, description="Time in medium stress state"
    )
    high_stress_duration_seconds: Optional[int] = Field(
        default=None, description="Time in high stress state"
    )
    stress_timeline: Optional[List[Any]] = Field(
        default=None, description="Detailed stress timeline (list of [timestamp, value] pairs)"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class BodyBatteryData(BaseModel):
    """Daily Body Battery metrics."""

    date: date_type = Field(..., description="Date of the data")
    charged: Optional[int] = Field(
        default=None, description="Total Body Battery charged"
    )
    drained: Optional[int] = Field(
        default=None, description="Total Body Battery drained"
    )
    highest_value: Optional[int] = Field(
        default=None, description="Highest Body Battery value (0-100)"
    )
    lowest_value: Optional[int] = Field(
        default=None, description="Lowest Body Battery value (0-100)"
    )
    most_recent_value: Optional[int] = Field(
        default=None, description="Most recent Body Battery value"
    )
    timeline: Optional[List[Any]] = Field(
        default=None, description="Detailed Body Battery timeline (list of [timestamp, value] pairs)"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class SpO2Data(BaseModel):
    """Daily blood oxygen saturation metrics."""

    date: date_type = Field(..., description="Date of the data")
    average_spo2: Optional[float] = Field(
        default=None, description="Average SpO2 percentage"
    )
    min_spo2: Optional[float] = Field(
        default=None, description="Minimum SpO2 percentage"
    )
    max_spo2: Optional[float] = Field(
        default=None, description="Maximum SpO2 percentage"
    )
    readings: Optional[List[Dict[str, Any]]] = Field(
        default=None, description="Individual SpO2 readings"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class RespirationData(BaseModel):
    """Daily respiration rate metrics."""

    date: date_type = Field(..., description="Date of the data")
    average_respiration_rate: Optional[float] = Field(
        default=None, description="Average breaths per minute"
    )
    min_respiration_rate: Optional[float] = Field(
        default=None, description="Minimum breaths per minute"
    )
    max_respiration_rate: Optional[float] = Field(
        default=None, description="Maximum breaths per minute"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class HydrationData(BaseModel):
    """Daily hydration tracking."""

    date: date_type = Field(..., description="Date of the data")
    total_intake_ml: Optional[int] = Field(
        default=None, description="Total water intake in milliliters"
    )
    goal_ml: Optional[int] = Field(default=None, description="Daily hydration goal")
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class FloorsData(BaseModel):
    """Daily floors climbed."""

    date: date_type = Field(..., description="Date of the data")
    floors_climbed: Optional[int] = Field(
        default=None, description="Number of floors climbed"
    )
    floors_descended: Optional[int] = Field(
        default=None, description="Number of floors descended"
    )
    floor_goal: Optional[int] = Field(default=None, description="Daily floor goal")
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class IntensityMinutesData(BaseModel):
    """Daily intensity minutes."""

    date: date_type = Field(..., description="Date of the data")
    moderate_minutes: Optional[int] = Field(
        default=None, description="Moderate intensity minutes"
    )
    vigorous_minutes: Optional[int] = Field(
        default=None, description="Vigorous intensity minutes"
    )
    total_minutes: Optional[int] = Field(
        default=None, description="Total intensity minutes"
    )
    weekly_goal: Optional[int] = Field(
        default=None, description="Weekly intensity goal"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class HRVData(BaseModel):
    """Daily heart rate variability metrics."""

    date: date_type = Field(..., description="Date of the data")
    hrv_value: Optional[float] = Field(
        default=None, description="HRV value in milliseconds"
    )
    baseline_hrv: Optional[float] = Field(
        default=None, description="Baseline HRV for comparison"
    )
    status: Optional[str] = Field(
        default=None, description="HRV status (balanced, unbalanced, etc.)"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class RHRData(BaseModel):
    """Daily resting heart rate."""

    date: date_type = Field(..., description="Date of the data")
    resting_heart_rate: Optional[int] = Field(
        default=None, description="Resting heart rate in bpm"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class LifestyleLoggingData(BaseModel):
    """Daily lifestyle logging from Garmin Lifestyle Logging feature.

    Tracks behaviors the user logs in the Garmin Connect app:
    alcohol, caffeine, meal quality/timing, light exercise, and intermittent fasting.
    Boolean fields (NONE type) are True when the user checked that behavior.
    Integer fields (QUANTITY type) reflect the number of drinks/cups logged per subtype.
    """

    date: date_type = Field(..., description="Date of the data")

    # Alcohol (QUANTITY)
    alcohol_logged: bool = Field(default=False, description="Any alcohol logged")
    alcohol_beer: int = Field(default=0, description="Number of beers logged")
    alcohol_wine: int = Field(default=0, description="Number of glasses of wine logged")
    alcohol_spirit: int = Field(default=0, description="Number of spirit drinks logged")
    alcohol_other: int = Field(default=0, description="Number of other alcohol drinks logged")

    # Morning Caffeine (QUANTITY)
    morning_caffeine_logged: bool = Field(default=False, description="Morning caffeine logged")
    morning_caffeine_coffee: int = Field(default=0, description="Morning coffees")
    morning_caffeine_tea: int = Field(default=0, description="Morning teas")
    morning_caffeine_other: int = Field(default=0, description="Other morning caffeine drinks")

    # Late Caffeine (QUANTITY) — important for sleep quality correlation
    late_caffeine_logged: bool = Field(default=False, description="Late caffeine logged")
    late_caffeine_coffee: int = Field(default=0, description="Late-day coffees")
    late_caffeine_tea: int = Field(default=0, description="Late-day teas")
    late_caffeine_other: int = Field(default=0, description="Other late-day caffeine drinks")

    # Lifestyle behaviors (NONE type — boolean checked/unchecked)
    light_exercise: bool = Field(default=False, description="Light exercise done")
    healthy_meals: bool = Field(default=False, description="Healthy meals eaten")
    heavy_meals: bool = Field(default=False, description="Heavy meals eaten")
    late_meals: bool = Field(default=False, description="Late meals eaten")
    intermittent_fasting: bool = Field(default=False, description="Intermittent fasting done")

    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )
