import uuid
from datetime import datetime
from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, UniqueConstraint, Index, Enum as SqlEnum
from sqlalchemy.orm import relationship
from utils.utils import Base
from enum import Enum


class RouteStatus(str, Enum):
    ACTIVE = "Active"
    INACTIVE = "Inactive"


class Airport(Base):
    __tablename__ = "airports"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    code = Column(String(3), unique=True, nullable=False, index=True)
    name = Column(String(255), nullable=False)
    city = Column(String(255), nullable=False)
    country = Column(String(255), nullable=False)
    timezone = Column(String(100), nullable=False)
    latitude = Column(String(50), nullable=True)
    longitude = Column(String(50), nullable=True)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    routes_as_origin = relationship("Route", foreign_keys="Route.origin_airport_id", back_populates="origin_airport")
    routes_as_destination = relationship("Route", foreign_keys="Route.destination_airport_id", back_populates="destination_airport")


class Route(Base):
    __tablename__ = "routes"

    id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4()))
    origin_airport_id = Column(String(36), ForeignKey("airports.id", ondelete="RESTRICT"), nullable=False, index=True)
    destination_airport_id = Column(String(36), ForeignKey("airports.id", ondelete="RESTRICT"), nullable=False, index=True)
    distance_km = Column(Integer, nullable=False)
    estimated_duration_minutes = Column(Integer, nullable=False)
    status = Column(SqlEnum(RouteStatus, name="route_status_enum"), nullable=False, default=RouteStatus.ACTIVE)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)

    origin_airport = relationship("Airport", foreign_keys=[origin_airport_id], back_populates="routes_as_origin")
    destination_airport = relationship("Airport", foreign_keys=[destination_airport_id], back_populates="routes_as_destination")
    flights = relationship("Flight", back_populates="route")

    __table_args__ = (
        UniqueConstraint("origin_airport_id", "destination_airport_id", name="uq_route_origin_destination"),
        Index("ix_routes_status", "status"),
    )