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.status import Status

router = APIRouter(prefix="/status", tags=["Statuses"])


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

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

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

    if status_slug:
        status = db.query(Status).filter(Status.slug == status_slug).first()
        if not status:
            return send_error("Status tidak ditemukan", status_code=404)
    else:
        status = Status()

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

    db.add(status)
    db.commit()
    db.refresh(status)

    return send_response(status.to_dict(), "Sukses menyimpan status", 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", "level")
    sort_order = params.get("sortOrder", "asc")
    keyword = params.get("q")

    query = select(
        Status.slug,
        Status.name,
    )

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

    if per_page:
        rows = paginate(db, query, page, per_page, sort_by, sort_order)
    else:
        query = query.order_by(asc(Status.level))
        rows = fetch_all(db, query)
    return send_response(rows, "Daftar status")


@router.get("/{status_slug}")
def show(
    status_slug: str,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    status = db.query(Status).filter(Status.slug == status_slug).first()

    if not status:
        return send_error("Status tidak ditemukan", status_code=404)

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


@router.delete("/{status_slug}")
def destroy(
    status_slug: str,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    status = db.query(Status).filter(Status.slug == status_slug).first()

    if not status:
        return send_error("Status tidak ditemukan", status_code=404)

    db.delete(status)
    db.commit()

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