from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey, Enum as SQLEnum from sqlalchemy.orm import relationship from datetime import datetime from app.database import Base import enum class ItemType(str, enum.Enum): GROCERY = "grocery" MEDICATION = "medication" SUPPLEMENT = "supplement" class InventoryStatus(str, enum.Enum): NORMAL = "normal" LOW = "low" OUT = "out" class UserMedicationProfile(Base): __tablename__ = "user_medication_profiles" id = Column(Integer, primary_key=True, index=True) user_id = Column(String, index=True, default="default_user") allergies = Column(String, nullable=True) dose_events = relationship("DoseEvent", back_populates="profile") medication_items = relationship("MedicationItem", back_populates="profile") class DoseEvent(Base): __tablename__ = "dose_events" id = Column(Integer, primary_key=True, index=True) user_id = Column(String, index=True, default="default_user") profile_id = Column(Integer, ForeignKey("user_medication_profiles.id")) item_name = Column(String, index=True) amount_mg = Column(Float) timestamp = Column(DateTime, default=datetime.utcnow) source = Column(String, default="manual") profile = relationship("UserMedicationProfile", back_populates="dose_events") class MedicationItem(Base): __tablename__ = "medication_items" id = Column(Integer, primary_key=True, index=True) user_id = Column(String, index=True, default="default_user") profile_id = Column(Integer, ForeignKey("user_medication_profiles.id")) display_name = Column(String, index=True) strength = Column(String, nullable=True) form = Column(String, nullable=True) indication_plain = Column(String, nullable=True) instructions_plain = Column(String, nullable=True) warnings_plain = Column(String, nullable=True) barcode = Column(String, nullable=True) last_reviewed = Column(DateTime, default=datetime.utcnow) max_daily_dose_mg = Column(Float, nullable=True) profile = relationship("UserMedicationProfile", back_populates="medication_items") inventory_links = relationship("InventoryItem", back_populates="linked_item") class InventoryItem(Base): __tablename__ = "inventory_items" id = Column(Integer, primary_key=True, index=True) user_id = Column(String, index=True, default="default_user") name = Column(String, index=True) type = Column(SQLEnum(ItemType), default=ItemType.GROCERY) linked_item_id = Column(Integer, ForeignKey("medication_items.id"), nullable=True) quantity_estimate = Column(Integer, default=1) last_purchased_at = Column(DateTime, default=datetime.utcnow) status = Column(SQLEnum(InventoryStatus), default=InventoryStatus.NORMAL) linked_item = relationship("MedicationItem", back_populates="inventory_links")