"""审计日志服务"""
import json
from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession


async def log_audit(
    db: AsyncSession,
    tenant_id: int,
    action: str,
    actor_type: str = "admin",
    actor_id: int | None = None,
    actor_name: str | None = None,
    target_type: str | None = None,
    target_id: int | None = None,
    target_name: str | None = None,
    changes: dict | None = None,
    ip_address: str | None = None,
    user_agent: str | None = None,
) -> None:
    """写入审计日志"""
    changes_json = json.dumps(changes, ensure_ascii=False) if changes else None
    await db.execute(
        text("""
            INSERT INTO audit_logs
            (tenant_id, actor_type, actor_id, actor_name, action,
             target_type, target_id, target_name, changes, ip_address, user_agent)
            VALUES
            (:tenant_id, :actor_type, :actor_id, :actor_name, :action,
             :target_type, :target_id, :target_name, :changes, :ip_address, :user_agent)
        """),
        {
            "tenant_id": tenant_id,
            "actor_type": actor_type,
            "actor_id": actor_id,
            "actor_name": actor_name,
            "action": action,
            "target_type": target_type,
            "target_id": target_id,
            "target_name": target_name,
            "changes": changes_json,
            "ip_address": ip_address,
            "user_agent": user_agent,
        }
    )
    await db.commit()
