/**
 * 路由 Token 拦截器
 * token 存储在 localStorage 中，key 值为 token。
 * token 为空时跳转到指定页面, 页面属性值为 loginPath。
 */
import ext from './extend.js';

let actions = ['navigateTo', 'redirectTo', 'reLaunch', 'switchTab', 'navigateBack'];
let options = {
    loginPath: '/pages/login/index',
    tokenKey: 'token',
    pages: []
};

export default {
    /**
     * 初始化
     * @param {Object} opts - 参数
     * @param {string} opts.loginPath - 登录页路径，会从拦截页面中排除。
     * @param {string} opts.tokenKey - Token 键名，默认 token。
     * @param {Array.<string>} opts.pages - 需要 Token 认证拦截的页面。
     */
    init(opts) {
        if (ext.isObject(opts)) {
            if (ext.isNonEmptyString(opts.loginPath)) {
                options.loginPath = opts.loginPath;
            }
            if (ext.isArray(opts.pages)) {
                options.pages = opts.pages;
            }
            if (ext.isNonEmptyString(opts.tokenKey)) {
                options.tokenKey = opts.tokenKey;
            }
        }
        actions.forEach(item => {
            uni.addInterceptor(item, {
                invoke(args) {
                    if (options.loginPath === args.url) {
                        return true;
                    }
                    let token = ext.readStorage(options.tokenKey);
                    /**
                     * 如果 Token 为空，当前页面为验证页面时，跳转到首页。
                     * 如果 Token 不为空，所有页面都可以跳转。
                     */
                    if (ext.isEmptyString(token)) {
                        let isVerify = false;
                        for (let i = 0; i < options.pages.length; i++) {
                            if (args.url === options.pages[i]) {
                                isVerify = true;
                                break;
                            }
                        }
                        if (isVerify) {
                            args.url = options.loginPath;
                        }
                    }
                    return true;
                }
            });
        });
    }
}