export interface CsvColumn<T> {
  header: string;
  accessor: (row: T) => unknown;
}

const escapeCsvValue = (value: unknown): string => {
  if (value === null || value === undefined) {
    return '';
  }

  const normalized = String(value).replace(/"/g, '""');
  return `"${normalized}"`;
};

export const exportToCsv = <T>(filename: string, rows: T[], columns: CsvColumn<T>[]) => {
  const header = columns.map((column) => escapeCsvValue(column.header)).join(',');
  const body = rows
    .map((row) => columns.map((column) => escapeCsvValue(column.accessor(row))).join(','))
    .join('\n');

  const csvContent = `${header}\n${body}`;
  const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
  const url = URL.createObjectURL(blob);

  const link = document.createElement('a');
  link.href = url;
  link.setAttribute('download', filename.endsWith('.csv') ? filename : `${filename}.csv`);
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  URL.revokeObjectURL(url);
};

export const printCurrentPage = () => {
  window.print();
};
