from sqlalchemy import Column, Integer, String, Float, ForeignKey, Date
from sqlalchemy.orm import relationship, declarative_base

Base = declarative_base()

class FoodCategory(Base):
    __tablename__ = 'food_categories'
    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True)
    foods = relationship("Food", back_populates="category")

class Food(Base):
    __tablename__ = 'foods'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    category_id = Column(Integer, ForeignKey('food_categories.id'))
    calories = Column(Float)
    fats = Column(Float)
    proteins = Column(Float)
    carbs = Column(Float)
    category = relationship("FoodCategory", back_populates="foods")

class Client(Base):
    __tablename__ = 'clients'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String, unique=True)
    mealplans = relationship("MealPlan", back_populates="client")

class MealPlan(Base):
    __tablename__ = 'mealplans'
    id = Column(Integer, primary_key=True)
    client_id = Column(Integer, ForeignKey('clients.id'))
    name = Column(String)
    start_date = Column(Date)
    client = relationship("Client", back_populates="mealplans")
    days = relationship("MealDay", back_populates="mealplan")

class MealDay(Base):
    __tablename__ = 'mealdays'
    id = Column(Integer, primary_key=True)
    mealplan_id = Column(Integer, ForeignKey('mealplans.id'))
    day_of_week = Column(String)
    mealplan = relationship("MealPlan", back_populates="days")
    meals = relationship("Meal", back_populates="day")

class Meal(Base):
    __tablename__ = 'meals'
    id = Column(Integer, primary_key=True)
    mealday_id = Column(Integer, ForeignKey('mealdays.id'))
    name = Column(String)
    day = relationship("MealDay", back_populates="meals")
    foods = relationship("MealFood", back_populates="meal")

class MealFood(Base):
    __tablename__ = 'mealfoods'
    id = Column(Integer, primary_key=True)
    meal_id = Column(Integer, ForeignKey('meals.id'))
    food_id = Column(Integer, ForeignKey('foods.id'))
    quantity = Column(Float)  # in grams
    meal = relationship("Meal", back_populates="foods")
    food = relationship("Food")
