from datetime import datetime, timezone from enum import Enum from typing import Optional from sqlmodel import Field, SQLModel class MealType(str, Enum): breakfast = "breakfast" lunch = "lunch" dinner = "dinner" snack = "snack" class User(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) username: str = Field(unique=True, index=True) hashed_password: str calorie_goal: float = 2000 protein_goal: float = 100 carbs_goal: float = 250 fat_goal: float = 70 class Product(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) barcode: str = Field(unique=True, index=True) name: str calories: float carbs: float protein: float fat: float sugar: float = 0.0 fiber: float = 0.0 saturated_fat: float = 0.0 salt: float = 0.0 class FoodLog(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) user_id: int = Field(foreign_key="user.id", index=True) barcode: Optional[str] = Field(default=None, index=True) name: str meal_type: MealType = MealType.snack amount_g: float calories: float carbs: float protein: float fat: float sugar: float = 0.0 fiber: float = 0.0 saturated_fat: float = 0.0 salt: float = 0.0 timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) class Dish(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) user_id: int = Field(foreign_key="user.id", index=True) product_barcode: str = Field(foreign_key="product.barcode", unique=True, index=True) name: str instructions: Optional[str] = None total_weight_g: float class DishIngredient(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) dish_id: int = Field(foreign_key="dish.id", index=True) product_barcode: str = Field(foreign_key="product.barcode") amount_g: float class DishShare(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) dish_id: int = Field(foreign_key="dish.id", index=True) shared_with_user_id: int = Field(foreign_key="user.id", index=True)