import logging

from celery import shared_task
from django.db import DatabaseError, IntegrityError

from apps.core.audit.models import AuditLog

logger = logging.getLogger(__name__)


def persist_audit_log(**kwargs):
    """Insert an AuditLog row synchronously (used by middleware and on_commit)."""
    try:
        return AuditLog.objects.create(**kwargs)
    except IntegrityError as exc:
        logger.warning("audit log integrity error: %s", exc)
        return None
    except DatabaseError as exc:
        # e.g. invalid inet if ip_address slipped through; never break the request
        logger.warning("audit log skipped (database error): %s", exc)
        return None


@shared_task(bind=True, max_retries=2, default_retry_delay=5)
def write_audit_log(self, **kwargs):
    """Primary audit-log write path: enqueued from AuditMiddleware + log_audit().

    Runs ``persist_audit_log`` off the request thread so audited views don't
    pay the AuditLog INSERT cost on the response path.
    """
    try:
        return persist_audit_log(**kwargs)
    except Exception as exc:
        logger.exception("audit log write failed")
        raise self.retry(exc=exc) from exc
