import OST_REQ from "orcrist-request";
import { traceLog } from "./utils/traceLog";
import API from "./api";
import {
  WECHAT_REGISTER_APIS,
  WECHAT_MENU_ITEMS,
  REGISTER_SERVICE_URL,
} from "./constants";

const w: any = window;
const d: any = document;
const r: any = OST_REQ;

if (w.BUZZ) {
  w.BUZZ.scene = `${w.BUZZ.scene}_WECHAT`;
}

/**
 * 全局统一注册Wechat方法
 * @param options { productCode(skuCode), shareOpt, hideMenu }
 */
export const register = (options = {}) => {
  // current URL
  const CURR_URL = encodeURIComponent(location.href.split("#")[0]);

  r.request(REGISTER_SERVICE_URL, {
    method: "POST",
    body: {
      url: CURR_URL,
    },
  })
    .then(({ code, data }) => {
      switch (code) {
        case "0":
          const {
            appid: appId = "",
            nonceStr = "",
            sign: signature = "",
            timestamp,
          } = data;

          configWechatJSSDK(appId, timestamp, nonceStr, signature, options);
          break;
        default:
          traceLog({
            log: encodeURIComponent(
              `[ SignWechatSDKService ] Error Code: ${code}`
            ),
          });
      }
    })
    .catch((err) => {
      traceLog({
        log: encodeURIComponent(
          `[ SignWechatSDKService ] Error Code: 500. ${err.message}`
        ),
      });
      throw new Error(err.message);
    });
};

interface JSSDK_OPTION {
  hideMenu?: boolean;
  shareOpt?: any;
}
const configWechatJSSDK = (
  appId,
  timestamp,
  nonceStr,
  signature,
  { hideMenu = false, shareOpt }: JSSDK_OPTION // 注册wechat
) => {
  const { config = () => {}, ready, error } = w.wx;
  // * 执行注册SDK
  config({
    // debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
    appId, // 必填，公众号的唯一标识
    timestamp, // 必填，生成签名的时间戳
    nonceStr, // 必填，生成签名的随机串
    signature, // 必填，签名
    jsApiList: WECHAT_REGISTER_APIS, // 必填，需要使用的JS接口列表
  });

  ready(function () {
    // wechat local cache
    localStorage.setItem(
      "WX_CONFIG",
      JSON.stringify({
        appId,
        nonceStr,
        signature,
        timestamp,
      })
    );

    if (hideMenu) {
      // 隐藏所有功能按钮
      setOptionMenu("hideOptionMenu");
      w.wx.hideMenuItems({
        // !所有微信菜单项：https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#64
        menuList: WECHAT_MENU_ITEMS,
      });
      w.wx.hideAllNonBaseMenuItem();
    } else {
      setOptionMenu("showMenuItems");
      // 设置自定义分享
      if (shareOpt) {
        w.wx.updateAppMessageShareData(shareOpt);
        w.wx.updateTimelineShareData(shareOpt);
        w.wx.onMenuShareTimeline(shareOpt); // 朋友圈
        w.wx.onMenuShareAppMessage(shareOpt); // 朋友
      }
      w.wx.showAllNonBaseMenuItem();
    }
  });

  error(function (res) {
    // 签名会valid
    traceLog({
      log: encodeURIComponent(JSON.stringify(res || {})),
    });
  });
};

/**
 * 设置是否关闭微信菜单
 * @param status
 */
const setOptionMenu = (status) => {
  const onBridgeReady = () => {
    w.WeixinJSBridge.call(status);
  };

  if (status) {
    if (typeof w.WeixinJSBridge == "undefined") {
      if (document.addEventListener) {
        document.addEventListener(
          "WeixinJSBridgeReady",
          onBridgeReady.bind(this),
          false
        );
      } else if (d.attachEvent) {
        d.attachEvent("WeixinJSBridgeReady", onBridgeReady.bind(this));
        d.attachEvent("onWeixinJSBridgeReady", onBridgeReady.bind(this));
      }
    } else {
      onBridgeReady();
    }
  }
};

export default {
  register,
  ...API,
};
