<template>
  <div id="recall">
    <!-- 退出页面提示 -->
    <ExitGame></ExitGame>

    <!-- 已登录 -->
    <InnerBox v-show="isLogin && showInnerBox"></InnerBox>

    <!-- 未 显示登录框 -->
    <UdbBox v-if="!isLogin"></UdbBox>
  </div>
</template>

<script>
import { mapState, mapActions } from "vuex";
import DownLoadInfo from "@/components/Inner/DownLoadInfo"; // 点击下载到桌面提示
import ExitGame from "@/components/Inner/ExitGame.vue"; // 退出页面提示
import Float from "@/components/Inner/Float"; // 页面悬浮球
import GameIframe from "@/components/Inner/GameIframe"; // 游戏iframe
import InnerBox from "@/components/Inner/InnerBox"; // 已登录显示的内容
import UdbBox from "@/components/UDB/UdbBox"; // 登录框
export default {
  name: "Recall",
  components: {
    DownLoadInfo,
    ExitGame,
    Float,
    GameIframe,
    InnerBox,
    UdbBox,
  },
  data() {
    return {
      queryTimeout: null, // 订单查询 定时器
      wechatAppid: "wx2c4f9f89c572aeb5", // 公众号appid
    };
  },
  provide() {
    return {
      // 校验返回值
      checkCode: this.checkCode,
      // 支付校验返回值
      checkCodeHandler: this.checkCodeHandler,
      // 刷新登录态
      refresh: this.refresh,
      // 获取用户信息
      getUserInfo: this.getUserInfo,
      // 获取鸿币余额
      getFinance: this.getFinance,
      // 支付
      payHandler: this.payHandler,
      // 订单查询
      queryOrder: this.queryOrder,
      // 微信内支付
      wechatPay: this.wechatPay,
      // 获取微信code
      getWechatCode: this.getWechatCode,
    };
  },
  computed: {
    ...mapState(["isLogin", "showInnerBox", "isPay", "query"]),
  },
  watch: {},
  created() {},
  mounted() {
    clearTimeout(this.queryTimeout);

    // 初始化页面信息
    this.init();
  },
  methods: {
    ...mapActions([
      "showInnerBoxAction",
      "userInfoAction",
      "isLoginAction",
      "financeAction",
      "isPayAction",
      "tokenAction",
      "isShowExitGameAction",
      "isWeChatAction",
    ]),

    // 初始化页面信息
    async init() {
      // 微信内
      const _this = this;
      document.addEventListener(
        "WeixinJSBridgeReady",
        function onBridgeReady() {
          _this.isWeChatAction(true);
          // const wechat_open_id = localStorage.getItem("wechat_open_id");
          const wechat_open_id = _this.$utils.getCookie("wechat_open_id");
          const wechat_code = _this.$utils.getQueryString("code");
          if (!wechat_open_id && !wechat_code) {
            _this.$toast.text("授权过期，请重新授权");
            _this.getWechatCode();
            return;
          }

          // 有code, 没有openid 用code换openid
          if (!wechat_open_id && wechat_code) {
            _this.wechatOpenId();
          }
        },
        false
      );

      // userInfo
      const userInfo = localStorage.getItem("userInfo");
      if (!userInfo) {
        this.isLoginAction(false);
        return;
      }

      // 校验登录态
      await this.refresh();
      // 获取用户信息
      await this.getUserInfo();
      // 获取鸿币余额
      await this.getFinance();
      // 订单查询
      await this.queryOrder();
    },

    // 换openid
    wechatOpenId() {
      const wechat_code = this.$utils.getQueryString("code");
      const pay_type = this.$utils.payType("WECHATPAY").h5;
      this.$api
        .wechatOpenId({
          wechat_code,
          pay_type,
        })
        .then((res) => {
          this.checkCode(res);
          const { data, code, msg } = res.data;
          // 错误
          if (code) {
            return;
          }
          // 成功
          this.$utils.setCookie("wechat_open_id", data.openId, 30);
        });
    },

    // 获取用户信息
    getUserInfo() {
      this.$api.info().then((res) => {
        this.checkCode(res);
        const { data, code, msg } = res.data;
        // 错误
        if (code) {
          return;
        }
        // 成功
        this.isLoginAction(true);
        localStorage.setItem("userInfo", JSON.stringify(data));
        this.userInfoAction(data);
        const token = localStorage.getItem("token");
        this.tokenAction(token);
      });
    },

    // 查询鸿币余额
    getFinance() {
      this.$api.finance().then((res) => {
        this.checkCode(res);
        const { data, code, msg } = res.data;
        // 错误
        if (code) {
          return;
        }
        // 成功
        this.financeAction(data.hb / 100);
      });
    },

    // 微信获取微信code
    getWechatCode() {
      const { wechatAppid } = this;
      let redirect_uri = "";
      redirect_uri = escape(window.location.href);
      window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${wechatAppid}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect`;
    },

    /**
     * 支付宝 微信支付
     * @param {Object} payInfo 支付信息
     */
    payHandler(payInfo) {
      const {
        server_id,
        server_name,
        cp_order_id,
        role_name,
        role_id,
        goods_id,
        goods_name,
        amount,
        pay_type,
        pay_platform,
        extra,
      } = payInfo;
      const { appid } = this.$CONFIG;
      return this.$api
        .order({
          server_id,
          server_name,
          cp_order_id,
          app_id: appid,
          role_name,
          role_id,
          goods_id,
          goods_name,
          amount,
          pay_type,
          pay_platform,
          return_url: window.location.href,
          extra,
        })
        .then((res) => {
          this.checkCodeHandler(res);
          const { data, code, msg } = res.data;
          // 错误
          if (code) {
            return;
          }
          // 成功
          this.isPayAction(true);

          // 鸿币支付不需要回调
          if (pay_platform === "HB") {
            return;
          }

          const time = new Date().getTime();
          const orderItem = {
            order_id: data.order_id,
            time,
          };
          let orderList = JSON.parse(localStorage.getItem("orderList")) || [];
          orderList.push(orderItem);
          localStorage.setItem("orderList", JSON.stringify(orderList));

          // 微信内支付
          const { isWeChat } = this;
          if (isWeChat) {
            this.wechatPay(data);
            return;
          }
          window.location.href = data.url;
        });
    },

    // 微信内支付
    wechatPay(res) {
      if (typeof WeixinJSBridge == "undefined") {
        if (document.addEventListener) {
          document.addEventListener(
            "WeixinJSBridgeReady",
            this.onBridgeReady(res),
            false
          );
        } else if (document.attachEvent) {
          document.attachEvent("WeixinJSBridgeReady", this.onBridgeReady(res));
          document.attachEvent(
            "onWeixinJSBridgeReady",
            this.onBridgeReady(res)
          );
        }
      } else {
        this.onBridgeReady(res);
      }
    },

    // 微信内支付
    onBridgeReady(res) {
      const { appId, timeStamp, nonceStr, signType, paySign, openId } = res;
      //   localStorage.setItem("wechat_open_id", openId);
      this.$utils.setCookie("wechat_open_id", openId, 30);
      const _this = this;
      WeixinJSBridge.invoke(
        "getBrandWCPayRequest",
        {
          appId, //公众号ID，由商户传入
          timeStamp, //时间戳，自1970年以来的秒数
          nonceStr, //随机串
          package: res.package,
          signType, //微信签名方式：
          paySign, //微信签名
        },
        function (res) {
          if (res.err_msg == "get_brand_wcpay_request:ok") {
            _this.$toast.text("支付成功");
            // 使用以上方式判断前端返回,微信团队郑重提示：
            //res.err_msg将在用户支付成功后返回ok，但并不保证它绝对可靠。
            return;
          }
          if (res.err_msg == "get_brand_wcpay_request:cancel") {
            _this.$toast.text("取消支付");
            return;
          }
          _this.$toast.text("支付失败");
        }
      );
    },

    // 订单查询
    queryOrder() {
      //  延迟执行定义定时器
      this.queryTimeout = setTimeout(() => {
        let orderList = JSON.parse(localStorage.getItem("orderList")) || [];
        if (orderList.length == 0) {
          clearTimeout(this.queryTimeout);
          return;
        }
        const maxTime = 10000;
        const nowTime = new Date().getTime();
        let _orderList = JSON.parse(JSON.stringify(orderList));
        orderList.map((ele, index) => {
          const flag = nowTime - ele.time > maxTime;
          if (!flag) {
            return;
          }
          // 大于10s 订单查询
          this.$api
            .query({
              order_id: ele.order_id,
            })
            .then((res) => {
              _orderList.splice(index, 1);
              localStorage.setItem("orderList", JSON.stringify(_orderList));
            });
        });
        this.queryOrder();
      }, 5000);
    },

    // 显示innerBox
    openInnerBox() {
      this.showInnerBoxAction(true);
    },

    // 校验返回值
    checkCode(res) {
      // 请求超时
      if (!res) {
        this.$toast.text("当前网络拥堵, 请重试");
        return;
      }
      this.checkCodeHandler(res);
    },

    // 刷新登录态
    refresh() {
      return this.$api.refresh().then((res) => {
        this.checkCode(res);
        const { data, code, msg } = res.data;
        // 错误
        if (code) {
          this.isLoginAction(false);
          this.showInnerBoxAction(false);
          localStorage.removeItem("userInfo");
          return;
        }

        const userInfo = localStorage.getItem("userInfo");
        this.isLoginAction(true);
        this.userInfoAction(JSON.parse(userInfo));
      });
    },

    // 校验返回值====all
    checkCodeHandler(res) {
      const { code, msg } = res.data;
      if (!code) {
        return;
      }
      switch (code) {
        // 2 未登录
        case 2:
          localStorage.removeItem("userInfo");
          this.showInnerBoxAction(false);
          this.isLoginAction(false);
          this.userInfoAction({});
          this.$toast.text(msg);
          break;
        // 7 微信支付code 过期
        case 7:
          this.getWechatCode();
          this.$toast.text(msg);
          break;
        default:
          this.$toast.text(msg);
      }
    },
  },
};
</script>

<style lang="less" scoped>
.focusState {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
}
</style>
