/**
 * Utilitaire d'export CSV
 * Génère et télécharge un fichier CSV à partir de données
 */

/**
 * Échappe les valeurs CSV (guillemets, virgules, retours à la ligne)
 * @param {*} value - La valeur à échapper
 * @returns {string} - La valeur échappée
 */
const escapeCSVValue = (value) => {
  if (value === null || value === undefined) {
    return '';
  }
  const stringValue = String(value);
  // Si la valeur contient des guillemets, des virgules ou des retours à la ligne
  if (stringValue.includes('"') || stringValue.includes(',') || stringValue.includes('\n') || stringValue.includes(';')) {
    // Échapper les guillemets en les doublant et entourer de guillemets
    return `"${stringValue.replace(/"/g, '""')}"`;
  }
  return stringValue;
};

/**
 * Convertit un tableau d'objets en chaîne CSV
 * @param {Array<Object>} data - Les données à convertir
 * @param {Array<{key: string, label: string, transform?: Function}>} columns - Configuration des colonnes
 * @param {string} separator - Le séparateur (par défaut ';' pour compatibilité Excel FR)
 * @returns {string} - La chaîne CSV
 */
export const convertToCSV = (data, columns, separator = ';') => {
  if (!data || data.length === 0) {
    return '';
  }

  // En-têtes
  const headers = columns.map((col) => escapeCSVValue(col.label)).join(separator);

  // Lignes de données
  const rows = data.map((item) => {
    return columns
      .map((col) => {
        let value = item[col.key];
        // Appliquer la transformation si elle existe
        if (col.transform && typeof col.transform === 'function') {
          value = col.transform(value, item);
        }
        return escapeCSVValue(value);
      })
      .join(separator);
  });

  return [headers, ...rows].join('\n');
};

/**
 * Télécharge un fichier CSV
 * @param {string} csvContent - Le contenu CSV
 * @param {string} filename - Le nom du fichier (sans extension)
 */
export const downloadCSV = (csvContent, filename) => {
  // Ajouter le BOM UTF-8 pour compatibilité Excel
  const BOM = '\uFEFF';
  const blob = new Blob([BOM + csvContent], { type: 'text/csv;charset=utf-8;' });
  const link = document.createElement('a');
  
  if (navigator.msSaveBlob) {
    // IE 10+
    navigator.msSaveBlob(blob, `${filename}.csv`);
  } else {
    const url = URL.createObjectURL(blob);
    link.href = url;
    link.download = `${filename}.csv`;
    link.style.visibility = 'hidden';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    URL.revokeObjectURL(url);
  }
};

/**
 * Exporte des données vers un fichier CSV et le télécharge
 * @param {Array<Object>} data - Les données à exporter
 * @param {Array<{key: string, label: string, transform?: Function}>} columns - Configuration des colonnes
 * @param {string} filename - Le nom du fichier (sans extension)
 */
export const exportToCSV = (data, columns, filename) => {
  const csvContent = convertToCSV(data, columns);
  downloadCSV(csvContent, filename);
};

export default exportToCSV;
