from sqlalchemy import Column, String, Integer, Boolean, DateTime, Numeric, ForeignKey, Enum as SqlEnum
from sqlalchemy.orm import relationship
from utils.utils import Base
from datetime import datetime
import uuid

class Promotion(Base):
    __tablename__ = "promotions"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    code = Column(String(50), nullable=True, unique=True, index=True)
    name = Column(String(255), nullable=False)
    description = Column(String, nullable=True)
    promotion_type = Column(String(50), nullable=False)
    discount_percentage = Column(Numeric(5, 2), nullable=True)
    discount_amount = Column(Numeric(12, 2), nullable=True)
    minimum_purchase_amount = Column(Numeric(12, 2), nullable=True)
    max_uses = Column(Integer, nullable=True)
    current_uses = Column(Integer, nullable=False, default=0)
    starts_at = Column(DateTime, nullable=False)
    expires_at = Column(DateTime, nullable=False)
    is_active = Column(Boolean, nullable=False, default=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    promotion_usages = relationship("Promotionusage", back_populates="promotion")


class Promotionusage(Base):
    __tablename__ = "promotion_usages"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    promotion_id = Column(String(36), ForeignKey("promotions.id", ondelete="CASCADE"), nullable=False, index=True)
    user_id = Column(String(36), ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
    order_id = Column(String(36), ForeignKey("orders.id", ondelete="CASCADE"), nullable=False, index=True)
    discount_applied = Column(Numeric(12, 2), nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    promotion = relationship("Promotion", back_populates="promotion_usages")
    user = relationship("User", back_populates="promotion_usages")
    order = relationship("Order", back_populates="promotion_usage")