import { DEV } from './env/dev'

/**
 * GET 请求
 * @param {string} url - 请求的 URL 地址
 * @param {object} params - 请求参数对象
 * @returns {Promise} - 返回一个 Promise 对象，包含 response 数据或 error 信息
 */
export function getRequest(url: string, params: object) {
  // 将参数对象转换为查询字符串
  const queryString = Object.keys(params)
    .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(params[key]))
    .join('&');

  // 拼接查询字符串到 URL
  let urlWithParams = ((DEV.HARD_CODE ? DEV.PROXY_SERVER :  '')) + url;
  if (queryString) {
    urlWithParams += `?${queryString}`;
  }

  return fetch(urlWithParams, {
    method: 'GET',
    mode: "cors",
    headers: {
      'Content-Type': 'application/json',
    },
  })
    .then(response => {
      if (!response.ok) { throw new Error('请求失败'); }
      return response.json();
    })
    .catch(error => console.error(error));
}


/**
 * POST 请求
 * @param {string} url - 请求的 URL 地址
 * @param {object} data - 请求数据
 * @returns {Promise} - 返回一个 Promise 对象，包含 response 数据或 error 信息
 */
export function postRequest(url: string, data: object) {
  return fetch(((DEV.HARD_CODE ? DEV.PROXY_SERVER :  '')) + url, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json'},
    mode: "cors",
    body: JSON.stringify(data),
  })
    .then(response => {
      if (!response.ok) { throw new Error('请求失败'); }
      return response.json();
    })
    .catch(error => console.error(error));
}


/**
 * POST表单请求
 * @param {string} url - 请求的 URL 地址
 * @param {object} data - 请求数据
 * @returns {Promise} - 返回一个 Promise 对象，包含 response 数据或 error 信息
 */
export function postFormDataRequest(url: string, data: object) {
  const formData = new FormData();
  for (const key in data) {
    formData.append(key, data[key]);
  }

  return fetch(((DEV.HARD_CODE ? DEV.PROXY_SERVER :  '')) + url, {
    method: 'POST',
    mode: "cors",
    body: formData
  })
    .then(response => {
      if (!response.ok) { throw new Error('请求失败'); }
      return response.json();
    })
    .catch(error => console.error(error));
}

/**
 * Delete 请求
 * @param {string} url - 请求的 URL 地址
 * @param {object} params - 参数对象
 * @returns {Promise} - 返回一个 Promise 对象，表示请求的结果（成功或失败）
 */
export function deleteRequest(url: string, params: object) {
  const searchParams = new URLSearchParams(params);
  return fetch(`${((DEV.HARD_CODE ? DEV.PROXY_SERVER :  '')) + url}?${searchParams.toString()}`, {
    method: 'DELETE',
    mode: "cors",
  })
    .then(response => {
      if (!response.ok) { throw new Error('请求失败'); }
      return response.json();
    })
    .catch(error => console.error(error));
}


/**
 * 发送 PUT 网络请求
 * @param {string} url - 请求的 URL 地址
 * @param {object} data - 请求的数据
 * @returns {Promise} - 返回一个 Promise 对象，表示请求的结果（成功或失败）
 */
export function putRequest(url: string, data: object) {
  return fetch(((DEV.HARD_CODE ? DEV.PROXY_SERVER :  '')) + url, {
    method: 'PUT',
    headers: {
      'Content-Type': 'application/json'
    },
    mode: "cors",
    body: JSON.stringify(data)
  })
    .then(response => {
      if (!response.ok) { throw new Error('请求失败'); }
      return response.json();
    })
    .catch(error => console.error(error));
}


/**
 * 下载文件请求
 * @param {string} url - 请求的 URL 地址
 * @param {string} fileName - 文件的名称
 * @returns {Promise} - 返回一个 Promise 对象，包含文件 blob 数据或 error 信息
 */
export function downloadFile(url: string, fileName?: string) {
  return fetch(((DEV.HARD_CODE ? DEV.PROXY_SERVER :  '')) + url, {
    method: 'GET',
    mode: "cors",
  })
    .then(response => {
      if (!response.ok) { throw new Error('下载失败'); }
      response.blob()
    })
    .then(blob => {
      const url = window.URL.createObjectURL(new Blob([blob]));
      const link = document.createElement('a');
      link.href = url;
      link.setAttribute('download', (fileName || '文件名称')); // 设置下载文件的名称
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    })
    .catch(error => console.error(error));
}

/**
 * 上传文件的网络请求
 * @param {string} url - 上传的 URL 地址
 * @param {File} formData - 包含上传文件的 FormData 对象
 * @returns {Promise} - 返回一个 Promise 对象，表示请求的结果（成功或失败）
 */
export function uploadFile(url: string, formData: any) {
  return fetch(((DEV.HARD_CODE ? DEV.PROXY_SERVER :  '')) + url, {
    method: 'POST',
    body: formData,
    mode: "cors"
  })
    .then(response => {
      if (!response.ok) { throw new Error('上传失败'); }
      return response.json();
    })
    .catch(error => console.error(error));
}