from fastapi import APIRouter, Depends, Query, status
from sqlalchemy.orm import Session
from typing import Optional
from utils.utils import get_db
from . import handler
from .schema import DepartmentCreate, DepartmentUpdate, DepartmentResponse, PaginatedDepartmentResponse

router = APIRouter(prefix="/departments", tags=["Departments"])


@router.post(
    "/",
    response_model=DepartmentResponse,
    status_code=status.HTTP_201_CREATED,
    summary="Create Department",
    description="Creates a new department record. Returns 409 if the department name already exists.",
)
def create_department_route(data: DepartmentCreate, db: Session = Depends(get_db)):
    return handler.create_department(db, data)


@router.get(
    "/",
    response_model=PaginatedDepartmentResponse,
    summary="List Departments",
    description="Returns a paginated list of departments. Supports optional search filter on department name.",
)
def list_departments_route(
    limit: int = Query(20, ge=1),
    offset: int = Query(0, ge=0),
    search: Optional[str] = None,
    db: Session = Depends(get_db),
):
    return handler.list_departments(db, limit, offset, search=search)


@router.get(
    "/{department_id}",
    response_model=DepartmentResponse,
    summary="Get Department",
    description="Retrieves a single department by ID. Returns 404 if the department does not exist.",
)
def get_department_route(department_id: str, db: Session = Depends(get_db)):
    return handler.get_department(db, department_id)


@router.put(
    "/{department_id}",
    response_model=DepartmentResponse,
    summary="Update Department",
    description="Updates an existing department. Only provided fields are updated. Returns 404 if the department does not exist, 409 if the new name conflicts with an existing department.",
)
def update_department_route(department_id: str, data: DepartmentUpdate, db: Session = Depends(get_db)):
    return handler.update_department(db, department_id, data)


@router.delete(
    "/{department_id}",
    status_code=status.HTTP_200_OK,
    summary="Delete Department",
    description="Deletes a department by ID. Returns 404 if the department does not exist, 409 if the department is referenced by other records (users, appointments, services).",
)
def delete_department_route(department_id: str, db: Session = Depends(get_db)):
    return handler.delete_department(db, department_id)