import uuid from datetime import datetime, date from typing import Dict, Any, Optional, Union, List, Literal from pydantic import BaseModel, Field class Insight(BaseModel): """A single insight generated by the agent.""" message: str value: Optional[Union[float, int, str]] = None raw_data: Dict[str, Any] = Field(default_factory=dict) evidence: Optional[List[str]] = None constraint: Optional[str] = None class InsightsOutput(BaseModel): """Output from the InsightsAgent.""" primary_lever: Insight risk_signal: Insight key_observations: List[Insight] summary: Optional[Insight] = None class PlanOutput(BaseModel): """Output from the PlanAgent.""" plan: str class RiskAssessment(BaseModel): """Assessment of injury or fatigue risk based on heuristics.""" risk_level: Literal["LOW", "MEDIUM", "HIGH"] reasons: List[str] = Field(default_factory=list) recommended_adjustments: List[str] = Field(default_factory=list) metrics_used: Dict[str, Any] = Field(default_factory=dict) class WeeklyTrends(BaseModel): """Weekly trend metrics used for analysis.""" pace_trend_s_per_km: Optional[float] = None distance_trend_m: Optional[float] = None avg_runs_per_week: Optional[float] = None run_monotony: Optional[float] = None class WeeklySummary(BaseModel): """Aggregated metrics for the current coaching session.""" week_start: Optional[date] = None weekly_km: Dict[str, float] = Field(default_factory=dict) consistency_score: int = 50 num_runs: int = 0 total_distance_m: float = 0.0 avg_hr_bpm: Optional[float] = None avg_pace_s_per_km: float = 0.0 total_duration_s: int = 0 performance_brief: Optional[str] = None performance_focus: Optional[str] = None structure_status: Optional[dict] = None brief_source_hash: Optional[str] = None brief_generated_at: Optional[datetime] = None class AnalysisRecord(BaseModel): """Full record of an analysis run.""" id: str = Field(default_factory=lambda: str(uuid.uuid4())) created_at: datetime = Field(default_factory=datetime.now) source_files: List[str] = Field(default_factory=list) formats: List[str] = Field(default_factory=list) run_summary: Dict[str, Any] = Field(default_factory=dict) run_timeseries: List[Dict[str, Any]] = Field(default_factory=list) insights_json: Dict[str, Any] = Field(default_factory=dict) plan_json: Dict[str, Any] = Field(default_factory=dict) route_json: Dict[str, Any] = Field(default_factory=dict)