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 BusCreate, BusUpdate, BusResponse, BusType

router = APIRouter(prefix="/buses", tags=["Bus Management"])


@router.post(
    "/",
    response_model=BusResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Bus",
    description="Creates a new bus record with seat configuration and amenities. Returns 409 if a bus with the same bus number already exists. Validates that total seats is positive and seat layout configuration is provided.",
)
def create_bus_route(data: BusCreate, db: Session = Depends(get_db)):
    return handler.create_bus(db, data)


@router.get(
    "/",
    response_model=List[BusResponse],
    summary="List Buses",
    description="Returns a paginated list of buses. Supports optional filtering by bus type and active status. Results are ordered by creation date in descending order.",
)
def list_buses_route(
    limit: int = Query(20, ge=1, le=100),
    offset: int = Query(0, ge=0),
    bus_type: Optional[BusType] = Query(None),
    is_active: Optional[bool] = Query(None),
    db: Session = Depends(get_db),
):
    return handler.list_buses(db, limit, offset, bus_type.value if bus_type else None, is_active)


@router.get(
    "/{id}",
    response_model=BusResponse,
    summary="Get Bus Details",
    description="Returns detailed information for a specific bus by ID. Returns 404 if the bus does not exist.",
)
def get_bus_route(id: str, db: Session = Depends(get_db)):
    return handler.get_bus(db, id)


@router.put(
    "/{id}",
    response_model=BusResponse,
    summary="Update Bus",
    description="Updates an existing bus record. All fields are optional. Returns 404 if the bus does not exist. Returns 409 if updating bus number to one that already exists for another bus.",
)
def update_bus_route(id: str, data: BusUpdate, db: Session = Depends(get_db)):
    return handler.update_bus(db, id, data)


@router.delete(
    "/{id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Bus",
    description="Deletes a bus record by ID. Returns 404 if the bus does not exist. Note that this may fail if the bus is referenced by existing schedules due to foreign key constraints.",
)
def delete_bus_route(id: str, db: Session = Depends(get_db)):
    return handler.delete_bus(db, id)