import enum from datetime import datetime from sqlalchemy import String, Boolean, Enum, DateTime, Integer, Float, ForeignKey, JSON, Text from sqlalchemy.orm import Mapped, mapped_column from app.core.database import Base class DeckMode(str, enum.Enum): GENERATE = "generate" COMPLETE = "complete" CULL = "cull" class CardSlot(str, enum.Enum): CREATURE = "creature" INSTANT = "instant" SORCERY = "sorcery" ENCHANTMENT = "enchantment" ARTIFACT = "artifact" PLANESWALKER = "planeswalker" LAND = "land" BATTLE = "battle" class Deck(Base): __tablename__ = "decks" id: Mapped[int] = mapped_column(primary_key=True) owner_id: Mapped[int] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True) name: Mapped[str] = mapped_column(String(200), nullable=False) commander: Mapped[str] = mapped_column(String(200), nullable=False) description: Mapped[str | None] = mapped_column(Text) mode: Mapped[DeckMode] = mapped_column(Enum(DeckMode), nullable=False) playstyle: Mapped[str | None] = mapped_column(String(100)) prefer_owned: Mapped[bool] = mapped_column(Boolean, default=False) budget_enabled: Mapped[bool] = mapped_column(Boolean, default=False) budget_amount: Mapped[float | None] = mapped_column(Float) budget_scope: Mapped[str] = mapped_column(String(20), default="purchase") ai_reasoning: Mapped[dict | None] = mapped_column(JSON) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow) updated_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) class DeckCard(Base): __tablename__ = "deck_cards" id: Mapped[int] = mapped_column(primary_key=True) deck_id: Mapped[int] = mapped_column(ForeignKey("decks.id", ondelete="CASCADE"), nullable=False, index=True) scryfall_id: Mapped[str] = mapped_column(String(36), nullable=False) card_name: Mapped[str] = mapped_column(String(200), nullable=False) slot: Mapped[CardSlot] = mapped_column(Enum(CardSlot), nullable=False) quantity: Mapped[int] = mapped_column(Integer, default=1) is_owned: Mapped[bool] = mapped_column(Boolean, default=False) is_commander: Mapped[bool] = mapped_column(Boolean, default=False) ai_reasoning: Mapped[str | None] = mapped_column(Text) scryfall_data: Mapped[dict | None] = mapped_column(JSON)