'use strict';

(function() {

    var log, translations = {};

    /*@
    Ox.getLocale <f> Returns locale
        () -> <s> Locale (like 'de' or 'fr')
    @*/
    Ox.getLocale = function() {
        return Ox.LOCALE;
    };

    /*@
    Ox.setLocale <f> Sets locale
        (locale[, url], callback)
        locale <s> Locale (like 'de' or 'fr')
        url <s|[s]> one or more URLs of JSON file with additional translations
        callback <f> Callback function
            success <b> If true, locale has been set
    @*/
    Ox.setLocale = function(locale, url, callback) {
        var isValidLocale = Ox.contains(Object.keys(Ox.LOCALE_NAMES), locale),
            urls = [];
        if (arguments.length == 2) {
            callback = arguments[1];
            url = null;
        }
        if (isValidLocale) {
            Ox.LOCALE = locale;
            if (locale == 'en') {
                translations = {};
                callback(true);
            } else {
                translations = {};
                Ox.forEach(Ox.LOCALES, function(locales, module) {
                    if (
                        (!module || Ox.load[module])
                        && Ox.contains(locales, locale)
                    ) {
                        urls.push([
                            Ox.PATH + 'Ox' + (module ? '.' + module : '')
                            + '/json/locale.' + locale + '.json'
                        ]);
                    }
                });
                url && Ox.makeArray(url).forEach(function(value) {
                    urls.push(Ox.makeArray(value));
                });
                Ox.getJSON(urls, function(data) {
                    Ox.forEach(data, function(values, url) {
                        Ox.extend(translations, values);
                    });
                    callback(true);
                });
            }
        } else {
            callback(false);
        }
    };

    /*@
    Ox._ <f> Localizes a string
        (string[, options]) -> <s> Localized string
        string <s> English string
        options <o> Options passed to Ox.formatString
    @*/
    Ox._ = function(value, options) {
        var translation = translations[value];
        log && log(value, translation);
        translation = translation || value;
        return Ox.formatString(translation, options);
    };

    /*@
    Ox._.log <f> Registers a logging function
        (callback) -> <u> undefined
        callback <f> Callback function
            english <s> English string
            translation <s> Translated string
    @*/
    Ox._.log = function(callback) {
        log = callback;
    };

})();