import { downloadByData } from '@jnpf/utils';

/** 从 Content-Disposition 解析文件名 */
export function fileNameFromDisposition(disposition?: string | null, fallback = 'export.xls') {
  if (!disposition) return fallback;
  const utf8 = /filename\*\s*=\s*UTF-8''([^;]+)/i.exec(disposition);
  if (utf8?.[1]) {
    try {
      return decodeURIComponent(utf8[1].trim().replace(/"/g, ''));
    } catch {
      return utf8[1].trim().replace(/"/g, '');
    }
  }
  const plain = /filename\s*=\s*("?)([^";]+)\1/i.exec(disposition);
  if (plain?.[2]) {
    try {
      return decodeURIComponent(plain[2].trim());
    } catch {
      return plain[2].trim();
    }
  }
  return fallback;
}

/** 保存后端导出的 Excel 流（axios 原生响应） */
export async function saveExportBlob(res: any, fallbackName: string) {
  const headers = res?.headers || {};
  const disposition = headers['content-disposition'] || headers['Content-Disposition'];
  const blob: Blob =
    res?.data instanceof Blob
      ? res.data
      : new Blob([res?.data], { type: 'application/vnd.ms-excel;charset=utf-8' });

  // 业务错误时常返回 JSON blob
  if (blob.type && blob.type.includes('application/json')) {
    const text = await blob.text();
    let msg = '导出失败';
    try {
      const json = JSON.parse(text);
      msg = json.msg || json.message || msg;
    } catch {
      // ignore
    }
    throw new Error(msg);
  }

  const fileName = fileNameFromDisposition(disposition, fallbackName);
  downloadByData(blob, fileName, 'application/vnd.ms-excel;charset=utf-8');
}
