from app.core.auth import get_current_user
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.keterangan import Keterangan

router = APIRouter(prefix="/keterangan", tags=["Keterangan"])


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

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

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

    if keterangan_id:
        keterangan = db.query(Keterangan).filter(Keterangan.id == keterangan_id).first()
        if not keterangan:
            return send_error("Keterangan tidak ditemukan", keterangan_code=404)
    else:
        keterangan = Keterangan()

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

    db.add(keterangan)
    db.commit()
    db.refresh(keterangan)

    return send_response(keterangan.to_dict(), "Sukses menyimpan keterangan", 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(
        Keterangan.id,
        Keterangan.name,
    )

    if keyword:
        query = query.filter(Keterangan.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 keterangan")


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

    if not keterangan:
        return send_error("Keterangan tidak ditemukan", keterangan_code=404)

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


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

    if not keterangan:
        return send_error("Keterangan tidak ditemukan", keterangan_code=404)

    db.delete(keterangan)
    db.commit()

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