from pydantic import BaseModel, Field from typing import List, Dict, Any, Optional from datetime import datetime class ChatRequest(BaseModel): message: str = Field(..., min_length=1, max_length=1000) chat_history: List[Dict[str, str]] = Field(default_factory=list) class Source(BaseModel): title: str url: str relevance_score: float class ChatResponse(BaseModel): answer: str sources: List[Source] = Field(default_factory=list) suggested_questions: List[str] = Field(default_factory=list) processing_time: Optional[float] = None class UserPreferences(BaseModel): favorite_destinations: List[str] = Field(default_factory=list) travel_style: str = Field(default="balanced") preferred_seasons: List[str] = Field(default_factory=list) interests: List[str] = Field(default_factory=list) dietary_restrictions: List[str] = Field(default_factory=list) accessibility_needs: List[str] = Field(default_factory=list) language: str = Field(default="en") currency: str = Field(default="USD") temperature_unit: str = Field(default="C") timezone: str = Field(default="UTC") class UserProfileResponse(BaseModel): user_id: str preferences: UserPreferences created_at: datetime updated_at: datetime class UserPreferencesUpdate(BaseModel): favorite_destinations: Optional[List[str]] = None travel_style: Optional[str] = None preferred_seasons: Optional[List[str]] = None interests: Optional[List[str]] = None dietary_restrictions: Optional[List[str]] = None accessibility_needs: Optional[List[str]] = None language: Optional[str] = None currency: Optional[str] = None temperature_unit: Optional[str] = None timezone: Optional[str] = None class ErrorResponse(BaseModel): error: str detail: Optional[str] = None timestamp: str = Field(default_factory=lambda: datetime.utcnow().isoformat()) request_id: Optional[str] = None