// src/server/shared/lib/csv.ts
// Утилита для экспорта данных в CSV формат с поддержкой кириллицы

/**
 * Интерфейс для колонки CSV
 */
export interface CSVColumn {
  key: string;
  label: string;
}

/**
 * Функция для экранирования поля CSV
 * @param field - Значение поля
 * @returns Экранированная строка
 */
function escapeField(field: string | number | boolean | null | undefined): string {
  if (field === null || field === undefined) return '';
  const strValue = String(field);
  
  // Экранируем запятые, кавычки и переносы строк
  if (strValue.includes(',') || strValue.includes('"') || strValue.includes('\n')) {
    return `"${strValue.replace(/"/g, '""')}"`;
  }
  return strValue;
}

/**
 * Форматирует дату в формат YYYY-MM-DD
 * @param date - Дата в формате ISO string или Date
 * @returns Отформатированная дата или пустая строка
 */
function formatDate(date: string | Date | null | undefined): string {
  if (!date) return '';
  const dateObj = date instanceof Date ? date : new Date(date);
  return dateObj.toISOString().split('T')[0];
}

/**
 * Форматирует булево значение в Да/Нет
 * @param value - Булево значение
 * @returns 'Да' или 'Нет'
 */
function formatBoolean(value: boolean | null | undefined): string {
  if (value === null || value === undefined) return '';
  return value ? 'Да' : 'Нет';
}

/**
 * Экспортирует данные в CSV формат с BOM для поддержки кириллицы
 * @param data - Массив объектов для экспорта
 * @param columns - Массив колонок с ключами и заголовками
 * @returns CSV строка с BOM
 */
export function exportToCSV<T extends Record<string, any>>(
  data: T[],
  columns: CSVColumn[]
): string {
  // BOM для UTF-8 (обязательно для корректного отображения кириллицы в Excel)
  const BOM = '\uFEFF';

  // Формируем заголовок CSV
  const header = columns.map(col => escapeField(col.label)).join(',');

  // Формируем строки данных
  const rows = data.map(item => {
    return columns.map(col => {
      const value = item[col.key];
      
      // Автоматическое форматирование для разных типов данных
      if (typeof value === 'boolean') {
        return formatBoolean(value);
      }
      
      // Проверка на дату (строка в формате ISO или Date объект)
      if (value && (typeof value === 'string' || value instanceof Date)) {
        // Пытаемся распознать дату
        const dateStr = String(value);
        if (dateStr.match(/^\d{4}-\d{2}-\d{2}/) || value instanceof Date) {
          return formatDate(value);
        }
      }
      
      return escapeField(value);
    }).join(',');
  });

  return BOM + header + '\n' + rows.join('\n');
}

/**
 * Создает имя файла для экспорта с текущей датой
 * @param prefix - Префикс имени файла
 * @returns Имя файла с датой и расширением .csv
 */
export function generateExportFilename(prefix: string): string {
  const now = new Date();
  const dateStr = now.toISOString().split('T')[0];
  const timeStr = now.toTimeString().split(' ')[0].replace(/:/g, '-');
  return `${prefix}_${dateStr}_${timeStr}.csv`;
}
