from app.utils.db import fetch_all, paginate
from fastapi import APIRouter, Depends, Request
from sqlalchemy.orm import Session
from sqlalchemy import asc, desc, select

from app.core.database import get_db
from app.core.response import send_response, send_error
from app.models.department import Department
from app.core.auth import get_current_user

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


@router.post("")
async def store(
    request: Request,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    body = await request.json()

    department_id = body.get("id")
    name = body.get("name")

    if not name:
        return send_error("Validation Error", {"name": "required"})

    if department_id:
        department = db.query(Department).filter(Department.id == department_id).first()
        if not department:
            return send_error("Department tidak ditemukan", department_code=404)
    else:
        department = Department()

    for field in ["name"]:
        if field in body:
            setattr(department, field, body[field])

    db.add(department)
    db.commit()
    db.refresh(department)

    return send_response(department.to_dict(), "Sukses menyimpan department", 201)


@router.get("")
def index(
    request: Request,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    params = request.query_params

    per_page = int(params.get("itemsPerPage", 0))
    page = int(params.get("page", 1))
    sort_by = params.get("sortBy", "updated_at")
    sort_order = params.get("sortOrder", "desc")
    keyword = params.get("q")

    query = select(
        Department.id,
        Department.name,
    )

    if keyword:
        query = query.filter(Department.name.like(f"%{keyword}%"))

    if per_page:
        rows = paginate(db, query, page, per_page, sort_by, sort_order)
    else:
        rows = fetch_all(db, query)
    return send_response(rows, "Daftar department")


@router.get("/{department_id}")
def show(
    department_id: str,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    department = db.query(Department).filter(Department.id == department_id).first()

    if not department:
        return send_error("Department tidak ditemukan", department_code=404)

    return send_response(department.to_dict(), "Detail department")


@router.delete("/{department_id}")
def destroy(
    department_id: str,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    department = db.query(Department).filter(Department.id == department_id).first()

    if not department:
        return send_error("Department tidak ditemukan", department_code=404)

    db.delete(department)
    db.commit()

    return send_response(department.to_dict(), "Berhasil menonaktifkan department")
