import NProgress from 'nprogress';
import 'nprogress/nprogress.css';

const ProgressBar = function (config = {}) {
    // 构造函数配置
    this.options = Object.assign({
        // 超时时长，超过时长无响应自动完成进度条
        timeout: 8000,
        // 排除接口，接口路径包含数组中存在的字符串，则请求不启用进度条
        exclude: ['option/getOptions', 'basicsWebData/getTypeOptions', 'menuName/queryMenuName']
    }, config);
    // 记录进度条状态
    this.state = 'done';
    // 原计划用于合并请求时使用，暂时用不到
    this.isMerge = false;
    // 记录调用start次数
    this.count = 0;
    // 计计时器
    this.timer = null;
    const { timeout, exclude } = this.options;
    // 启动方法，接收2个参数 opt（配置），url（请求路径，用于过滤不启用进度条的请求）
    this.start = function (opt = {}, url = '') {
        // 如果调用start方法时传入了 noProgress 为 true， 不执行任何操作
        if (opt && opt.noProgress) {
            return;
        }
        this.count++;
        // 过滤不启用进度条的请求
        const f = exclude.find(it => url.includes(it));
        if (!f) {
            if (this.state !== 'start') {
                // 如果状态不是start，才启动进度条，并将状态置位start
                this.state = 'start';
                NProgress.start();
            } else {
                // 如果状态是start，表示进度条已启动，则调用inc将进度条前进随机长度，但不会到100%
                NProgress.inc();
            }
            clearTimeout(this.timer);
            // 如果超时，则自动完成进度条
            this.timer = setTimeout(() => {
                NProgress.done();
            }, timeout);
        }
    };
    // 完成方法
    this.done = function (opt = {}) {
        // 如果调用 done 方法时传入了 noProgress 为 true， 不执行任何操作
        if (opt && opt.noProgress) {
            return;
        }
        if (!this.isMerge) {
            // 如果调用 done 方法时传入了 noEnd 为 true， 即当前done方法中不完成进度条
            if (opt.noEnd) {
                // 计数减1
                this.count--;
                // 如果状态是start，则调用inc将进度条前进随机长度，但不会到100%
                if (this.state === 'start') {
                    NProgress.inc();
                }
                return;
            }
            // 延迟200ms再执行操作
            setTimeout(() => {
                // 计数减1
                this.count--;
                if (this.count <= 0) {
                    // 如果计数为0，则表示调用start和调用done方法次数相同，所有请求都已完成
                    // 则结束进度条
                    // state 置为 done
                    this.state = 'done';
                    // 计数置为0
                    this.count = 0;
                    NProgress.done();
                } else if (this.state === 'start') {
                    // 如果计数 大于 0，则表示调用start次数 多余 调用done方法次数，
                    // 则表示仍有请求未结束
                    // 则调用inc将进度条前进随机长度，但不会到100%
                    NProgress.inc();
                }
            }, 200);
        }
    };
    // 原计划用于合并请求时使用，暂时用不到
    this.MStart = function () {
        this.isMerge = true;
        this.state = 'start';
        NProgress.start();
    };
    // 原计划用于合并请求时使用，暂时用不到
    this.MDone = function () {
        this.isMerge = false;
        this.state = 'done';
        NProgress.done();
    };
};

export default ProgressBar
