import { subscribeMessage } from "@/libs/order";
import { getProvider } from "@/utils";
import WechatJSSDK from "wechat-jssdk/dist/client.umd";
import { getWechatConfig, wechatAuth } from "@/api/public";
import { parseQuery } from "@/utils";
import cookie from "@/utils/store/cookie";
import store from "@/store";
import dayjs from "dayjs";

// 支付模块
export const weappPay = (option) => {
  return new Promise((resolve, reject) => {
    if (store.state.$deviceType == 'weixinh5') {
      setTimeout(() => {
        location.href = option.mweb_url;
      }, 100);
      resolve()
      return
    }
    if (store.state.$deviceType == 'weixin') {
      pay(option).then(() => {
        uni.showToast({
          title: '支付成功', icon: 'success', duration: 5000,
        });
        resolve()
      })
        .finally(res => {
          //if(typeof(res) == "undefined") return
        })
        .catch(function () {
          uni.showToast({ title: '支付失败', icon: 'none', duration: 5000 });
          reject()
        });
      return
    }
    // 吊起微信支付
    // getProvider('payment').then(provider => {
    let orderInfo = {
      appid: option.appid,
      noncestr: option.noncestr,
      package: option.package,
      partnerid: option.partnerid,
      prepayid: option.prepayid,
      sign: option.sign,
      timestamp: option.timestamp + '',
    }
    // 调用只接口
    uni.requestPayment({
      provider: 'wxpay',
      ...option,
      timestamp: orderInfo.timestamp,
      orderInfo,
      success: (success) => {
        console.log(success)
        uni.showToast({
          title: '支付成功', icon: 'success', duration: 5000,
        });
        let time = setTimeout(() => {
          clearTimeout(time)
          resolve(success)
        }, 3000)
        // #ifdef MP-WEIXIN
        subscribeMessage()
        // #endif
      },
      fail: (error) => {
        console.log(error)
        if (error.errMsg == 'requestPayment:fail cancel') {
          uni.showToast({ title: '已取消支付', icon: 'none', duration: 5000 });
        } else {
          uni.showToast({ title: error || error.msg, icon: 'none', duration: 5000 });
        }
        reject(error)
      }
    })
    // })
  })
}



const STATE_KEY = "wx_authorize_state";
const WX_AUTH = "wx_auth";
const BACK_URL = "login_back_url";
const LOGINTYPE = "loginType";
let instance;
let wechatObj;
let appId

export function wechat() {
  console.log('初始化微信配置')
  return new Promise((resolve, reject) => {
    if (instance) return resolve(instance);
    getWechatConfig()
      .then(res => {
        console.log(res.data)
        const _wx = WechatJSSDK(res.data);
        console.log(_wx)
        appId = res.data.appId
        wechatObj = _wx;
        _wx
          .initialize()
          .then(() => {
            instance = _wx.wx;
            instance.initConfig = res.data;
            resolve(instance);
          })
          .catch(error => {
            console.log(error)
            reject(error)
          });
      })
      .catch(err => {
        console.log(err);
        reject(err);
      });
  });
}

export function clearAuthStatus() {
  cookie.remove(WX_AUTH);
  cookie.remove(STATE_KEY);
}

export function oAuth() {
  console.log('处理微信授权')
  console.log(store)
  console.log(store.state)
  return new Promise((resolve, reject) => {
    // if (cookie.has(WX_AUTH)) {
    if (cookie.has(WX_AUTH) && store.state.token) {
      reject()
      return;
    }
    const { code } = parseQuery();
    if (!code) {
      toAuth();
      return
    }
    resolve()
  }).catch(error => {
    console.log(error)
  })
}

export function auth(code) {
  console.log('获取微信授权')
  return new Promise((resolve, reject) => {
    let loginType = cookie.get(LOGINTYPE);
    let spread = cookie.get(spread);
    wechatAuth(code, spread, loginType)
      .then(({ data }) => {
        console.log(data)
        const expires_time = dayjs(data.expires_time);
        const newTime = Math.round(new Date() / 1000);
        store.commit("login", data.token, expires_time - newTime);
        cookie.set(WX_AUTH, code, expires_time);
        cookie.remove(STATE_KEY);
        loginType && cookie.remove(LOGINTYPE);
        resolve();
      })
      .catch(reject);
  }).catch(error => {
    console.log(error)
  })
}

export function toAuth() {
  // wechat().then(wx => {
  location.href = getAuthUrl("wxc061dee8806ff712");
  // });
}

function getAuthUrl(appId) {
  
  // const redirect_uri = encodeURIComponent(window.location.href);
  // const redirect_uri = encodeURIComponent(`${location.origin}/pages/Loading/index`);
  
	// #ifdef H5
	// #endif
  
  
  const redirect_uri = encodeURIComponent(`${location.origin}/pages/Loading/index?path=${encodeURIComponent(window.location.href)}`);
  // const redirect_uri = encodeURIComponent(`${window.location.origin}${window.location.pathname}`)
  // const redirect_uri = encodeURIComponent(`${location.origin}`)
  cookie.remove(BACK_URL);
  const state = 'STATE'
  // const state = encodeURIComponent(("" + Math.random()).split(".")[1] + "authorizestate");
  cookie.set(STATE_KEY, state);
  return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`;
}

function toPromise(fn, config = {}) {
  return new Promise((resolve, reject) => {
    fn({
      ...config,
      success(res) {
        resolve(res);
      },
      fail(err) {
        reject(err);
      },
      complete(err) {
        reject(err);
      },
      cancel(err) {
        reject(err);
      }
    });
  });
}

export function pay(config) {
  console.log(instance)
  return toPromise(instance.chooseWXPay, config);
}

export function openAddress() {
  return new Promise((resolve, reject) => {
    wechatEvevt("openAddress", {})
      .then(res => {
        resolve(res);
      })
      .catch(res => {
        if (res.is_ready) {
          res.wx.openAddress({
            fail(res) {
              reject(res);
            },
            success(res) {
              resolve(res);
            }
          });
        } else {
          reject(res);
        }
      });
  });
}

export function openShareAll(config) {
  config || {};
  config.type = config.type == undefined ? "link" : config.type;
  return new Promise(resolve => {
    getWechatConfig().then(res => {
      wechatObj.signSignature({
        nonceStr: res.data.nonceStr,
        signature: res.data.signature,
        timestamp: res.data.timestamp
      });
      instance = wechatObj.getOriginalWx();
      instance.ready(() => {
        instance.updateAppMessageShareData(config);
        instance.updateTimelineShareData(config);
        resolve();
      });
    });
  });
}

export function openShareAppMessage(config) {
  instance.updateAppMessageShareData(config);
  instance.onMenuShareAppMessage && instance.onMenuShareAppMessage(config);
}

export function openShareTimeline(config) {
  instance.updateTimelineShareData(config);
  instance.onMenuShareTimeline && instance.onMenuShareTimeline(config);
}

export function wechatEvevt(name, config) {
  return new Promise((resolve, reject) => {
    let wx;
    let configDefault = {
      fail(res) {
        console.log(res);
        if (wx) return reject({ is_ready: true, wx: wx });
        getWechatConfig().then(res => {
          wechatObj.signSignature({
            nonceStr: res.data.nonceStr,
            signature: res.data.signature,
            timestamp: res.data.timestamp
          });
          wx = wechatObj.getOriginalWx();
          reject({ is_ready: true, wx: wx });
        });
      },
      success(res) {
        resolve(res);
      }
    };
    Object.assign(configDefault, config);
    if (typeof instance !== "undefined") {
      instance.ready(() => {
        if (typeof name === "object") {
          name.forEach(item => {
            instance[item] && instance[item](configDefault);
          });
        } else instance[name] && instance[name](configDefault);
      });
    } else {
      getWechatConfig().then(res => {
        const _wx = WechatJSSDK(res.data);
        _wx.initialize().then(() => {
          instance = _wx.getOriginalWx();
          instance.ready(() => {
            if (typeof name === "object") {
              name.forEach(item => {
                instance[item] && instance[item](configDefault);
              });
            } else instance[name] && instance[name](configDefault);
          });
        });
      });
    }
  });
}

export function ready() {
  return new Promise(resolve => {
    if (typeof instance !== "undefined") {
      instance.ready(() => {
        resolve(instance);
      });
    } else {
      getWechatConfig().then(res => {
        const _wx = WechatJSSDK(res.data);
        _wx.initialize().then(() => {
          instance = _wx.wx;
          instance.ready(() => {
            resolve(instance);
          });
        });
      });
    }
  });
}

export function wxShowLocation() {
  return new Promise(() => {
    wechatEvevt("getLocation", { type: "wgs84" })
      .then(res => {
        let latitude = res.latitude; // 纬度
        let longitude = res.longitude; // 经度
        cookie.set(LATITUDE, latitude);
        cookie.set(LONGITUDE, longitude);
      })
      .catch(res => {
        if (res.is_ready) {
          res.wx.getLocation({
            success(res) {
              let latitude = res.latitude; // 纬度
              let longitude = res.longitude; // 经度
              cookie.set(LATITUDE, latitude);
              cookie.set(LONGITUDE, longitude);
            },
            cancel() {
              cookie.remove(LATITUDE);
              cookie.remove(LONGITUDE);
              uni.showToast({
                title: "取消获取位置",
                icon: "none",
                duration: 2000,
              });
            },
            fail() {
              cookie.remove(LATITUDE);
              cookie.remove(LONGITUDE);
              uni.showToast({
                title: "授权失败",
                icon: "none",
                duration: 2000,
              });
            }
          });
        }
      });
  });
}