function selectWXQQLoginType(): Promise<{
  isQQ?: boolean;
  isWX?: boolean;
}> {
  return new Promise((resolve, reject) => {
    wx.showActionSheet({
      itemList: ['QQ账号登录', '微信账号登录'],
      success(res: { tapIndex: number }) {
        console.info('[selectWXQQLoginType] res: ', res);
        resolve({
          isQQ: res.tapIndex == 0,
          isWX: res.tapIndex == 1,
        });
      },
      fail(err: any) {
        reject(err);
      },
    });
  });
}

export function initQQMiniPlugin() {
  // #ifdef MP-WEIXIN
  const plugin = getQQWXMiniPlugin();
  plugin.initPlugin(wx);
  return plugin;
  // #endif
}


export function getQQWXMiniPlugin() {
  const plugin = requirePlugin('qq-wxmini-plugin');
  plugin.initPlugin(wx);
  return plugin;
}


export function checkIsQQEnv() {
  let isQQEnv = false;
  // #ifdef MP-WEIXIN
  const plugin = getQQWXMiniPlugin();
  isQQEnv = plugin.isQQEnv();
  // #endif
  console.info('[checkIsQQEnv]', isQQEnv);
  return isQQEnv;
}


const getWxCode = (resolve: any, reject: any) => {
  uni.login({
    provider: 'weixin',
    success: (res) => {
      resolve({
        selectWX: true,
        wxCode: res.code,
      });
    },
    fail: (err) => {
      reject(err);
    },
  });
};

export function selectLoginTypeInWxMini(ignoreWxEnv = false): Promise<{
  selectQQ?: boolean;
  selectWX?: boolean;
  qqCode?: string;
  wxCode?: string;
}> {
  return new Promise((resolve, reject) => {
    const isQQEnv = checkIsQQEnv();
    console.info('[selectLoginTypeInWxMini] isQQEnv:', isQQEnv);
    if (!ignoreWxEnv && !isQQEnv) {
      getWxCode(resolve, reject);
      return;
    }

    selectWXQQLoginType().then(({
      isQQ,
      isWX,
    }) => {
      if (isQQ) {
        const plugin = getQQWXMiniPlugin();
        plugin.login()
          .then((res: { code: string }) => {
            console.info('[plugin.login] res: ', res);

            resolve({
              selectQQ: true,
              qqCode: res.code,
            });
          })
          .catch((err: any) => {
            console.info('[plugin.login] err: ', err);

            reject(err);
            // 异常处理
          });
        return;
      }
      if (isWX) {
        getWxCode(resolve, reject);
      }
    });
  });
}
