import wx from 'weixin-js-sdk'
import wxApi from '@/api/wxCommonApi'
import { base64ToFile } from './formatFile'

let ready = false

const tool = {
    // 获取微信 jssdk
    getConfig (call) {
        if (ready) return call && call()
        wxApi.getWxJsdkPermission().then(res => {
            if (res.data.Status) this.success(res.data.Data, call)
        })
    },

    // 获取不带 token 的微信 jssdk
    getConfigNotToken (call) {
        if (ready) return call && call()
        wxApi.getNotTokenOfWxJsdkPermission().then(res => {
            if (res.data.Status) this.success(res.data.Data, call)
        })
    },

    // 获取微信 jssdk 成功
    success (res, call) {
        // 注入权限验证配置
        wx.config({
            debug: false,
            appId: res.appId,
            timestamp: res.timestamp,
            nonceStr: res.nonceStr,
            signature: res.signature,
            jsApiList: [
                'chooseImage',
                'previewImage',
                'getNetworkType',
                'openLocation',
                'getLocation',
                'scanQRCode',
                'chooseWXPay'
            ]
        })
        // config 信息验证完成（成功失败都会调用）
        wx.ready(() => {
            ready = true
            call && call()
        })
        // config 信息验证失败
        wx.error(res => {
            console.log('config 信息验证失败：' + res.errMsg)
        })
        if (!/MicroMessenger/i.test(navigator.userAgent)) console.log('请在微信环境中使用微信功能')
    },

    // 判断当前微信版本是否支持指定 JS 接口
    checkJsApi (jsApiList) {
        return new Promise(resolve => {
            wx.checkJsApi({
                jsApiList, // 需要检测的 JS 接口列表
                success: resolve
                // 以键值对的形式返回，可用的 api 值 true，不可用为 false
                // 如：{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
            })
        })
    },

    // 选择图片
    chooseImage (params = {}) {
        return new Promise(resolve => {
            tool.getConfig(() => {
                const config = {
                    count: 9, // 可选择的数量
                    sizeType: ['original', 'compressed'], // 原图, 压缩
                    sourceType: ['album', 'camera'], // 相册, 相机
                    ...params
                }
                wx.chooseImage({
                    ...config,
                    success ({ localIds, sourceType }) {
                        tool.getImage(localIds, (fileList, base64List) => {
                            resolve({ fileList, base64List, sourceType })
                        })
                    }
                })
            })
        })
    },

    // 获取图片
    getImage (localIds, call) {
        const fileList = []
        const base64List = []

        // wx.getLocalImgData 不能在循环中同时多次使用，需排队调用
        let index = 0
        const getImage = () => {
            wx.getLocalImgData({
                localId: localIds[index],
                success ({ localData }) {
                    // iOS 为 data:image/jgp 开头的 base64，而 Android 没有需要加上
                    if (/^data:image/.test(localData)) {
                        localData = localData.replace('data:image/jgp', 'data:image/jpeg')
                    } else {
                        localData = 'data:image/jpeg;base64,' + localData
                    }
                    fileList.push(base64ToFile(localData))
                    base64List.push(localData)
                    if (index < localIds.length - 1) {
                        index++
                        getImage()
                    } else {
                        call(fileList, base64List)
                    }
                }
            })
        }
        getImage()
    },

    // 预览图片
    previewImage (list, index = 0) {
        tool.getConfig(() => {
            wx.previewImage({
                current: list[index],
                urls: list
            })
        })
    },

    // 获取当前网络状态
    getNetworkType () {
        return new Promise(resolve => {
            tool.getConfig(() => {
                wx.getNetworkType({
                    success ({ networkType }) {
                        resolve(networkType) // 2g, 3g, 4g, wifi
                    }
                })
            })
        })
    },

    // 使用微信内置地图查看位置
    openLocation (params) {
        const config = {
            latitude: 0, // 纬度，浮点数，范围为90 ~ -90
            longitude: 0, // 经度，浮点数，范围为180 ~ -180
            name: '', // 位置名
            address: '', // 地址详情说明
            scale: 1, // 地图缩放级别, 整形值, 范围从 1~28。默认为最大
            infoUrl: '' // 在查看位置界面底部显示的超链接, 可点击跳转
        }
        wx.openLocation({ ...config, ...params })
    },

    // 获取地理位置接口（若用户不同意不会触发返回结果，也不触发调用失败）
    getLocation (isMars) {
        return new Promise((resolve, reject) => {
            tool.getConfig(() => {
                wx.getLocation({
                    type: !isMars ? 'wgs84' : 'gcj02', // wgs84 为 gps 坐标，给 openLocation 用的为火星坐标 gcj02，即 isMars 传 true
                    success: resolve
                    // res：
                    // latitude：纬度，浮点数，范围为90 ~ -90
                    // longitude：经度，浮点数，范围为180 ~ -180
                    // speed：速度，以米/每秒计
                    // accuracy：位置精度
                })
            })
        })
    },

    // 调起微信扫一扫
    scanQRCode (needResult = 0) {
        return new Promise(resolve => {
            tool.getConfig(() => {
                wx.scanQRCode({
                    needResult, // 0 扫描结果由微信处理，1 返回扫描结果
                    scanType: ['qrCode', 'barCode'], // 指定扫二维码还是一维码
                    success ({ resultStr }) {
                        resolve(resultStr) // 当 needResult 为 1 时的扫描结果
                    }
                })
            })
        })
    },

    // 发起微信支付请求
    chooseWXPay (params) {
        return new Promise((resolve, reject) => {
            tool.getConfig(() => {
                // timestamp: 0, 支付签名时间戳
                // nonceStr: '', 支付签名随机串，不长于 32 位
                // package: '', 统一支付接口返回的 prepay_id 参数值，提交格式如：prepay_id=\*\*\*
                // signType: '', 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
                // paySign: '', 支付签名
                wx.chooseWXPay({
                    ...params,
                    success: resolve,
                    fail: reject
                })
            })
        })
    },

    // 获取微信收货地址（若用户不同意不会触发返回结果，也不触发调用失败，失败的情况只出现在用户没有收货地址时点击了取消添加新地址）
    openAddress () {
        return new Promise((resolve, reject) => {
            tool.getConfig(() => {
                wx.openAddress({
                    success: resolve,
                    fail: reject
                    // res.userName 收货人姓名
                    // res.postalCode 邮编
                    // res.provinceName 国标收货地址第一级地址（省）
                    // res.cityName 国标收货地址第二级地址（市）
                    // res.countryName 国标收货地址第三级地址（国家）
                    // res.detailInfo 详细收货地址信息
                    // res.nationalCode 收货地址国家码
                    // res.telNumber 收货人手机号码
                })
            })
        })
    }
}

export const {
    checkJsApi,
    chooseImage,
    previewImage,
    getNetworkType,
    openLocation,
    getLocation,
    scanQRCode,
    chooseWXPay,
    openAddress
} = tool
