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.unit import Unit

router = APIRouter(prefix="/units", tags=["Units"])


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

    required = ["name", "slug"]
    errors = {}
    for field in required:
        if field not in body:
            errors[field] = "Harap masukkan data"
    if errors:
        return send_error("Validation Error", errors)
    unit_id = body.get("id")
    if unit_id:
        unit = db.query(Unit).filter(Unit.id == unit_id).first()
        if not unit:
            return send_error("Unit tidak ditemukan", status_code=404)
    else:
        unit = Unit()

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

    db.add(unit)
    db.commit()
    db.refresh(unit)

    return send_response(unit.to_dict(), "Sukses menyimpan unit", 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(Unit.id, Unit.name, Unit.slug, Unit.created_at, Unit.updated_at)

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


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

    if not unit:
        return send_error("Unit tidak ditemukan", unit_code=404)

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


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

    if not unit:
        return send_error("Unit tidak ditemukan", unit_code=404)

    db.delete(unit)
    db.commit()

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