
function wxsdk(url) {
  const isDev = import.meta.env.DEV

  // API_BASE 来源 public/config.js
  const apiBase = API_BASE // import.meta.env.VITE_APP_API_BASE

  // 分享接口
  const shareAPIs = [
    // 自定义“分享给朋友”及“分享到QQ”按钮的分享内容（1.4.0）
    'updateAppMessageShareData',
    // 自定义“分享到朋友圈”及“分享到 QQ 空间”按钮的分享内容（1.4.0）
    'updateTimelineShareData',
    // 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口（即将废弃）
    'onMenuShareTimeline',
    // 获取“分享给朋友”按钮点击状态及自定义分享内容接口（即将废弃）
    'onMenuShareAppMessage',
    // 获取“分享到QQ”按钮点击状态及自定义分享内容接口（即将废弃）
    'onMenuShareQQ',
    // 获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口
    'onMenuShareWeibo',
    // 获取“分享到 QQ 空间”按钮点击状态及自定义分享内容接口（即将废弃）
    'onMenuShareQZone',
  ]

  function init() {
    // 请求后台接口
    fetch(`${apiBase}/api/wx/jsapi?url=${encodeURIComponent(url)}`).then(res => res.json()).then((res) => {
      if (res.code === 1000) {
        const data = res.data;

        wx.config({
          debug: isDev, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来，若要查看传入的参数，可以在 pc 端打开，参数信息会通过 log 打出，仅在 pc 端时才会打印。
          appId: data.appId, // 必填，公众号的唯一标识
          timestamp: data.timestamp, // 必填，生成签名的时间戳
          nonceStr: data.nonceStr, // 必填，生成签名的随机串
          signature: data.signature,// 必填，签名
          jsApiList: [
            ...shareAPIs,
            'openLocation',
          ] // 必填，需要使用的 JS 接口列表
        });
      }
    })
  }

  function share(params = {}) {
    if (isDev) return;

    wx.ready(() => {
      for (let api of shareAPIs) {
        if (typeof wx[api] === 'function') continue;

        wx[api]({
          ...shareOptTpl,
          ...params
        })
      }
    });
  }

  function getCode(store) {
    const [,setUser] = store.getState('user');
    if (isDev) {
      setUser({ nickname: 123 });
      return ;
    }

    const matched = /[?&]+code=([^?&]+)/.exec(location.href);
    if (!matched) {
      const target = encodeURIComponent(location.origin + location.pathname)
      location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${APPID}&redirect_uri=${target}&response_type=code&scope=snsapi_userinfo&state=abc123#wechat_redirect`
      return false;
    }

    const onError = () => {
      //
      let errorTimes = localStorage.getItem("error-times") || 0;
      if (errorTimes < 3) {
        errorTimes += 1;
        localStorage.setItem("error-times", errorTimes);

        // 重来一次
        location.href = location.origin + location.pathname;
        return;
      } else {
        // 未获取到任何信息
        setUser({});
      }
    }

    const code = matched[1];    
    // 请求后台接口
    fetch(`${apiBase}/api/wx/user?code=${code}`).then(res => res.json()).then((res) => {
      if (res.code === 1000) {
        setUser(res.data);
        localStorage.setItem("error-times", "0");
      } else {
        onError();
      }
    }).catch((err) => {
      console.error(err);
      onError();
    })
  }

  return {
    init,
    share,
    getCode,
  }
}

export default wxsdk;
