from __future__ import annotations

from typing import Any, Optional

from apps.audit.models import AuditLog


def client_ip(request) -> Optional[str]:
    if request is None:
        return None
    forwarded = request.META.get("HTTP_X_FORWARDED_FOR")
    if forwarded:
        return forwarded.split(",")[0].strip() or None
    return request.META.get("REMOTE_ADDR") or None


def record(
    *,
    actor,
    action: str,
    organization=None,
    entity_type: str = "",
    entity_id: Any = "",
    before: Any = None,
    after: Any = None,
    request=None,
) -> AuditLog:
    """Append one audit entry. Call from services for every sensitive operation."""
    return AuditLog.objects.create(
        actor=actor if getattr(actor, "pk", None) else None,
        organization=organization,
        action=action,
        entity_type=entity_type,
        entity_id=str(entity_id),
        before=before,
        after=after,
        ip_address=client_ip(request),
    )
