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


class CancellationRequestStatus(str, Enum):
    PENDING = "pending"
    APPROVED = "approved"
    REJECTED = "rejected"
    PROCESSED = "processed"


class Cancellationrequest(Base):
    __tablename__ = "cancellation_requests"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    booking_id = Column(String(36), ForeignKey("bookings.id", ondelete="RESTRICT"), nullable=False, index=True)
    customer_id = Column(String(36), ForeignKey("customers.id", ondelete="RESTRICT"), nullable=False, index=True)
    reason = Column(Text, nullable=False)
    requested_date = Column(DateTime, nullable=False)
    cancellation_fee = Column(Numeric(12, 2), nullable=False)
    refund_amount = Column(Numeric(12, 2), nullable=False)
    status = Column(SqlEnum(CancellationRequestStatus, name="cancellation_request_status_enum"), nullable=False, default=CancellationRequestStatus.PENDING)
    processed_by = Column(String(36), ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
    processed_date = Column(DateTime, nullable=True)
    admin_notes = Column(Text, nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    # Relationships
    booking = relationship("Booking", back_populates="cancellation_request")
    customer = relationship("Customer", back_populates="cancellation_requests")
    processor = relationship("User", foreign_keys=[processed_by], back_populates="processed_cancellation_requests")