import { message } from 'antd';
import dayjs from 'dayjs';
import * as XLSX from 'xlsx';

interface ExportConfig<T> {
  filename: string; // 文件名前缀
  data: T[]; // 数据源
  columns: {
    title: string; // Excel 列标题
    dataIndex: string | string[]; // 数据字段路径
    render?: (value: any, record: T) => any; // 自定义渲染
    width?: number; // 列宽
  }[];
}

export const exportToExcel = async <T extends Record<string, any>>({
  filename,
  data,
  columns,
}: ExportConfig<T>) => {
  try {
    // 转换数据格式
    const excelData = data.map((record) => {
      const row: Record<string, any> = {};

      columns.forEach(({ title, dataIndex, render }) => {
        let value: any;

        // 处理嵌套数据路径
        if (Array.isArray(dataIndex)) {
          value = dataIndex.reduce((obj, key) => obj?.[key], record);
        } else {
          value = record[dataIndex];
        }

        // 使用自定义渲染函数
        if (render) {
          value = render(value, record);
        }

        row[title] = value;
      });

      return row;
    });

    // 创建工作簿
    const wb = XLSX.utils.book_new();
    const ws = XLSX.utils.json_to_sheet(excelData);

    // 设置列宽
    ws['!cols'] = columns.map(({ width }) => ({ wch: width || 5 }));

    // 添加工作表
    XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');

    // 生成文件名
    const fullFilename = `${filename}_${dayjs().format('YYYY-MM-DD_HH-mm-ss')}.xlsx`;

    // 下载文件
    XLSX.writeFile(wb, fullFilename);
    message.success('導出成功');
    return true;
  } catch (error) {
    console.error('Export error:', error);
    message.error('導出失敗');
    return false;
  }
};
