from datetime import datetime, date from sqlalchemy import Column, Integer, String, Float, DateTime, Date, Text, Boolean, ForeignKey from sqlalchemy.orm import relationship from database import Base class Ingredient(Base): __tablename__ = "ingredients" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String, nullable=False) quantity = Column(Float, nullable=False) unit = Column(String, nullable=False) category = Column(String, nullable=True) expiry_date = Column(Date, nullable=True) added_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) class MealLog(Base): __tablename__ = "meal_log" id = Column(Integer, primary_key=True, autoincrement=True) meal_name = Column(String, nullable=False) meal_type = Column(String, nullable=False) eaten_at = Column(DateTime, nullable=False, default=datetime.utcnow) notes = Column(String, nullable=True) servings = Column(Integer, default=1) ingredients = relationship("MealIngredient", cascade="all, delete-orphan") class MealIngredient(Base): __tablename__ = "meal_ingredients" id = Column(Integer, primary_key=True, autoincrement=True) meal_log_id = Column(Integer, ForeignKey("meal_log.id", ondelete="CASCADE"), nullable=False) ingredient_name = Column(String, nullable=False) quantity_used = Column(Float, nullable=True) unit = Column(String, nullable=True) class Recipe(Base): __tablename__ = "recipes" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String, nullable=False) meal_type = Column(String, nullable=False) ingredients = Column(Text, nullable=False) instructions = Column(Text, nullable=True) estimated_time_minutes = Column(Integer, nullable=True) servings = Column(Integer, default=2) source = Column(String, default="ai") created_at = Column(DateTime, default=datetime.utcnow) class MenuPlan(Base): __tablename__ = "menu_plans" id = Column(Integer, primary_key=True, autoincrement=True) week_start = Column(Date, nullable=False, unique=True) plan = Column(Text, nullable=False) generated_at = Column(DateTime, default=datetime.utcnow) model_used = Column(String, nullable=True) notes = Column(Text, nullable=True) class GroceryList(Base): __tablename__ = "grocery_lists" id = Column(Integer, primary_key=True, autoincrement=True) generated_for = Column(Date, nullable=False) items = Column(Text, nullable=False) total_estimate = Column(Float, nullable=True) generated_at = Column(DateTime, default=datetime.utcnow) is_purchased = Column(Boolean, default=False) notes = Column(Text, nullable=True)