from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from db.session import get_db
import controller.university as crud
import db.schemas.university as schemas

router = APIRouter()

@router.post("/")
def create_uni(university: schemas.UniversityBase, db: Session = Depends(get_db)):
    return crud.create_university(db, university)

@router.get("/", response_model=list[schemas.UniversityResponse])
async def read_unis(
    pageNo: int = Query(1, ge=1, description="Page number"),
    recordsPerPage: int = Query(10, ge=1, le=100, description="Number of records per page"),
    search: str | None = Query(None, description="Search universities by name or institution code"),
    sort_by: str = Query("id", description="Column name to sort by"),
    sort_order: str = Query("asc", description="Sort order: asc or desc"),
    db: Session = Depends(get_db),
):
    """
    Retrieve a paginated, searchable, and sortable list of universities.
    """
    return await crud.get_universities(
        pageNo=pageNo,
        recordsPerPage=recordsPerPage,
        search=search,
        sort_by=sort_by,
        sort_order=sort_order,
        db=db,
    )
@router.get("/dropdown", response_model=list[schemas.UniversityResponse])
def read_unis(db: Session = Depends(get_db)):
    return crud.get_universities_dropdown(db)

@router.get("/{university_id}", response_model=schemas.UniversityResponse)
def read_uni(university_id: int, db: Session = Depends(get_db)):
    uni = crud.get_university(db, university_id)
    if not uni:
        raise HTTPException(status_code=404, detail="University not found")
    return uni

@router.put("/{university_id}", response_model=schemas.UniversityResponse)
def update_uni(university_id: int, university: schemas.UniversityBase, db: Session = Depends(get_db)):
    uni = crud.update_university(db, university_id, university)
    if not uni:
        raise HTTPException(status_code=404, detail="University not found")
    return uni

@router.delete("/{university_id}")
def delete_uni(university_id: int, db: Session = Depends(get_db)):
    uni = crud.delete_university(db, university_id)
    if not uni:
        raise HTTPException(status_code=404, detail="University not found")
    return {"message": "University deleted successfully"}
