"""Pydantic models for WHOOP API v2 responses."""

from datetime import datetime
from typing import Optional
from pydantic import BaseModel, Field


class SleepStages(BaseModel):
    """Sleep stage breakdown in milliseconds."""
    total_in_bed_time_milli: int = 0
    total_awake_time_milli: int = 0
    total_no_data_time_milli: int = 0
    total_light_sleep_time_milli: int = 0
    total_slow_wave_sleep_time_milli: int = 0
    total_rem_sleep_time_milli: int = 0
    sleep_cycle_count: int = 0
    disturbance_count: int = 0


class SleepScore(BaseModel):
    """Sleep quality metrics."""
    stage_summary: Optional[SleepStages] = None
    sleep_needed: Optional[dict] = None
    respiratory_rate: Optional[float] = None
    sleep_performance_percentage: Optional[float] = None
    sleep_consistency_percentage: Optional[float] = None
    sleep_efficiency_percentage: Optional[float] = None


class Sleep(BaseModel):
    """Sleep record from WHOOP API."""
    id: int
    user_id: int
    created_at: datetime
    updated_at: datetime
    start: datetime
    end: datetime
    timezone_offset: Optional[str] = None
    nap: bool = False
    score_state: str
    score: Optional[SleepScore] = None


class RecoveryScore(BaseModel):
    """Recovery metrics from WHOOP."""
    user_calibrating: bool = False
    recovery_score: Optional[int] = None
    resting_heart_rate: Optional[float] = None
    hrv_rmssd_milli: Optional[float] = None
    spo2_percentage: Optional[float] = None
    skin_temp_celsius: Optional[float] = None


class Recovery(BaseModel):
    """Recovery record from WHOOP API."""
    cycle_id: int
    sleep_id: int
    user_id: int
    created_at: datetime
    updated_at: datetime
    score_state: str
    score: Optional[RecoveryScore] = None


class StrainScore(BaseModel):
    """Strain metrics from WHOOP."""
    strain: float = 0.0
    kilojoule: float = 0.0
    average_heart_rate: int = 0
    max_heart_rate: int = 0


class Cycle(BaseModel):
    """Physiological cycle (typically one day) from WHOOP API."""
    id: int
    user_id: int
    created_at: datetime
    updated_at: datetime
    start: datetime
    end: Optional[datetime] = None
    timezone_offset: Optional[str] = None
    score_state: str
    score: Optional[StrainScore] = None


class Workout(BaseModel):
    """Workout/activity record from WHOOP API."""
    id: int
    user_id: int
    created_at: datetime
    updated_at: datetime
    start: datetime
    end: datetime
    timezone_offset: Optional[str] = None
    sport_id: int
    score_state: str
    score: Optional[StrainScore] = None


# Simplified output models for MCP tools

class TodayData(BaseModel):
    """Combined today's health data for daily check-in."""
    date: str
    recovery: Optional[dict] = Field(default=None, description="Recovery score and metrics")
    sleep: Optional[dict] = Field(default=None, description="Last night's sleep data")
    strain: Optional[dict] = Field(default=None, description="Current day strain")


class RecoverySummary(BaseModel):
    """Simplified recovery data for display."""
    date: str
    score: Optional[int] = Field(default=None, description="Recovery score 0-100")
    hrv: Optional[float] = Field(default=None, description="HRV in milliseconds")
    rhr: Optional[float] = Field(default=None, description="Resting heart rate")
    spo2: Optional[float] = Field(default=None, description="Blood oxygen percentage")
    skin_temp: Optional[float] = Field(default=None, description="Skin temperature celsius")
    zone: str = Field(default="unknown", description="green/yellow/red zone")


class SleepSummary(BaseModel):
    """Simplified sleep data for display."""
    date: str
    total_hours: float = Field(default=0, description="Total sleep hours")
    efficiency: Optional[float] = Field(default=None, description="Sleep efficiency %")
    performance: Optional[float] = Field(default=None, description="Sleep performance %")
    light_hours: float = Field(default=0, description="Light sleep hours")
    deep_hours: float = Field(default=0, description="Deep/SWS hours")
    rem_hours: float = Field(default=0, description="REM sleep hours")
    disturbances: int = Field(default=0, description="Number of disturbances")


class StrainSummary(BaseModel):
    """Simplified strain data for display."""
    date: str
    day_strain: float = Field(default=0, description="Day strain 0-21")
    calories: float = Field(default=0, description="Kilojoules burned")
    avg_hr: int = Field(default=0, description="Average heart rate")
    max_hr: int = Field(default=0, description="Max heart rate")


class WorkoutSummary(BaseModel):
    """Simplified workout data for display."""
    id: str = Field(description="Workout ID")
    date: str = Field(description="Date of workout (YYYY-MM-DD)")
    time: str = Field(description="Start time (HH:MM)")
    sport_name: str = Field(default="Unknown", description="Activity name (e.g., Surfing, Mountain Biking)")
    sport_id: Optional[int] = Field(default=None, description="WHOOP sport ID")
    duration_minutes: float = Field(default=0, description="Workout duration in minutes")
    strain: float = Field(default=0, description="Workout strain 0-21")
    avg_hr: int = Field(default=0, description="Average heart rate")
    max_hr: int = Field(default=0, description="Maximum heart rate")
    calories: float = Field(default=0, description="Kilojoules burned")
