"""审计日志查询 API（Admin）"""
from typing import Optional
import json
from typing import Optional
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import text

from app.api.deps import get_db, get_admin_user
from app.core.models.user import User

router = APIRouter(prefix="/admin/audit-logs", tags=["审计日志"])


@router.get("")
async def list_audit_logs(
    page: int = Query(1, ge=1),
    page_size: int = Query(20, ge=1, le=200),
    action: Optional[str] = None,
    target_type: Optional[str] = None,
    actor_type: Optional[str] = None,
    start_date: Optional[str] = None,
    end_date: Optional[str] = None,
    db: AsyncSession = Depends(get_db),
    admin: User = Depends(get_admin_user),
):
    """分页查询审计日志"""
    where_clauses = ["tenant_id = :tenant_id"]
    params = {"tenant_id": admin.tenant_id, "offset": (page - 1) * page_size, "limit": page_size}

    if action:
        where_clauses.append("action LIKE :action")
        params["action"] = f"{action}%"
    if target_type:
        where_clauses.append("target_type = :target_type")
        params["target_type"] = target_type
    if actor_type:
        where_clauses.append("actor_type = :actor_type")
        params["actor_type"] = actor_type
    if start_date:
        where_clauses.append("created_at >= :start_date")
        params["start_date"] = start_date
    if end_date:
        where_clauses.append("created_at <= :end_date")
        params["end_date"] = end_date + " 23:59:59"

    where_sql = " AND ".join(where_clauses)

    # Total
    total_r = await db.execute(text(f"SELECT COUNT(*) FROM audit_logs WHERE {where_sql}"), params)
    total = total_r.scalar() or 0

    # Data
    data_r = await db.execute(
        text(f"""
            SELECT id, tenant_id, actor_type, actor_id, actor_name,
                   action, target_type, target_id, target_name,
                   changes, ip_address, user_agent, created_at
            FROM audit_logs
            WHERE {where_sql}
            ORDER BY created_at DESC
            LIMIT :limit OFFSET :offset
        """),
        params
    )
    rows = data_r.fetchall()

    items = []
    for r in rows:
        changes_val = r[9]
        try:
            changes_parsed = json.loads(changes_val) if changes_val else None
        except Exception:
            changes_parsed = changes_val
        items.append({
            "id": r[0],
            "tenant_id": r[1],
            "actor_type": r[2],
            "actor_id": r[3],
            "actor_name": r[4],
            "action": r[5],
            "target_type": r[6],
            "target_id": r[7],
            "target_name": r[8],
            "changes": changes_parsed,
            "ip_address": r[10],
            "user_agent": r[11],
            "created_at": r[12],
        })

    return {"items": items, "total": total, "page": page, "page_size": page_size}
