/*
 *******************************************************************************
 * Copyright (C) 1996-2004, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 *  *****************************************************************************************
 */
 
package com.ibm.icu.impl;

import java.util.Locale;

/**
 * A class to hold utility functions missing from java.util.Locale.
 */
public class LocaleUtility {

    /**
     * A helper function to convert a string of the form
     * aa_BB_CC to a locale object.  Why isn't this in Locale?
     */
    public static Locale getLocaleFromName(String name) {
        String language = "";
        String country = "";
        String variant = "";

        int i1 = name.indexOf('_');
        if (i1 < 0) {
            language = name;
        } else {
            language = name.substring(0, i1);
            ++i1;
            int i2 = name.indexOf('_', i1);
            if (i2 < 0) {
                country = name.substring(i1);
            } else {
                country = name.substring(i1, i2);
                variant = name.substring(i2+1);
            }
        }

        return new Locale(language, country, variant);
    }

    /**
     * Compare two locale strings of the form aa_BB_CC, and
     * return true if parent is a 'strict' fallback of child, that is,
     * if child =~ "^parent(_.+)*" (roughly).
     */
    public static boolean isFallbackOf(String parent, String child) {
        if (!child.startsWith(parent)) {
            return false;
        }
        int i = parent.length();
        return (i == child.length() ||
                child.charAt(i) == '_');
    }

    /**
     * Compare two locales, and return true if the parent is a
     * 'strict' fallback of the child (parent string is a fallback
     * of child string).
     */
    public static boolean isFallbackOf(Locale parent, Locale child) {
        return isFallbackOf(parent.toString(), child.toString());
    }


    /**
     * Convenience method that calls canonicalLocaleString(String) with
     * locale.toString();
     */
    public static String canonicalLocaleString(Locale locale) {
        return canonicalLocaleString(locale.toString());
    }

    /**
     * You'd think that Locale canonicalizes, since it munges the
     * renamed languages, but it doesn't quite.  It forces the region
     * to be upper case but doesn't do anything about the language or
     * variant.  Our canonical form is 'lower_UPPER_UPPER'.  
     */
    public static String canonicalLocaleString(String id) {
    if (id != null) {
        int x = id.indexOf("_");
        if (x == -1) {
        id = id.toLowerCase(Locale.ENGLISH);
        } else {
        StringBuffer buf = new StringBuffer();
        buf.append(id.substring(0, x).toLowerCase(Locale.ENGLISH));
        buf.append(id.substring(x).toUpperCase(Locale.ENGLISH));
            
        int len = buf.length();
        int n = len;
        while (--n >= 0 && buf.charAt(n) == '_') {};
        if (++n != len) {
            buf.delete(n, len);
        }
        id = buf.toString();
        }
    }
    return id;
    }

    /**
     * Fallback from the given locale name by removing the rightmost
     * _-delimited element.  If there is none, return the root locale ("",
     * "", "").  If this is the root locale, return null.  NOTE: The
     * string "root" is not recognized; do not use it.
     * @return a new Locale that is a fallback from the given locale, or
     * null.
     */
    public static Locale fallback(Locale loc) {

        // Split the locale into parts and remove the rightmost part
        String[] parts = new String[]
            { loc.getLanguage(), loc.getCountry(), loc.getVariant() };
        int i;
        for (i=2; i>=0; --i) {
            if (parts[i].length() != 0) {
                parts[i] = "";
                break;
            }
        }
        if (i<0) {
            return null; // All parts were empty
        }
        return new Locale(parts[0], parts[1], parts[2]);
    }
}
