/**
 * audit.js — Helper d'enregistrement des événements d'audit.
 *
 * Usage :
 *   import { audit } from '../utils/audit.js';
 *   audit(req, { action: 'login_success', category: 'auth', targetUserId: user.id });
 */

import db from '../db/index.js';

/**
 * Enregistre un événement dans audit_logs.
 *
 * @param {import('express').Request} req  — pour extraire IP + User-Agent
 * @param {{
 *   action:        string,   — identifiant court de l'action (ex: 'login_success')
 *   category:      string,   — 'auth' | 'account' | 'role' | 'status' | '2fa' | 'invitation'
 *   actorId?:      number,   — qui a effectué l'action (null = système/anonyme)
 *   targetUserId?: number,   — utilisateur concerné
 *   details?:      object,   — données complémentaires libres
 * }} opts
 */
export function audit(req, { action, category, actorId = null, targetUserId = null, details = null }) {
  try {
    const ip  = req?.headers?.['x-forwarded-for']?.split(',')[0]?.trim()
             || req?.socket?.remoteAddress
             || null;
    const ua  = req?.headers?.['user-agent'] || null;

    db.prepare(`
      INSERT INTO audit_logs (actor_id, target_user_id, action, category, details, ip_address, user_agent)
      VALUES (?, ?, ?, ?, ?, ?, ?)
    `).run(
      actorId     || null,
      targetUserId || null,
      action,
      category,
      details ? JSON.stringify(details) : null,
      ip,
      ua,
    );
  } catch (e) {
    // Ne jamais bloquer une requête à cause d'un log
    console.error('[AUDIT] Erreur enregistrement:', e.message);
  }
}
