// src/utils/errorHandler.js

/**
 * Envoie une réponse d'erreur standardisée
 * @param {string} message - Message d'erreur à afficher
 * @param {Object} res - Objet Response d'Express 
 * @param {Error|null} error - Objet d'erreur original (facultatif)
 * @param {number} statusCode - Code HTTP d'erreur (défaut: 500)
 */
function sendError(message, res, error = null, statusCode = 500) {
  console.error(`[ERROR] ${message}`, error);
  
  res.status(statusCode).json({
    error: {
      message,
      statusCode,
      details: error ? (error.message || String(error)) : null,
      timestamp: new Date().toISOString()
    }
  });
}

/**
 * Wrapper pour les contrôleurs qui gère automatiquement les erreurs
 * @param {Function} controller - Fonction de contrôleur à exécuter
 * @returns {Function} - Middleware Express qui gère les erreurs
 */
function asyncHandler(controller) {
  return async (req, res, next) => {
    try {
      await controller(req, res, next);
    } catch (error) {
      sendError('Une erreur est survenue lors du traitement de la requête', res, error);
    }
  };
}

/**
 * Crée un wrapper pour les opérations de base de données qui gère les erreurs
 * @param {Function} operation - Fonction à exécuter
 * @returns {Function} - Fonction qui execute l'opération et gère les erreurs
 */
function wrapDatabaseOperation(operation) {
  return async (...args) => {
    try {
      return await operation(...args);
    } catch (err) {
      console.error(`[DB ERROR] Erreur lors de l'opération ${operation.name || 'database'}:`, err);
      throw err;
    }
  };
}

module.exports = {
  sendError,
  asyncHandler,
  wrapDatabaseOperation
};