"""
Pydantic models for exercise activities and workouts.
"""

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


class Activity(BaseModel):
    """Exercise activity summary."""

    activity_id: str = Field(..., description="Unique activity ID")
    activity_type: str = Field(..., description="Type of activity (running, cycling, etc.)")
    activity_name: Optional[str] = Field(default=None, description="Activity name")
    date: date_type = Field(..., description="Date of the activity")
    start_time: Optional[datetime] = Field(default=None, description="Activity start time")
    duration_seconds: Optional[float] = Field(
        default=None, description="Activity duration in seconds"
    )
    distance_meters: Optional[float] = Field(
        default=None, description="Distance covered in meters"
    )
    elevation_gain_meters: Optional[float] = Field(
        default=None, description="Elevation gain in meters"
    )
    elevation_loss_meters: Optional[float] = Field(
        default=None, description="Elevation loss in meters"
    )
    calories: Optional[int] = Field(default=None, description="Calories burned")
    average_heart_rate: Optional[int] = Field(
        default=None, description="Average heart rate in bpm"
    )
    max_heart_rate: Optional[int] = Field(
        default=None, description="Maximum heart rate in bpm"
    )
    average_speed_mps: Optional[float] = Field(
        default=None, description="Average speed in meters per second"
    )
    max_speed_mps: Optional[float] = Field(
        default=None, description="Maximum speed in meters per second"
    )
    average_pace_min_per_km: Optional[float] = Field(
        default=None, description="Average pace in minutes per kilometer"
    )
    average_cadence: Optional[float] = Field(
        default=None, description="Average cadence (steps/min or rpm)"
    )
    training_effect: Optional[float] = Field(
        default=None, description="Aerobic training effect"
    )
    anaerobic_training_effect: Optional[float] = Field(
        default=None, description="Anaerobic training effect"
    )
    location_name: Optional[str] = Field(
        default=None, description="Location of the activity"
    )
    description: Optional[str] = Field(
        default=None, description="Activity description"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class ActivityDetail(BaseModel):
    """Detailed activity data including splits and laps."""

    activity_id: str = Field(..., description="Activity ID")
    summary: Activity = Field(..., description="Activity summary")
    laps: Optional[List[Dict[str, Any]]] = Field(
        default=None, description="Lap data"
    )
    splits: Optional[List[Dict[str, Any]]] = Field(
        default=None, description="Split data"
    )
    samples: Optional[List[Dict[str, Any]]] = Field(
        default=None, description="Time-series samples (HR, speed, etc.)"
    )
    gear: Optional[str] = Field(default=None, description="Gear used")
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )
