// src/utils/zipDownload.js
import JSZip from 'jszip';
import { saveAs } from 'file-saver';
import axios from 'axios';

/**
 * 批量下载文件并打包成 ZIP
 * @param {Array} files - 文件列表，每项包含 { url: '文件地址', name: '文件名(含后缀)' }
 * @param {String} zipName - 生成的压缩包名称，默认 'attachments.zip'
 * @param {Function} onProgress - 可选，进度回调 (current, total)
 */
export const downloadFilesAsZip = async (files, zipName = 'attachments.zip', onProgress) => {
  if (!files || files.length === 0) {
    console.warn('没有可下载的文件');
    return;
  }

  const zip = new JSZip();
  const total = files.length;
  let loadedCount = 0;

  // 创建加载提示（可选，结合 Element Plus ElLoading 使用）
  // 这里只返回 Promise，UI 层的 loading 建议在调用处控制

  try {
    // 并行或串行请求文件内容
    // 注意：如果文件非常多且大，建议限制并发数，避免浏览器卡顿或触发限流
    const promises = files.map(async (file) => {
      try {
        // 关键点：响应类型必须为 arraybuffer
        const response = await axios.get(file.url, {
          responseType: 'arraybuffer',
          // 如果涉及跨域或需要认证，需在此配置 headers
          // headers: { 'Authorization': 'Bearer...' } 
        });

        // 将文件内容添加到 zip
        // file.name 应该包含扩展名，例如 "合同.pdf"
        zip.file(file.name, response.data);

        loadedCount++;
        if (onProgress) {
          onProgress(loadedCount, total);
        }
      } catch (error) {
        console.error(`文件 ${file.name} 下载失败`, error);
        // 可以选择抛出错误中断，或者继续处理其他文件
        // throw error; 
      }
    });

    // 等待所有文件获取完成
    await Promise.all(promises);

    // 生成 ZIP 文件
    const content = await zip.generateAsync({ type: 'blob' });

    // 触发下载
    saveAs(content, zipName);

    return true;
  } catch (error) {
    console.error('打包下载失败:', error);
    throw error;
  }
};