"""Audit logging service."""
from uuid import UUID

from sqlalchemy.ext.asyncio import AsyncSession

from app.core.logging import get_logger
from app.models import AuditLog

logger = get_logger("audit")


async def log_audit(
    db: AsyncSession,
    actor_id: UUID | None,
    action: str,
    entity_type: str,
    entity_id: UUID | None = None,
    details: dict | None = None,
    ip_address: str | None = None,
) -> None:
    """Write an audit log entry safely using a nested transaction (savepoint)."""
    try:
        async with db.begin_nested():
            entry = AuditLog(
                actor_id=actor_id,
                action=action,
                entity_type=entity_type,
                entity_id=entity_id,
                details=details or {},
                ip_address=ip_address,
            )
            db.add(entry)
    except Exception as e:
        logger.error("audit_log_failed", error=str(e), action=action)
