/* LabelParamsRu.java - a set of functions related to context label templates with parameters in Russian Wiktionary.
 * 
 * Copyright (c) 2013 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com>
 * Distributed under EPL/LGPL/GPL/AL/BSD multi-license.
 */
package wikokit.base.wikt.multi.ru.name;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import wikokit.base.wikipedia.util.template.TemplateExtractor;
import wikokit.base.wikt.constant.Label;
import wikokit.base.wikt.constant.LabelCategory;
import wikokit.base.wikt.multi.en.name.LabelEn;

/** A set of functions related to context label templates with parameters in Russian Wiktionary.
 * These (context label) templates have several parameter to be extracted.
 */
public class LabelParamsRu {
 
    
    /** Context labels in Russian Wiktionary and number of parameters for each label.
     * Text will be extracted only from templates with these (known) number of template parameters.
     */
    private static final Map<Label, int[]> labels_to_number_of_params;
    static {
        Map<Label, int[]> nop = new HashMap<Label, int[]>();
        
        // templates with several parameters to be extracted.
        nop.put(LabelRu.regional,       new int[] {    1, 2 });
        
        labels_to_number_of_params = Collections.unmodifiableMap(nop);
    }
    
    /** Checks that this source label has several parameters 
     * and checks that this label has a correct number of parameters, 
     * e.g. "# {{обл.|малорос.}}"
     * 
     * @param label template to be checked
     * @return true if known labels have allowed number of parameters
     */
    public static boolean isLabelWithParams (Label source_label, int number_of_params)
    {   
        for (Map.Entry<Label, int[]> entry : labels_to_number_of_params.entrySet()) {
            Label cur_label = entry.getKey();
            
            if(Label.equals(cur_label, source_label))
                for(int allowed : entry.getValue())
                    if(number_of_params == allowed)
                        return true;
            
        }        
        return false;
    }
    
    
    
    /** Gets new label from parameters, e.g. {{region|Siberia}} -> new regional label {{Siberia}}
     * 
     * @param label
     * @param template_params
     * @return 
     */
    public static Label getNewLabelByParams (Label label, String[] template_params)
    {   
        if((null == template_params || template_params.length == 0))
            return null;
        
        //String result = "";
        for(int i=0; i<template_params.length; i++)
            template_params[i] = template_params[i].trim();
        
        // {{обл.||-}}
        if( template_params.length == 2 &&
            template_params[0].length() == 0 &&
            template_params[1].equals( "-" ))
        {
            return LabelRu.regional;
        }
        
        if(Label.equals(label, LabelRu.regional)) {
            // template_params[0] - region or language code (if region is absent)
            // template_params[1] - language code (en, de, fr...)
            
            // template parameter without language code (region name or empty array)
            String[] remain_params = TemplateExtractor.excludeParameter (template_params, "lang");
            
            switch( remain_params.length ) {
                case 0:
                case 1:
                    String regions = "";
                    if(remain_params.length > 0)
                        regions = remain_params[0];
                    
                    if(regions.length() == 0)
                        return LabelRu.regional;
                    
                    if(LabelRu.hasShortName(regions)) {
                        Label label_existing = LabelRu.getByShortName(regions);
                        if(null != label_existing)
                            return label_existing;
                    } else {                    
                        return new LabelEn(regions, LabelCategory.regional); // let's create new LabelRu with label=regions and label category regional
                        //return new LabelEn(regions); // , LabelCategory.regional); // let's create new LabelRu with label=regions
                    }
            }
            
        // } else if(Label.equals(label, LabelRu.action)) {
            
        }
        return null;
    }
}
