"""
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"
    )
