import { user } from '@/store';
import { storeToRefs } from 'pinia';
import { getCache } from '@/utils';

const CONFIG = {
  // host: import.meta.env.VITE_HOST || '',
  // baseURL: 'http://127.0.0.1:9053/api/main',
  baseURL: '/api/main',
  timeout: 60000,
  method: 'GET',
};

export class HttpError extends Error {
  data: any;
  constructor(message: string, data: Record<string, any>) {
    super(message);
    this.data = data;
  }
}

const request = async (config: Record<string, any>): Promise<any> => {
  const networkType = await uni.getNetworkType();
  if (networkType.networkType === 'none') {
    uni.showModal({
      content: '暂无网络，请恢复网络后使用',
      confirmText: '知道了',
      showCancel: false,
      confirmColor: '#ffe60f',
    });
    return Promise.reject(
      new HttpError('暂无网络，请恢复网络后使用', {
        code: '-1',
      }),
    );
  }

  return new Promise((resolve, reject) => {
    const { clear } = user();
    const { token } = storeToRefs(user());
    const mergerToken = token.value || getCache('token');
    const method = (config.method || CONFIG.method).toUpperCase();

    uni.request({
      method,
      // url: (config.host || CONFIG.host) + (config.baseURL || CONFIG.baseURL) + config.url,
      url: (config.baseURL || CONFIG.baseURL) + config.url,
      data: method === 'GET' ? config.params : config.data,
      timeout: config.timeout || CONFIG.timeout,
      header: {
        Authorization: mergerToken ? `Bearer ${mergerToken}` : '',
        ...config.headers,
      },
      complete(res: anyObj) {
        if (res.statusCode === 200) {
          if (res.data.code === 200) {
            return resolve(res.data);
          } else {
            if (!config.showToast) {
              uni.showToast({
                title: res.data?.message,
                icon: 'none',
                duration: 3000,
              });
            }
            return reject(new HttpError(res.data?.message, res.data));
          }
        } else {
          res.href = (config.baseURL || CONFIG.baseURL) + config.url;
          if (res.statusCode === 401) {
            clear();
            uni.reLaunch({
              url: '/pages/login/index',
            });
          } else {
            uni.showToast({
              icon: 'none',
              title:
                res.statusCode === 500 ? '服务异常' : res?.data?.message || '服务异常，请稍后重试',
            });
          }
          return reject(
            new HttpError(res.data?.message, {
              code: res.statusCode,
              data: res.data,
            }),
          );
        }
      },
    });
  });
};

export default request;
