/*
 *******************************************************************************
 * Copyright (C) 1998-2008, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * Created on Apr 4, 2003
 *
 *******************************************************************************
 */
package com.ibm.icu.dev.tool.layout;

/**
 * This class holds the list of languages.
 * 
 * @author emader
 *
 */
public class LanguageData extends TagValueData
{
    public static class Record
    {
        private String tag;
        private String name;
        
        public Record(String tag, String name)
        {
            this.tag = tag;
            this.name = name;
        }
        
        public String tag()
        {
            return tag;
        }
        
        public String name()
        {
            return name;
        }
        
        public String label()
        {
            return TagUtilities.tagLabel(tag);
        }
        
        public String makeTag()
        {
            return TagUtilities.makeTag(tag);
        }
    }
        
    /*
     * This is temporary data until there is some resolution between
     * the OpenType language system tags and the ISO and RFC standards...
     */
    private Record[] languages =
    {
        new Record("",    "null"),
        new Record("ARA", "Arabic"),
        new Record("ASM", "Assamese"),
        new Record("BEN", "Bengali"),
        new Record("FAR", "Farsi"),
        new Record("GUJ", "Gujarati"),
        new Record("HIN", "Hindi"),
        new Record("IWR", "Hebrew"),
        new Record("JII", "Yiddish"),
        new Record("JAN", "Japanese"),
        new Record("KAN", "Kannada"),
        new Record("KOK", "Konkani"),
        new Record("KOR", "Korean"),
        new Record("KSH", "Kashmiri"),
        new Record("MAL", "Malayalam (Traditional)"),
        new Record("MAR", "Marathi"),
        new Record("MLR", "Malayalam (Reformed)"),
        new Record("MNI", "Manipuri"),
        new Record("ORI", "Oriya"),
        new Record("SAN", "Sanscrit"),
        new Record("SND", "Sindhi"),
        new Record("SNH", "Sinhalese"),
        new Record("SYR", "Syriac"),
        new Record("TAM", "Tamil"),
        new Record("TEL", "Telugu"),
        new Record("THA", "Thai"),
        new Record("URD", "Urdu"),
        new Record("ZHP", "Chinese (Phonetic)"),
        new Record("ZHS", "Chinese (Simplified)"),
        new Record("ZHT", "Chinese (Traditional)"),
        
        // languages added on 03/13/2008
        // TODO: need to deal with the fact that
        // these codes should be @draft, and the above
        // codes should be @final.
        new Record("AFK", "Afrikaans"),
        new Record("BEL", "Belarussian"),
        new Record("BGR", "Bulgarian"),
        new Record("CAT", "Catalan"),
        new Record("CHE", "Chechen"),
        new Record("COP", "Coptic"),
        new Record("CSY", "Czech"),
        new Record("DAN", "Danish"),
        new Record("DEU", "German"),
        new Record("DZN", "Dzongkha"),
        new Record("ELL", "Greek"),
        new Record("ENG", "English"),
        new Record("ESP", "Spanish"),
        new Record("ETI", "Estonian"),
        new Record("EUQ", "Basque"),
        new Record("FIN", "Finnish"),
      //new Record("FLE", "Flemish"), // Flemish has the same ISO 639-2 code as Dutch (NLD)
        new Record("FRA", "French"),
        new Record("GAE", "Gaelic"),
        new Record("HAU", "Hausa"),
        new Record("HRV", "Croation"),
        new Record("HUN", "Hungarian"),
        new Record("HYE", "Armenian"),
        new Record("IND", "Indonesian"),
        new Record("ITA", "Italian"),
        new Record("KHM", "Khmer"),
        new Record("MNG", "Mongolian"),
        new Record("MTS", "Maltese"),
        new Record("NEP", "Nepali"),
        new Record("NLD", "Dutch"),
        new Record("PAS", "Pashto"),
        new Record("PLK", "Polish"),
        new Record("PTG", "Portuguese"),
        new Record("ROM", "Romanian"),
        new Record("RUS", "Russian"),
        new Record("SKY", "Slovak"),
        new Record("SLV", "Slovenian"),
        new Record("SQI", "Albanian"),
        new Record("SRB", "Serbian"),
        new Record("SVE", "Swedish"),
        new Record("TIB", "Tibetan"),
        new Record("TRK", "Turkish"),
        new Record("WEL", "Welsh")
    };
    
    private int minLanguage = 0;
    private int maxLanguage = minLanguage + languages.length - 1;
    
    public int getMinValue()
    {
        return minLanguage;
    }
    
    public int getMaxValue()
    {
        return maxLanguage;
    }
    
    public String getTag(int value)
    {
        if (value < minLanguage || value > maxLanguage) {
            return null;
        }
        
        return languages[value - minLanguage].tag();
    }
    
    public String getTagLabel(int value)
    {
        if (value < minLanguage || value > maxLanguage) {
            return null;
        }
        
        return languages[value - minLanguage].label();
    }
    
    public String makeTag(int value)
    {
        if (value < minLanguage || value > maxLanguage) {
            return null;
        }
        
        return languages[value - minLanguage].makeTag();
    }
    
    public String getName(int value) {
        if (value < minLanguage || value > maxLanguage) {
            return "(UNKNOWN)";
        }
        
        return languages[value - minLanguage].name();
    }
}
