import extend from './extend.js';
import request from './request.js';

/**
 * 应用更新类
 */
class appUpdate {
    /**
     * 检查应用更新
     * @param {string} url 检查地址
     * @returns {checkResult} 检查结果
     */
    async check(url) {
        let systeminfo = uni.getSystemInfoSync();
        let res = new checkResult();
        res.appWgtVersion = systeminfo.appWgtVersion || systeminfo.appVersion;

        if (extend.isEmptyString(url)) {
            res.success = false;
            res.message = 'url 无效！';
            return res;
        }

        let newRes = await request.send({
            url: url,
            method: 'get',
        });

        if (newRes.success) {
            // #ifdef APP

            res.isNew = this.isNewVersion(systeminfo.appWgtVersion, newRes.data.appWgtVersion);

            // #endif

            // #ifdef H5

            res.isNew = false;

            // #endif

            res.appWgtVersion = newRes.data.appWgtVersion;
            res.url = newRes.data.url;
        }

        return res;
    }

    /**
     * 解析版本号
     * @param {string} version 版本号，示例：3.5.1
     * @returns {Array<number>} 版本号数组
     */
    parseVersion(version) {
        let versions = [];
        if (extend.isNonEmptyString(version)) {
            let arr = version.split('.');
            for (let i in arr) {
                let res = parseInt(arr[i]);
                if (extend.isNumber(res)) {
                    versions.push(res);
                }
            }
        }
        return versions;
    }

    /**
     * 比较是否是新版本
     * @param {string} currentVer 当前版本
     * @param {string} newVer 新版本
     * @returns {boolean} 是否是新版本
     */
    isNewVersion(currentVer, newVer) {
        let isNew = false;
        let currentArr = this.parseVersion(currentVer);
        let newArr = this.parseVersion(newVer);
        for (let i = 0; i < currentArr.length; i++) {
            if (extend.isNumber(currentArr[i]) && extend.isNumber(newArr[i])) {
                if (currentArr[i] === newArr[i]) {
                    continue;
                }
                if (currentArr[i] > newArr[i]) {
                    break;
                }
                if (currentArr[i] < newArr[i]) {
                    isNew = true;
                    break;
                }
            }
        }
        return isNew;
    }

    /**
     * 更新
     * @param {object} param 参数
     * @param {string} param.url 文件地址
     * @param {Function} param.downloadSuccess 成功方法
     * @param {Function} param.progress 下载进度
     * @returns {updateResult} 更新结果
     */
    update(param) {
        if (extend.isNonEmptyString(param.url)) {
            param.url = param.url.trim();
        }
        return new Promise((resolve, reject) => {
            let result = new updateResult();
            // #ifdef MP-WEIXIN
            // #endif

            // #ifdef APP

            if (!extend.isUrl(param.url)) {
                result.success = false;
                result.message = '安装包地址不正确！';
                resolve(result);
                return;
            }

            let downloadTask = uni.downloadFile({
                url: param.url,
                success(res) {
                    if (res.statusCode === 200) {
                        if (typeof param.downloadSuccess === 'function') {
                            param.downloadSuccess(res);
                        }
                        // plus.runtime.install(res.tempFilePath, null, null, () => {
                        //     resule.success = false;
                        //     result.message = '用户取消安装';
                        //     resolve(result);
                        // });
                        try {
                            result.success = true;
                            plus.runtime.install(res.tempFilePath);
                        } catch (ex) {
                            ex = extend.errorFormatter(ex);
                            result.success = false;
                            result.message = `statusCode:${res.statusCode}\nurl:${param.url}\n${ex.message}`;
                        }
                        resolve(result);
                        // uni.showModal({
                        //     title: '升级提示',
                        //     content: '安装程序已下载，是否安装？',
                        //     success(r) {
                        //         if (r.confirm) {
                        //             try {
                        //                 result.success = true;
                        //                 plus.runtime.install(res.tempFilePath);
                        //             } catch (ex) {
                        //                 ex = extend.errorFormatter(ex);
                        //                 result.success = false;
                        //                 result.message = ex.message;
                        //             }
                        //             resolve(result);
                        //         } else {
                        //             result.message = '用户取消安装';
                        //             resolve(result);
                        //         }
                        //     }
                        // });
                    } else {
                        result.success = false;
                        result.message = `statusCode:${res.statusCode}\nurl:${param.url}\n${res.errMsg}`;
                        resolve(result);
                    }
                },
                fail(err) {
                    err = extend.errorFormatter(err);
                    err.message = `url:${param.url}\n${err.message}`;
                    resolve(result);
                }
            });

            if (typeof param.progress === 'function') {
                downloadTask.onProgressUpdate(res => {
                    if (typeof param.progress === 'function') {
                        param.progress(res);
                    }
                });
            }

            // #endif
        });
    }
}

/**
 * 检查结果类
 */
class checkResult {
    /**
     * 是否是新版本
     */
    isNew = false;

    /**
     * 应用版本
     */
    appWgtVersion = '';

    /**
     * 文件地址
     */
    url = '';
}

/**
 * 更新结果类
 */
class updateResult {

    /**
     * 成功标记
     */
    success = false;

    /**
     * 消息
     */
    message = '';
}

/**
 * 应用更新类
 */
export default new appUpdate();