import { getUserData } from '@/utils/user';
import axios from 'axios';
import { ElMessage } from 'element-plus';

const env = import.meta.env;
const w: any = window;
const $wujie: any = w.$wujie;

const service = axios.create({
  baseURL: env.VITE_API_BASE_URL,
  timeout: 60000,
  headers: {
    'Content-Type': 'application/json;application/xml;charset=utf-8;',
  },
});

service.interceptors.request.use(
  (config) => {
    config.headers['company'] = 'carsafe';
    config.headers['jobNumber'] = $wujie?.props?.USER_ID || '';
    config.headers['token'] = $wujie?.props?.TOKEN || '';
    config.headers['userId'] = $wujie?.props?.USER_ID || '';
    config.headers['tenantId'] = $wujie?.props?.TENANT_ID || '';
    config.headers['userName'] = getUserData().username || '';
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

service.interceptors.response.use(
  (res) => {
    // 判断响应类型，如果是 blob，返回完整响应对象
    if (res.config.responseType === 'blob') {
      return res;
    }
    // 普通接口返回原来的 res.data
    if (res.data.code !== 200) {
      ElMessage.error(res.data.message);
    }
    return res.data;
  },
  (error) => {
    ElMessage.error('系统繁忙，请稍后再试');
    return Promise.reject(error);
  }
);

const get = (url: string, params = {}) => {
  return service.get(url, { params });
};

const post = (url: string, data = {}) => {
  return service.post(url, data);
};

const upload = (url: string, formData = {}, onProgress?: any) => {
  return service.post(url, formData, {
    headers: {
      'Content-Type': 'multipart/form-data',
    },
    onUploadProgress: (event: any) => {
      if (onProgress) {
        onProgress({
          loaded: event.loaded,
          total: event.total,
        });
      }
    },
  });
};

const download = (url: string, params = {}, filename = 'download') => {
  return service
    .post(url, params, {
      responseType: 'blob',
    })
    .then((res: any) => {
      const contentDisposition =
        res.headers?.['content-disposition'] ||
        res.headers?.['Content-Disposition'] ||
        '';
      let fileName = filename;

      if (contentDisposition) {
        const parts = contentDisposition.split(';').map((p: string) => p.trim()).filter(Boolean);
        const paramsMap: Record<string, string> = {};
        parts.forEach((part: string) => {
          const idx = part.indexOf('=');
          if (idx === -1) return;
          const key = part.slice(0, idx).trim().toLowerCase();
          let val = part.slice(idx + 1).trim();
          if (val.startsWith('"') && val.endsWith('"')) {
            val = val.slice(1, -1);
          }
          paramsMap[key] = val;
        });

        if (paramsMap['filename*']) {
          const val = paramsMap['filename*'];
          const rfcMatch = val.match(/^([^']*)''(.*)$/);
          if (rfcMatch) {
            const encoded = rfcMatch[2];
            try {
              fileName = decodeURIComponent(encoded);
            } catch {
              fileName = encoded;
            }
          } else {
            if (/^utf-?8$/i.test(val) && paramsMap['filename']) {
              const candidate = paramsMap['filename'];
              try {
                fileName = candidate.includes('%') ? decodeURIComponent(candidate) : candidate;
              } catch {
                fileName = candidate;
              }
            } else {
              try {
                fileName = val.includes('%') ? decodeURIComponent(val) : val;
              } catch {
                fileName = val;
              }
            }
          }
        } else if (paramsMap['filename']) {
          const candidate = paramsMap['filename'];
          try {
            fileName = candidate.includes('%') ? decodeURIComponent(candidate) : candidate;
          } catch {
            fileName = candidate;
          }
        }
      }

      const blob = new Blob([res.data]);
      const link = document.createElement('a');
      link.href = window.URL.createObjectURL(blob);
      link.download = fileName;
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
      window.URL.revokeObjectURL(link.href);
    })
    .catch(() => {
      ElMessage.error('下载失败');
    });
};

export {
  get,
  post,
  upload,
  download,
};
