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


class Flight(Base):
    __tablename__ = "flights"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    flight_number = Column(String(50), nullable=False, index=True)
    route_id = Column(String(36), ForeignKey("routes.id", ondelete="RESTRICT"), nullable=False, index=True)
    aircraft_id = Column(String(36), ForeignKey("aircraft.id", ondelete="RESTRICT"), nullable=False, index=True)
    scheduled_departure = Column(DateTime, nullable=False, index=True)
    scheduled_arrival = Column(DateTime, nullable=False)
    actual_departure = Column(DateTime, nullable=True)
    actual_arrival = Column(DateTime, nullable=True)
    base_fare = Column(Numeric(12, 2), nullable=False)
    status = Column(String(50), nullable=False, default="Scheduled", index=True)
    gate = Column(String(20), nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    route = relationship("Route", back_populates="flights")
    aircraft = relationship("Aircraft", back_populates="flights")
    bookings = relationship("Booking", back_populates="flight", cascade="all, delete-orphan", passive_deletes=True)
    flight_crew_assignments = relationship("Flightcrewassignment", back_populates="flight", cascade="all, delete-orphan", passive_deletes=True)

    __table_args__ = (
        Index("ix_flights_status_departure", "status", "scheduled_departure"),
    )


class Fareclass(Base):
    __tablename__ = "fare_classes"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    name = Column(String(100), nullable=False, unique=True, index=True)
    class_type = Column(String(50), nullable=False)
    price_multiplier = Column(Numeric(5, 2), nullable=False)
    baggage_allowance_kg = Column(Numeric(5, 0), nullable=False)
    cancellation_allowed = Column(String(10), nullable=False, default="False")
    change_fee_percentage = Column(Numeric(5, 2), nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    bookings = relationship("Booking", back_populates="fare_class")