import { getAppVersion } from '@/common/api/upgrade'
import { Dialog } from 'vant'

const APP_VERSION = process.env.VUE_APP_CURRENT_VERSION

export async function checkVersion () {
    let localVersion = await getLocalVersion()
    if(plus.os.name == "iOS") {
        // 检测app小版本的更新,IOS不检查大版本
        checkForWgt(localVersion.wgtVersion)
    } else if(plus.os.name == "Android") {
        // 先检测大版本的更新，如果没有再检测app小版本的更新
        checkForApp(localVersion);
    }
}

export function loadLocalOrRemoteVersion() {
    return getAppVersion({
        version: -1, // 大版本号传小于0时，获取后台数据库中APP版本信息，如果后台返回版本号也小于0，则加载线上资源，否则加载app内部资源
        code: "app_doc"
    })
}

// 获取本地应用资源版本号
function getLocalVersion() {
    return new Promise((resolve, reject) => {
        plus.runtime.getProperty(plus.runtime.appid, function(inf){
            let wgtVer = inf.version;
            console.log("当前应用版本：" + wgtVer);
            
            resolve({
                appVersion: APP_VERSION,
                wgtVersion: wgtVer
            })
       });
    })
}

function checkForApp(info) {
    plus.nativeUI.showWaiting();
    
    getAppVersion({
        version: 0,//获取当前版本的所有信息，然后以version_int号来校验升级信息
        code: "app_doc"
    }).then(function(res) {
        plus.nativeUI.closeWaiting();
        if(res.status == 200) {
            console.log(JSON.stringify(res))
            if(res.obj && res.obj.version_int && (res.obj.version_int > info.appVersion)) {
                confirmUpgrade('app', res.obj)
            }
            else {
                // 没有大版本时就检测小版本的升级
                checkForWgt(info.wgtVersion);
            }
        } else {
            plus.nativeUI.toast(res.errorMsg)
        }
    }, function(xhr, type, errorThrown) {
        plus.nativeUI.closeWaiting();
        plus.nativeUI.toast("版本升级检测异常！")
    })
}

function checkForWgt(wgtVer) {
    plus.nativeUI.showWaiting()
		
    return new Promise((resolve, reject) => {
        getAppVersion({
            version: 0, // 不能传wgtVer，因为小版本是字符串x.x.x的格式，而后台接口该字段是double类型，会报错。
            code: "wgt"
        }).then(function (res) {
            plus.nativeUI.closeWaiting();
            if(res.status == 200) {
                // 资源包不以version_int号来校验升级信息，而以version_str判断.version_str不相同就会升级。
                if(res.obj && res.obj.version_str && wgtVer && (res.obj.version_str != wgtVer)) {
                    confirmUpgrade('wgt', res.obj)
                } else {
                    reject("已是最新版本！")
                }
            } else {
                reject(res.errorMsg)
            }
        }, function(xhr, type, errorThrown) {
            plus.nativeUI.closeWaiting();
            reject("版本升级检测异常！")
        })
    })
}

function confirmUpgrade(type, { version_str, size, info, url }) {
    let msg = `检测到新版本<b>V${version_str}</b>，如不更新，可能导致系统无法正常使用，是否更新？ <br><b>温馨提示：</b>本次更新将消耗${size?size+'M':'一些'}数据流量，建议在wifi环境下更新。</div><p></p>`
    if(info) {
        msg +=  `<div align=center><b><font size="4">本次更新内容</font></b><br></div><div align=left>${info}</div>`
    }
    Dialog.confirm({
        title: '版本更新',
        message: msg,
        messageAlign: 'left',
        confirmButtonText: "立即更新",
        cancelButtonText: "关闭并退出"
    }).then(() => {
        if(type == 'wgt') {
            downWgt(url).then((path) => {
                installWgt(path)
            })
        } else if(type == 'app') {
            plus.runtime.openURL(url);  
        }
    }).catch(() => {
        plus.runtime.quit();
        if (plus.os.name == "iOS") {
            plus.nativeUI.toast('请按HOME键退出应用');
        }
    });
}

// 下载wgt文件
function downWgt(wgtUrl){
    return new Promise((resolve, reject) => {
        var self = this
        plus.nativeUI.showWaiting("正在下载升级文件...");
        console.log(wgtUrl)
        plus.downloader.createDownload( wgtUrl, {filename:"_doc/update/"}, function(d,status){
            plus.nativeUI.closeWaiting();
            if ( status == 200 ) {
                console.log("下载升级文件成功：" + d.filename);
                resolve(d.filename)
            } else {
                console.log("下载升级文件失败！");
                plus.nativeUI.alert("下载升级文件失败！");
                reject("下载升级文件失败")
            }
        }).start();
    })
}

// 更新应用资源
function installWgt (path){
    plus.nativeUI.showWaiting("正在安装升级文件...");
    plus.runtime.install(path,{},function(){
        plus.nativeUI.closeWaiting();
        console.log("升级成功！");
        plus.nativeUI.alert("升级完成，请点击确定对App进行重启！",function(){
            plus.runtime.restart();
        });
    },function(e){
        plus.nativeUI.closeWaiting();
        plus.nativeUI.toast("升级失败！错误信息[" + e.code + "]：" + e.message);
        console.log("升级失败["+e.code+"]："+e.message);
    });
}