angular.module('syncthing.core')
    .provider('LocaleService', function () {

        var _defaultLocale,
            _availableLocales;

        this.setDefaultLocale = function (locale) {
            _defaultLocale = locale;
        };

        this.setAvailableLocales = function (locales) {
            _availableLocales = locales;
        };

        this.$get = ['$http', '$translate', function ($http, $translate) {

            /**
             * Requests the server in order to get the browser's requested locale strings.
             *
             * @returns promise which on success resolves with a locales array
             */
            function readBrowserLocales() {
                // @TODO: check if there is nice way to utilize window.navigator.languages or similiar api.

                return $http.get(urlbase + "/lang");
            }

            function autoConfigLocale() {

                return readBrowserLocales().success(function (langs) {
                    // Find the first language in the list provided by the user's browser
                    // that is a prefix of a language we have available. That is, "en"
                    // sent by the browser will match "en" or "en-US", while "zh-TW" will
                    // match only "zh-TW" and not "zh-CN".

                    var i,
                        lang,
                        matching;

                    for (i = 0; i < langs.length; i++) {
                        lang = langs[i];

                        if (lang.length < 2) {
                            continue;
                        }

                        matching = _availableLocales.filter(function (possibleLang) {
                            // The langs returned by the /rest/langs call will be in lower
                            // case. We compare to the lowercase version of the language
                            // code we have as well.
                            possibleLang = possibleLang.toLowerCase();
                            if (possibleLang.length > lang.length) {
                                return possibleLang.indexOf(lang) === 0;
                            } else {
                                return lang.indexOf(possibleLang) === 0;
                            }
                        });

                        if (matching.length >= 1) {
                            $translate.use(matching[0]);
                            return;
                        }
                    }
                    // Fallback if nothing matched
                    $translate.use(_defaultLocale);
                });

            }

            function useLocale(language) {
                // @TODO: eventually check for valid locale format
                if (language) {
                    $translate.use(language);
                }
            }

            return {
                autoConfigLocale: autoConfigLocale,
                useLocale: useLocale
            }
        }];

    });
