import routesI18n from '@/router/i18n';
import { getI18nKey } from '@/utils/routerUtil';

/**
 * 根据 router options 配置生成 国际化语言
 * @param lang
 * @param routes
 * @param valueKey
 * @returns {*}
 */
function generateI18n(lang, routes, valueKey) {
    routes.forEach(route => {
        let keys = getI18nKey(route.fullPath).split('.');
        let value =
            valueKey === 'path'
                ? route[valueKey]
                      .split('/')
                      .filter(item => !item.startsWith(':') && item != '')
                      .join('.')
                : route[valueKey];
        if (value.includes('_')) {
            value = value.replace('_', ' ');
            value = value.toLowerCase().replace(/( |^)[a-z]/g, L => L.toUpperCase());
        } else {
            value = value.charAt(0).toUpperCase() + value.toLowerCase().substring(1);
        }

        lang.assignProps(keys, value);
        if (route.children) {
            generateI18n(lang, route.children, valueKey);
        }
    });
    return lang;
}

/**
 * 格式化 router.options.routes，生成 fullPath
 * @param routes
 * @param parentPath
 */
function formatFullPath(routes, parentPath = '') {
    routes.forEach(route => {
        let isFullPath = route.path.substring(0, 1) === '/';
        route.fullPath = isFullPath
            ? route.path
            : parentPath === '/'
            ? parentPath + route.path
            : parentPath + '/' + route.path;
        if (route.children) {
            formatFullPath(route.children, route.fullPath);
        }
    });
}

/**
 * 从路由提取国际化数据
 * @param i18n
 * @param routes
 */
function mergeI18nFromRoutes(i18n, routes) {
    formatFullPath(routes);
    const zh_CN = generateI18n(new Object(), routes, 'name');
    const en_US = generateI18n(new Object(), routes, 'path');

    i18n.mergeLocaleMessage('zh_CN', zh_CN);
    i18n.mergeLocaleMessage('en_US', en_US);
    const messages = routesI18n.messages;
    Object.keys(messages).forEach(lang => {
        i18n.mergeLocaleMessage(lang, messages[lang]);
    });
}

/**
 * 给对象注入属性
 * @param keys 属性key数组， 如 keys = ['config', 'path'] , 则会给对象注入 object.config.path 的属性
 * @param value 属性值
 * @returns {Object}
 */
Object.defineProperty(Object.prototype, 'assignProps', {
    writable: false,
    enumerable: false,
    configurable: true,
    value: function(keys, value) {
        let props = this;
        for (let i = 0; i < keys.length; i++) {
            let key = keys[i];
            if (i == keys.length - 1) {
                props[key] = value;
            } else {
                props[key] = props[key] == undefined ? {} : props[key];
                props = props[key];
            }
        }
        return this;
    },
});

export { mergeI18nFromRoutes, formatFullPath };
