package iitb.cfilt.cpost.vgi;

import java.util.*;
import java.io.*;
import iitb.cfilt.cpost.ConfigReader;

public class VerbGroupIdentifierRuleReader {
	
	public HashMap<String,Vector<String>> vghash = new HashMap<String,Vector<String>>();
	public HashMap<String,Vector<String>> auxhash = new HashMap<String,Vector<String>>();
	public Vector<String> mustEndSuffixes = new Vector<String>();
	public Vector<String> mustEndWords = new Vector<String>();
	public Vector<String> adverbialWords = new Vector<String>();
	public Vector<String> adverbialSuffixes = new Vector<String>();
	public HashMap<String, String> adverbialSuffix_Words = new HashMap<String, String>();
	public VerbGroupIdentifierRuleReader()
	{
		try
		{
			BufferedReader bsrr = new BufferedReader(new InputStreamReader(new FileInputStream(ConfigReader.get("VGI.VGRuleFile")), "UTF8"));
			String line = "";
	
			while (line != null)
			{
				line = bsrr.readLine();
				if(line != null)
				{
					line = line.trim();
					if(line.length()!=0 && !line.startsWith("//"))
					{
						String lineComponents[] = line.split(",");
						if(lineComponents.length == 2)
						{
							String verbSuffix = lineComponents[0].trim();
							String nextVerb = lineComponents[1].trim();
							
							if(vghash.containsKey(verbSuffix))
							{
								Vector<String> tmp = vghash.get(verbSuffix);
								tmp.add(nextVerb);
								vghash.put(verbSuffix,tmp);
							}
							else
							{
								Vector<String> tmp = new Vector<String>();
								tmp.add(nextVerb);
								vghash.put(verbSuffix,tmp);
							}
						}
					}
				}
			}
			
			bsrr.close();
			
			bsrr = new BufferedReader(new InputStreamReader(new FileInputStream(ConfigReader.get("VGI.VGMustEndFile")), "UTF8"));
			line = "";
			boolean suffix = true;
			while (line != null){
				line = bsrr.readLine();
				if(line != null){
					line = line.trim();
					if(line.length()!=0 && !line.startsWith("//")){
						if(line.equalsIgnoreCase("Suffixes")){
							suffix = true;
						}
						else if(line.equalsIgnoreCase("Words")){
							suffix = false;
						}
						else{
							if(suffix){
								mustEndSuffixes.add(line);
							}
							else{
								mustEndWords.add(line);
							}
						}
					}
				}
			}
			
			bsrr.close();
			bsrr = new BufferedReader(new InputStreamReader(new FileInputStream(ConfigReader.get("VGI.VGAdverbials")), "UTF8"));
			line = "";
			int ptrn=0;
			while (line != null){
				line = bsrr.readLine();
				if(line != null){
					line = line.trim();
					if(line.length()!=0 && !line.startsWith("//")){
						if(line.equalsIgnoreCase("Suffix-Word")){
							ptrn = 0;
						}
						if(line.equalsIgnoreCase("Suffixes")){
							ptrn = 1;
						}
						else if(line.equalsIgnoreCase("Words")){
							ptrn = 2;
						}
						else{
							switch( ptrn ){
							case 0:
								//adverbialSuffix_Words.add(line);
								String lineComponents[] = line.split(" ");
								if(lineComponents.length == 2)
								{
									String verbSuffix = lineComponents[0].trim();
									String nextVerb = lineComponents[1].trim();
									adverbialSuffix_Words.put(verbSuffix, nextVerb);
								}
								break;
							case 1:						
								adverbialSuffixes.add(line);
								break;
							case 2:
								adverbialWords.add(line);
								break;
							}
						}
					}
				}
			}
			
			bsrr.close();
			bsrr = new BufferedReader(new InputStreamReader(new FileInputStream(ConfigReader.get("VGI.AuxFile")), "UTF8"));
			line = "";
			
			while (line != null)
			{
				line = bsrr.readLine();
				if(line != null)
				{
					line = line.trim();
					if(line.length()!=0 && !line.startsWith("//"))
					{
						String lineComponents[] = line.split(",");
						String aux = lineComponents[0].trim();
	//					if(aux == "null"){
		//					aux = "";
			//			}
						String nextAux = lineComponents[1].trim();
						
						if(auxhash.containsKey(aux))
						{
							Vector<String> tmp = auxhash.get(aux);
							tmp.add(nextAux);
							auxhash.put(aux,tmp);
						}
						else
						{
							Vector<String> tmp = new Vector<String>();
							tmp.add(nextAux);
							auxhash.put(aux,tmp);
						}
					}
				}
			}
		}
		catch(Exception e)
		{
			System.out.println(e.toString());
			e.printStackTrace();
		}
	}
	
	public Vector<String> getNextVerbs(String verbSuffix)
	{
		Vector<String> retval = new Vector<String>();
		
		retval = vghash.get(verbSuffix);
		
		return(retval);
	}
	
	public Vector<String> getNextAuxVerbs(String rootVerb)
	{
		Vector<String> retval = new Vector<String>();
		
		retval = auxhash.get(rootVerb);
		
		return(retval);
	}
	
	public boolean hasSuffix(String verbSuffix)
	{
		return(vghash.containsKey(verbSuffix.trim()));
	}
	
/*public boolean hasAdverbialSuffix(String adverbSuffix)
	{
		return(adverbialSuffixes.contains(adverbSuffix.trim()));
	}*/
	
	public boolean hasRootVerb(String rootVerb)
	{
		return(auxhash.containsKey(rootVerb.trim()));
	}
	
	
}
