import dayjs from 'dayjs';
import { saveAs } from 'file-saver';
import axios from 'axios';
import type { InternalAxiosRequestConfig } from 'axios';
import { localStg } from '@/utils/storage';

/** 过滤掉对象中值为 null 或 undefined 的属性 */
function filterNullAndUndefined(obj: Record<string, any>): Record<string, any> {
  return Object.fromEntries(
    Object.entries(obj).filter(([_, value]) => value !== null && value !== undefined)
  );
}

/**
 * 通用下载Excel方法
 *
 * @param url - 请求地址
 * @param params - 请求参数
 * @param filename - 默认文件名(如果响应头中没有指定文件名时使用)
 * @param config - 额外配置
 */
// eslint-disable-next-line max-params
export async function downloadExcel(
  url: string,
  params: Record<string, any>,
  filename: string,
  config?: InternalAxiosRequestConfig
) {
  const loadingMessage = window.$message?.loading('正在下载数据，请稍候...', { duration: 0 });
  try {
    window.$loadingBar?.start();

    const response = await axios({
      url: import.meta.env.VITE_SERVICE_BASE_URL + url,
      method: 'post',
      data: filterNullAndUndefined(params),
      responseType: 'blob',
      headers: {
        Authorization: `Bearer ${localStg.get('token')}`
      },
      ...config
    });

    // 获取文件类型
    const contentType = response.headers['content-type'];

    // 如果返回的是 json 类型，说明是错误信息
    if (contentType.includes('application/json')) {
      const reader = new FileReader();
      reader.onload = () => {
        const error = JSON.parse(reader.result as string);
        window.$message?.error(error.msg || '下载失败');
      };
      reader.readAsText(response.data);
    } else {
      // 从响应头获取文件名，如果没有则使用默认文件名
      const downloadFilename = response.headers['download-filename'];
      let finalFilename = filename;
      if (downloadFilename) {
        // 解码文件名
        const decodedFilename = decodeURIComponent(downloadFilename);
        // 提取下划线后面的部分
        const nameAfterUnderscore = decodedFilename.split('_')[1];
        // 获取当前时间
        const timeStr = dayjs().format('YYYY-MM-DD HH-mm-ss');
        // 拼接最终文件名
        finalFilename = `${nameAfterUnderscore.split('.')[0]}_${timeStr}.xlsx`;
      }

      saveAs(response.data, finalFilename);
      window.$message?.success('下载成功');
    }
  } catch (error) {
    console.error('下载文件出现错误:', error);
    window.$message?.error('下载文件出现错误，请联系管理员！');
  } finally {
    window.$loadingBar?.finish();
    loadingMessage?.destroy();
  }
}
