import json

from fastapi import Request
from sqlalchemy.orm import Session

from ..models import AuditLog, User


def audit(
    db: Session,
    request: Request,
    user: User | None,
    action: str,
    entity_type: str = "",
    entity_id: int | None = None,
    details: dict | str | None = None,
) -> None:
    if isinstance(details, dict):
        details_text = json.dumps(details, ensure_ascii=False, default=str)
    else:
        details_text = details or ""
    ip = request.client.host if request.client else ""
    db.add(
        AuditLog(
            user_id=user.id if user else None,
            action=action,
            entity_type=entity_type,
            entity_id=entity_id,
            details=details_text,
            ip_address=ip,
        )
    )
