from sqlalchemy import Column, String, Integer, ForeignKey, Enum, DateTime, Boolean, func
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship, declarative_base
import uuid
import enum

Base = declarative_base()

class PaperType(str, enum.Enum):
    GLOSSY = "glossy"
    MATTE = "matte"

class FillMode(str, enum.Enum):
    PAPER_FULL = "paper_full"
    IMAGE_FULL = "image_full"

class OrderStatus(str, enum.Enum):
    CREATED = "created"
    DOWNLOADING = "downloading"
    COMPLETED = "completed"

class Order(Base):
    __tablename__ = "orders"

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    user_id = Column(String, nullable=True) # Could be treated as Customer Name for guest orders
    status = Column(Enum(OrderStatus), default=OrderStatus.CREATED)
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    
    items = relationship("OrderItem", back_populates="order", cascade="all, delete-orphan")

class OrderItem(Base):
    __tablename__ = "order_items"

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    order_id = Column(String, ForeignKey("orders.id"))
    product_code = Column(String, nullable=False)
    quantity = Column(Integer, default=1)
    paper_type = Column(Enum(PaperType), default=PaperType.GLOSSY)
    print_date = Column(Boolean, default=False)
    price = Column(Integer, default=0)
    
    order = relationship("Order", back_populates="items")
    photos = relationship("Photo", back_populates="order_item", cascade="all, delete-orphan")

class Photo(Base):
    __tablename__ = "photos"

    id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
    order_item_id = Column(String, ForeignKey("order_items.id"))
    
    # Path Separation for Non-destructive editing
    original_path = Column(String, nullable=False)
    processed_path = Column(String, nullable=True) # Null until processed
    
    original_filename = Column(String, nullable=True)
    
    # Photo-specific overrides (if any)
    fill_mode = Column(Enum(FillMode), default=FillMode.PAPER_FULL)
    is_enhanced = Column(Boolean, default=True)
    
    file_size = Column(Integer, default=0)
    created_at = Column(DateTime(timezone=True), server_default=func.now())

    order_item = relationship("OrderItem", back_populates="photos")
