import isArray from ‘../utils/is-array’; import compareArrays from ‘../utils/compare-arrays’; import { Locale } from ‘./constructor’;

// internal storage for locale config files var locales = {}; var globalLocale;

function normalizeLocale(key) {

return key ? key.toLowerCase().replace('_', '-') : key;

}

// pick the locale from the array // try [‘en-au’, ‘en-gb’] as ‘en-au’, ‘en-gb’, ‘en’, as in move through the list trying each // substring from most specific to least, but move to the next array item if it’s a more specific variant than the current root function chooseLocale(names) {

var i = 0, j, next, locale, split;

while (i < names.length) {
    split = normalizeLocale(names[i]).split('-');
    j = split.length;
    next = normalizeLocale(names[i + 1]);
    next = next ? next.split('-') : null;
    while (j > 0) {
        locale = loadLocale(split.slice(0, j).join('-'));
        if (locale) {
            return locale;
        }
        if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
            //the next array item is better than a shallower substring of this one
            break;
        }
        j--;
    }
    i++;
}
return null;

}

function loadLocale(name) {

var oldLocale = null;
// TODO: Find a better way to register and load all the locales in Node
if (!locales[name] && typeof module !== 'undefined' &&
        module && module.exports) {
    try {
        oldLocale = globalLocale._abbr;
        require('./locale/' + name);
        // because defineLocale currently also sets the global locale, we
        // want to undo that for lazy loaded locales
        getSetGlobalLocale(oldLocale);
    } catch (e) { }
}
return locales[name];

}

// This function will load locale and then set the global locale. If // no arguments are passed in, it will simply return the current global // locale key. export function getSetGlobalLocale (key, values) {

var data;
if (key) {
    if (typeof values === 'undefined') {
        data = getLocale(key);
    }
    else {
        data = defineLocale(key, values);
    }

    if (data) {
        // moment.duration._locale = moment._locale = data;
        globalLocale = data;
    }
}

return globalLocale._abbr;

}

export function defineLocale (name, values) {

if (values !== null) {
    values.abbr = name;
    if (!locales[name]) {
        locales[name] = new Locale();
    }
    locales[name].set(values);

    // backwards compat for now: also set the locale
    getSetGlobalLocale(name);

    return locales[name];
} else {
    // useful for testing
    delete locales[name];
    return null;
}

}

// returns locale data export function getLocale (key) {

var locale;

if (key && key._locale && key._locale._abbr) {
    key = key._locale._abbr;
}

if (!key) {
    return globalLocale;
}

if (!isArray(key)) {
    //short-circuit everything else
    locale = loadLocale(key);
    if (locale) {
        return locale;
    }
    key = [key];
}

return chooseLocale(key);

}