from pydantic import BaseModel, EmailStr, Field from typing import Optional, Literal, List from datetime import datetime class UserCreate(BaseModel): email: Optional[EmailStr] = None password: Optional[str] = None preferred_language: str = Field(default="fr") class UserOut(BaseModel): id: str # Supabase auth user UUID preferred_language: str email: Optional[EmailStr] = None created_at: datetime class Config: from_attributes = True class Token(BaseModel): access_token: str token_type: str = "bearer" class ConversationCreate(BaseModel): user_id: Optional[str] = None context: Optional[str] = "" class ConversationOut(BaseModel): id: int user_id: Optional[str] started_at: datetime context: str class Config: from_attributes = True class MessageCreate(BaseModel): conversation_id: int message_type: Literal["text", "audio", "image"] = "text" content: str role: Literal["user", "assistant"] = "user" class MessageOut(BaseModel): id: int conversation_id: int message_type: str content: str role: str timestamp: datetime class Config: from_attributes = True class ChatRequest(BaseModel): conversation_id: Optional[int] = None text: str language: str = "fr" class ChatResponse(BaseModel): reply: str conversation_id: int class TranscribeRequest(BaseModel): audio_url: Optional[str] = None language: Optional[str] = None class TranscribeResponse(BaseModel): text: str class AnalyzeImageRequest(BaseModel): image_url: str prompt: Optional[str] = None class AnalyzeImageResponse(BaseModel): result: str class TranslateRequest(BaseModel): text: str target_language: str class TranslateResponse(BaseModel): text: str # Unified chat endpoint models class UnifiedChatRequest(BaseModel): message: str message_type: Literal["text", "audio", "image"] = "text" user_id: Optional[str] = None language: Optional[str] = None history: Optional[List[str]] = None class UnifiedContext(BaseModel): similar_cases_found: int most_probable_diagnosis: Optional[str] = None confidence_level: Literal["high", "medium", "low"] advice: str class UnifiedChatResponse(BaseModel): response: str context: UnifiedContext suggested_actions: List[str] language: Literal["fr", "en"]