// 下载blob文件
import request from '@/utils/request'
import { blobValidate } from './bonus'
import modal from '../plugins/modal'
export const downloadFile = ({ fileData, fileType, fileName }) => {
  const blob = new Blob([fileData], {
    type: fileType
  })
  const link = document.createElement('a')
  link.href = URL.createObjectURL(blob)
  link.download = fileName
  link.style.display = 'none'
  document.body.appendChild(link)
  link.click()
  URL.revokeObjectURL(link.href)
  document.body.removeChild(link)
}

// 通用a链接下载
export const downloadFileByUrl = (url) => {
  const link = document.createElement('a')
  link.href = url
  link.setAttribute('download', '')
  link.style.display = 'none'
  document.body.appendChild(link)
  link.click()
  URL.revokeObjectURL(link.href)
  document.body.removeChild(link)
}

// 下载单个分片
const downloadFileChunk = (fileUrl, chunkIndex, startByte, endByte) => {
  // 设置 Range 请求头，下载文件的特定部分
  return request({
    url: fileUrl,
    method: 'post', // 使用 GET 请求方法
    responseType: 'blob', // 以 Blob 类型的响应返回数据
    timeout: 600000, // 设置超时时间为 10 秒（10000 毫秒）
    headers: {
      encryptRequest :false,
      checkIntegrity :false,
      encryptResponse: false,
      'Range': `bytes=${startByte}-${endByte}`, // 定义请求的字节范围
    }
  })
    .then(response => {
      return response;  // 返回 Blob 数据
    })
    .catch(error => {
      console.error(`Error downloading chunk ${chunkIndex}:`, error);
    });
};

// 主函数：分片下载整个文件并合并
export const downloadFileInChunks = async (fileUrl, fileName, fileSize, chunkSize = 20 * 1024 * 1024) => {
  const totalChunks = Math.ceil(fileSize / chunkSize); // 计算分片总数
  const blobs = []; // 用于存储每个分片的 Blob 数据
  let totalDownloaded = 0; // 跟踪已下载的字节数
  let progress = 0;

  // 使用 Vue 数据属性来跟踪进度
  let progressValue = 0;
  // 创建通知并显示进度
  const notification = modal.notifyProgress({
    title: fileName,
    showClose:false,
    message: `
      <div>
        <el-progress :percentage="progressValue" />
        <span>下载进度: ${progressValue}%</span>
      </div>`,
    dangerouslyUseHTMLString: true, // 允许通知中的 HTML 字符串
    duration: 0, // 设置为 0，表示通知不会自动关闭
  });

  // 更新进度的方法
  const updateProgress = (newProgress) => {
    progressValue = Math.round(newProgress); // 更新进度值
    newProgress === 100?notification.type="success":''
    notification.message = `
      <div>
        <el-progress :percentage="${progressValue}" />
        <span>下载进度: ${progressValue}%</span>
      </div>`;
  };
  // 下载每个分片并合并
  for (let i = 0; i < totalChunks; i++) {
    const startByte = i * chunkSize;
    const endByte = Math.min((i + 1) * chunkSize - 1, fileSize - 1);
    const chunkBlob = await downloadFileChunk(fileUrl, i, startByte, endByte);
    if (chunkBlob) {
      blobs.push(chunkBlob); // 将下载的分片添加到 Blob 数组中
      totalDownloaded += chunkBlob.size; // 更新已下载的字节数
      // 计算下载进度并更新进度条
      progress = (totalDownloaded / fileSize) * 100;
      // 更新进度条内容
      updateProgress(progress); // 更新通知中的进度条

      // 在进度条完成时延迟关闭通知
      if (progress === 100) {
        setTimeout(() => {
          notification.close(); // 关闭通知
          console.log('下载完成！');
        }, 2000); // 延迟 2 秒关闭
      }
    }
  }

  // 合并所有分片数据
  const fullFileBlob = new Blob(blobs, { type: 'application/octet-stream' });
  // 创建下载链接
  const url = URL.createObjectURL(fullFileBlob);
  const a = document.createElement('a');
  a.href = url;
  a.download = fileName;  // 设置下载文件的名称
  document.body.appendChild(a);
  a.click();  // 触发下载
  document.body.removeChild(a);

  // 释放 Object URL
  URL.revokeObjectURL(url);
  console.log('File downloaded successfully');
};





