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.permission import Permission

router = APIRouter(prefix="/permissions", tags=["Permissions"])


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

    permission_id = body.get("id")
    subject = body.get("subject")

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

    if permission_id:
        permission = db.query(Permission).filter(Permission.id == permission_id).first()
        if not permission:
            return send_error("Permission tidak ditemukan", permission_code=404)
    else:
        permission = Permission()

    for field in ["subject"]:
        if field in body:
            setattr(permission, field, body[field])

    db.add(permission)
    db.commit()
    db.refresh(permission)

    return send_response(permission.to_dict(), "Sukses menyimpan permission", 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(
        Permission.id,
        Permission.name,
        Permission.subject,
        Permission.updated_at,
        Permission.created_at,
    )

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


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

    if not permission:
        return send_error("Permission tidak ditemukan", permission_code=404)

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


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

    if not permission:
        return send_error("Permission tidak ditemukan", permission_code=404)

    db.delete(permission)
    db.commit()

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