from pydantic import BaseModel from typing import Optional, List, Any, Dict from datetime import datetime class ScanRequest(BaseModel): barcode: str class IngredientAnalysis(BaseModel): name: str popular_name: Optional[str] = None explanation: str = "" classification: str = "warning" reason: str = "" is_allergen: Optional[bool] = False class RecipeInfo(BaseModel): title: Optional[str] = None description: Optional[str] = None prep_time: Optional[str] = None calories: Optional[str] = None ingredients_list: Optional[List[str]] = None steps: Optional[List[str]] = None tip: Optional[str] = None class SubstitutionItem(BaseModel): name: str brand: Optional[str] = None reason: str = "" estimated_score: Optional[int] = None class AllergenAlert(BaseModel): ingredient: str allergy: str class ScanResult(BaseModel): id: Optional[int] = None barcode: str product_name: Optional[str] = None brand: Optional[str] = None category: Optional[str] = None image_url: Optional[str] = None score: int summary: str positives: List[str] negatives: List[str] ingredients: List[Any] # Allow flexible ingredient format nutrition: Optional[Dict[str, Any]] = None nutrition_verdict: Optional[str] = None recipe: Optional[Any] = None nutri_score: Optional[str] = None nova_group: Optional[int] = None substitutions: Optional[List[Any]] = None allergen_alerts: Optional[List[Any]] = None new_badges: Optional[List[str]] = None source: str = "open_food_facts" class ScanHistoryItem(BaseModel): id: int barcode: str product_name: Optional[str] = None brand: Optional[str] = None score: int scanned_at: datetime