from sqlalchemy import Column, String, DateTime, ForeignKey, Numeric, Enum as SqlEnum, Index
from sqlalchemy.orm import relationship
from datetime import datetime
import uuid
from utils.utils import Base
from .schema import TransactionTypeEnum, TransactionStatusEnum


class Transaction(Base):
    __tablename__ = "transactions"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    user_id = Column(String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False, index=True)
    order_id = Column(String(36), ForeignKey("orders.id", ondelete="SET NULL"), nullable=True, index=True)
    transaction_type = Column(SqlEnum(TransactionTypeEnum, name="transaction_type_enum"), nullable=False)
    amount = Column(Numeric(12, 2), nullable=False)
    currency = Column(String(3), nullable=False, default="USD")
    status = Column(SqlEnum(TransactionStatusEnum, name="transaction_status_enum"), nullable=False)
    description = Column(String(500), nullable=True)
    reference_id = Column(String(255), nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    user = relationship("User", back_populates="transactions")
    order = relationship("Order", back_populates="transactions")

    __table_args__ = (
        Index("ix_transactions_user_created", "user_id", "created_at"),
        Index("ix_transactions_status", "status"),
    )