"""
Pydantic models for body metrics (weight, body composition).
"""

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


class WeightData(BaseModel):
    """Body weight measurement."""

    date: date_type = Field(..., description="Date of measurement")
    weight_kg: Optional[float] = Field(default=None, description="Weight in kilograms")
    bmi: Optional[float] = Field(default=None, description="Body Mass Index")
    body_fat_percentage: Optional[float] = Field(
        default=None, description="Body fat percentage"
    )
    body_water_percentage: Optional[float] = Field(
        default=None, description="Body water percentage"
    )
    bone_mass_kg: Optional[float] = Field(
        default=None, description="Bone mass in kilograms"
    )
    muscle_mass_kg: Optional[float] = Field(
        default=None, description="Muscle mass in kilograms"
    )
    timestamp: Optional[datetime] = Field(
        default=None, description="Exact measurement time"
    )
    source: Optional[str] = Field(
        default=None, description="Source of measurement (scale model, manual, etc.)"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )


class BodyComposition(BaseModel):
    """Detailed body composition metrics."""

    date: date_type = Field(..., description="Date of measurement")
    weight_kg: Optional[float] = Field(default=None, description="Weight in kilograms")
    bmi: Optional[float] = Field(default=None, description="Body Mass Index")
    body_fat_percentage: Optional[float] = Field(
        default=None, description="Body fat percentage"
    )
    skeletal_muscle_mass_kg: Optional[float] = Field(
        default=None, description="Skeletal muscle mass in kilograms"
    )
    bone_mass_kg: Optional[float] = Field(
        default=None, description="Bone mass in kilograms"
    )
    body_water_percentage: Optional[float] = Field(
        default=None, description="Body water percentage"
    )
    visceral_fat_rating: Optional[int] = Field(
        default=None, description="Visceral fat rating"
    )
    metabolic_age: Optional[int] = Field(
        default=None, description="Metabolic age in years"
    )
    raw_data: Optional[Dict[str, Any]] = Field(
        default=None, description="Raw API response"
    )
