import { getQueryMap, Toast } from "../utils/common";
import { msg } from "./msg";

import { WECHAT_REDIRECT_URL } from "../constants";
import { queryOpenID, queryUserInfo } from "../service";

/*
    广州惠民保：wxf3a14e38ab145a0a
    惠州惠民保：wx29f4535c209cf597
    派健康测试环境：wx0d74e6b4fe6aba0b
    http://spcare.medbanks-test.com/spcare-order/order-center/?sources=1100&saleChannelId=&isBack=true
    http://spcare.medbanks-test.com/spcare-products/products_hz/?sources=1100&saleChannelId=&isBack=true&isDebug=true
*/

/**
 * 微信授权
 * @param redictURL 授权页URL
 * @param isSilent 是否走用户授权
 */
export const authorize = async (
  { redirectURL, isVisible } = {
    redirectURL: location.href,
    isVisible: false,
  }
) => {
  const { sources = "", code = "" } = getQueryMap();
  // * 是否显式授权状态位
  const isVisibleFLAG = sessionStorage.getItem("SNSAPI_USERINFO");
  // * 微信userINFO (包含了openid)
  const userINFO = JSON.parse(sessionStorage.getItem("SP_WX_USERINFO") || null);
  // * 微信公众号用户标识
  const openID = sessionStorage.getItem("SP_WX_OPENID");

  // ! 如果有openID说明已经授权成功，不在做任何操作直接返回
  if (openID) return;

  // URL中未能获取source
  if (!sources && !openID) {
    // css style font-size????
    Toast("系统异常，URL未能正常获取渠道source (CODE: 60000)", 5);

    console.error(
      `[ ORCRIST-WECHAT SERVICE ERROR ]: URL未能正常获取渠道source (CODE: 60000)`
    );

    throw new Error(
      "[ ORCRIST-WECHAT SERVICE ERROR ]: URL未能正常获取渠道source (CODE: 60000)"
    );
  }

  const { APPID = "" } = (await msg()) || {};
  // 未能准确获取有效APPID
  if (!APPID) {
    Toast(`系统异常，当前渠道${sources}未能正确获取公众号ID (CODE: 60001)`, 5);

    console.error(
      `[ ORCRIST-WECHAT SERVICE ERROR ]: 当前渠道${sources}未能正确获取公众号ID (CODE: 60001)`
    );

    throw new Error(
      `[ ORCRIST-WECHAT SERVICE ERROR ]: 当前渠道${sources}未能正确获取公众号ID (CODE: 60001)`
    );
  }

  // code一次有效 兑换 access_token 5分钟后过期
  if (code) {
    // 重置URL
    history.replaceState(
      {},
      document.title || "",
      location.href.split("code")[0].slice(0, -1)
    );

    // * 显式授权 -> 直接获取用户头像昵称等信息
    if (isVisible) {
      return userINFO
        ? Promise.resolve({ code: 20000, data: userINFO, type: "userINFO" })
        : queryUserInfo(code, sources);
    } else {
      // * 隐式授权 -> 获取openID
      // 获取OPENID
      return openID
        ? Promise.resolve({ code: 20000, data: openID, type: "openID" })
        : queryOpenID(code, sources);
    }
  } else {
    const targetURL = WECHAT_REDIRECT_URL.replace("APPID", APPID)
      .replace("REDIRECT_URI", encodeURIComponent(redirectURL))
      // snsapi_base: 静默授权 用来获取进入页面的用户的openid的， snsapi_userinfo: 用户点击授权
      .replace("SCOPE", isVisible ? "snsapi_userinfo" : "snsapi_base")
      .replace("STATE", "");

    console.info(`[ ORCRIST-WECHAT SERVICE REDIRECT URL ] : ${targetURL}`);

    // 增加额外用户显式授权逻辑: 如果网页授权作用域为snsapi_userinfo，则此时开发者可以通过access_token和openid拉取用户信息
    isVisible && sessionStorage.setItem("SNSAPI_USERINFO", "1");

    window.location.replace(targetURL); //微信授权跳转

    return Promise.resolve({ code: -1, data: "" });
  }
};

export default {
  authorize,
};
