from apps.audit.models import AuditLog


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


def user_agent(request) -> str:
    if request is None:
        return ""
    return (request.META.get("HTTP_USER_AGENT") or "")[:255]


def log_audit(
    *,
    action: str,
    module: str,
    request=None,
    user=None,
    instance=None,
    previous_value=None,
    new_value=None,
):
    object_type = ""
    object_id = ""
    object_repr = ""
    if instance is not None:
        object_type = instance.__class__.__name__
        object_id = str(getattr(instance, "pk", "") or "")
        object_repr = str(instance)[:180]
    if user is None and request is not None:
        req_user = getattr(request, "user", None)
        if req_user is not None and getattr(req_user, "is_authenticated", False):
            user = req_user
    AuditLog.objects.create(
        user=user if getattr(user, "is_authenticated", False) else None,
        action=action,
        module=module,
        object_type=object_type,
        object_id=object_id,
        object_repr=object_repr,
        previous_value=previous_value,
        new_value=new_value,
        ip_address=client_ip(request),
        user_agent=user_agent(request),
        session_key=(request.session.session_key or "")[:64] if request and hasattr(request, "session") else "",
    )
