from datetime import datetime
from enum import Enum as PyEnum
from uuid import uuid4

from sqlalchemy import Column, DateTime, Enum, ForeignKey, Numeric, String
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship

from app.database import Base


class PaymentType(str, PyEnum):
    APPLICATION_FEE = "application_fee"
    ACCEPTANCE_FEE = "acceptance_fee"
    TUITION = "tuition"


class PaymentStatus(str, PyEnum):
    PENDING = "pending"
    COMPLETED = "completed"
    FAILED = "failed"


class Payment(Base):
    __tablename__ = "payments"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4, index=True)
    application_id = Column(UUID(as_uuid=True), ForeignKey("applications.id"), nullable=False, index=True)
    
    payment_type = Column(Enum(PaymentType), nullable=False)
    amount = Column(Numeric(10, 2), nullable=False)
    status = Column(Enum(PaymentStatus), default=PaymentStatus.PENDING, nullable=False, index=True)
    
    payment_date = Column(DateTime, nullable=True)
    payment_reference = Column(String(100), nullable=True, unique=True, index=True)
    gateway = Column(String(50), nullable=True)  # paystack, flutterwave, etc.
    
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
    
    # Relationship
    application = relationship("Application", backref="payments")

    def __repr__(self):
        return f"<Payment {self.payment_reference}: {self.amount} - {self.status}>"
