// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
/*
 *******************************************************************************
 * Copyright (C) 2008-2012, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.impl.javaspi.util;

import java.util.Locale;
import java.util.spi.LocaleNameProvider;

import com.ibm.icu.impl.javaspi.ICULocaleServiceProvider;
import com.ibm.icu.impl.locale.AsciiUtil;
import com.ibm.icu.text.LocaleDisplayNames;

public class LocaleNameProviderICU extends LocaleNameProvider {

    @Override
    public String getDisplayCountry(String countryCode, Locale locale) {
        countryCode = AsciiUtil.toUpperString(countryCode);
        String disp = LocaleDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale))
                .regionDisplayName(countryCode);
        if (disp == null || disp.length() == 0 || disp.equals(countryCode)) {
            return null;
        }
        return disp;
    }

    @Override
    public String getDisplayLanguage(String languageCode, Locale locale) {
        languageCode = AsciiUtil.toLowerString(languageCode);
        String disp = LocaleDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale))
                .languageDisplayName(languageCode);
        if (disp == null || disp.length() == 0 || disp.equals(languageCode)) {
            return null;
        }
        return disp;
    }

    // Not available in Java 6
    // @Override
    public String getDisplayScript(String scriptCode, Locale locale) {
        scriptCode = AsciiUtil.toTitleString(scriptCode);
        String disp = LocaleDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale))
                .scriptDisplayName(scriptCode);
        if (disp == null || disp.length() == 0 || disp.equals(scriptCode)) {
            return null;
        }
        return disp;
    }

    @Override
    public String getDisplayVariant(String variant, Locale locale) {
        variant = AsciiUtil.toUpperString(variant);
        String disp = LocaleDisplayNames.getInstance(ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale))
                .variantDisplayName(variant);
        if (disp == null || disp.length() == 0 || disp.equals(variant)) {
            return null;
        }
        return disp;
    }

    @Override
    public Locale[] getAvailableLocales() {
        return ICULocaleServiceProvider.getAvailableLocales();
    }
}
