"""Router for Audit Log endpoints (read-only)."""

from fastapi import APIRouter, Depends, Query
from sqlalchemy import select, func
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload

from app.core.database import get_db
from app.dependencies import get_current_user, require_superadmin
from app.models.audit import AuditLog
from app.models.user import User

router = APIRouter(prefix="/audit-log", tags=["audit"])


@router.get("", response_model=dict)
async def list_audit_logs(
    spbu_id: int | None = Query(default=None),
    modul: str | None = Query(default=None),
    aksi: str | None = Query(default=None),
    user_id: int | None = Query(default=None),
    skip: int = Query(default=0, ge=0),
    limit: int = Query(default=50, ge=1, le=200),
    db: AsyncSession = Depends(get_db),
    current_user: User = Depends(require_superadmin),
) -> dict:
    query = select(AuditLog).options(selectinload(AuditLog.user))

    if spbu_id is not None:
        query = query.where(AuditLog.spbu_id == spbu_id)
    if modul is not None:
        query = query.where(AuditLog.modul == modul)
    if aksi is not None:
        query = query.where(AuditLog.aksi == aksi)
    if user_id is not None:
        query = query.where(AuditLog.user_id == user_id)

    count_q = await db.execute(select(func.count()).select_from(query.subquery()))
    total = count_q.scalar_one()

    result = await db.execute(
        query.order_by(AuditLog.created_at.desc()).offset(skip).limit(limit)
    )
    rows = result.scalars().all()

    data = [
        {
            "id": r.id,
            "user_id": r.user_id,
            "user_name": r.user.name if r.user else None,
            "spbu_id": r.spbu_id,
            "aksi": r.aksi,
            "modul": r.modul,
            "object_id": r.object_id,
            "detail": r.detail,
            "created_at": r.created_at.isoformat() if r.created_at else None,
        }
        for r in rows
    ]
    return {"data": data, "meta": {"total": total, "page": skip // limit + 1, "per_page": limit}}
