from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from typing import Optional, List
from utils.utils import get_db
from . import handler
from .schema import RouteCreate, RouteUpdate, RouteResponse

router = APIRouter(prefix="/routes", tags=["Routes"])


@router.post(
    "/",
    response_model=RouteResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Route",
    description="Creates a new bus route between origin and destination cities. Returns 409 if a route with the same origin and destination already exists. Validates that distance and duration are positive numbers.",
)
def create_route_route(data: RouteCreate, db: Session = Depends(get_db)):
    return handler.create_route(db, data)


@router.get(
    "/",
    response_model=List[RouteResponse],
    summary="List Routes",
    description="Returns a paginated list of bus routes. Supports optional filtering by origin city, destination city, and active status. Results are ordered by creation date descending.",
)
def list_routes_route(
    limit: int = Query(20, ge=1, le=100),
    offset: int = Query(0, ge=0),
    origin_city: Optional[str] = Query(None),
    destination_city: Optional[str] = Query(None),
    is_active: Optional[bool] = Query(None),
    db: Session = Depends(get_db),
):
    return handler.list_routes(db, limit, offset, origin_city, destination_city, is_active)


@router.get(
    "/{route_id}",
    response_model=RouteResponse,
    summary="Get Route Details",
    description="Returns detailed information for a specific route by ID. Returns 404 if the route does not exist.",
)
def get_route_route(route_id: str, db: Session = Depends(get_db)):
    return handler.get_route(db, route_id)


@router.put(
    "/{route_id}",
    response_model=RouteResponse,
    summary="Update Route",
    description="Updates an existing route. Validates that the new origin-destination combination does not conflict with another route. Returns 404 if the route does not exist, 409 if the updated cities conflict with an existing route.",
)
def update_route_route(route_id: str, data: RouteUpdate, db: Session = Depends(get_db)):
    return handler.update_route(db, route_id, data)


@router.delete(
    "/{route_id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Route",
    description="Deletes a route by ID. Returns 404 if the route does not exist. Note that deleting a route may fail if it is referenced by existing schedules.",
)
def delete_route_route(route_id: str, db: Session = Depends(get_db)):
    return handler.delete_route(db, route_id)