/* POSLocal.java - names of parts of speech in some language.
 *
 * Copyright (c) 2011 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com>
 * Distributed under EPL/LGPL/GPL/AL/BSD multi-license.
 */

package wikokit.base.wikt.constant;

import java.util.HashMap;
import java.util.Map;

/** Names of parts of speech in some language (e.g. Russian)
 * and the links to the POS.java codes.
 */
public class POSLocal {

    /** POS name, e.g. "noun" */
    protected String name;

    /** Short POS name, e.g. "n." for noun */
    protected String short_name;

    /** POS corresponding to this name, e.g. POS.noun */
    protected POS pos;
    
    protected final static Map<String, POS> name2pos = new HashMap<String, POS>();
    protected final static Map<POS, String> pos2name = new HashMap<POS, String>();
    protected final static Map<POS, String> pos2name_short = new HashMap<POS, String>();

    /** Remark: run the RelationTableAll.main() in order to check duplicates
     * of part of speech names and short names.
     */
    protected POSLocal(String _name,String _short_name, POS _pos) {
        this.name   = _name;
        this.short_name = _short_name;
        this.pos    = _pos;

        if(name.length() == 0)
            System.out.println("Error in POSRu.POSRu(): empty part of speech name! The POS name="+pos+
                    ". Check the maps name2pos and pos2name.");

        // check the uniqueness of the POS and name
        String name_prev = pos2name.get(pos);
        POS pos_prev = name2pos.get(name);

        if(null != name_prev)
            System.out.println("Error in POSRu.POSRu(): duplication of POS! POS="+pos+
                    " name='"+ name + "'. Check the maps name2pos and pos2name.");

        if(null != pos_prev)
            System.out.println("Error in POSRu.POSRu(): duplication of POS! POS="+pos+
                    " name='"+ name + "'. Check the maps name2pos and pos2name.");

        name2pos.put(name, pos);
        pos2name.put(pos, name);
        pos2name_short.put(pos, short_name);
    }

    /** Checks weather exists POS by its name in Russian language. */
    public static boolean hasName(String name) {
        return name2pos.containsKey(name);
    }

    /** Checks weather exists the translation for this POS. */
    public static boolean has(POS p) {
        return pos2name.containsKey(p);
    }

    /** Gets POS by its name in some language*/
    public static POS get(String name) {
        return name2pos.get(name);
    }

    /** Gets name of POS in Russian. */
    public static String getName (POS p) {

        String s = pos2name.get(p);
        if(null == s)
            return "";
            //return p.getName(); // if there is no translation into local language, then English name
        return s;
    }

    /** Gets short name of POS in some language (e.g. Russian). */
    public static String getShortName (POS p) {

        String s = pos2name_short.get(p);
        if(null == s) {
            s = pos2name.get(p);
            if(null == s)
                return "";
            //return p.getName(); // if there is no translation into local language, then English name
        }
        return s;
    }

    /** Counts number of translations. */
    public static int size() {
        return name2pos.size();
    }

}
