// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.v23.i18n;

import io.v.v23.context.VContext;

/**
 * Provides various language-related utilities.
 */
public class Language {
    private static Catalog defaultCatalog = new Catalog();

    private Language() {}

    /**
     * Returns a child of the given context that has the provided language attached to it.
     *
     * @param  base     base context
     * @param  language a language that is to be attached
     * @return          a child of the given context that has the provided language attached to it
     */
    public static VContext contextWithLanguage(VContext base, String language) {
        return base.withValue(new LanguageTagKey(), language);
    }

    /**
     * Returns the language associated with the provided context or the empty language if
     * there is none.
     *
     * @param  context context the language is associated with
     * @return         the language associated with the above context
     */
    public static String languageFromContext(VContext context) {
        if (context == null) return "";
        Object value = context.value(new LanguageTagKey());
        if (value == null || !(value instanceof String)) {
            return "";
        }
        return (String) value;
    }

    /**
     * Returns the default {@link Catalog}.
     */
    public static Catalog getDefaultCatalog() {
        return defaultCatalog;
    }

    /**
     * Returns a base language given a language.  It is the first hyphen-separated segment of an
     * IETF language tag.
     *
     * @param  language input language
     * @return          base language of the input language
     */
    public static String baseLanguage(String language) {
        int idx = language.indexOf('-');
        if (idx == -1) return language;
        return language.substring(0, idx);
    }

    private static class LanguageTagKey {
        @Override
        public int hashCode() {
            return 0;
        }
    }
}