package dmstemmer;
import java.io.*;
import java.util.*;
import lexicon.*;
import base.*;

public class NewStemmer {
	LexReader lr;// = new LexReader();
	LexRuleReader lrr;// = new LexRuleReader();
	public NewStemmer() {
		// TODO Auto-generated constructor stub
		lr = new LexReader();
		lrr = new LexRuleReader();
	}
	public StemmedToken stem(String token){
		StemmedToken retVal = new StemmedToken(token);
		Vector<StemmedResult> stemmedOutputs = new Vector<StemmedResult>();		
		//Set<String> suffixes = lrr.suffixRuleNNHash.keySet();
		//Iterator<String> suffixIter = suffixes.iterator();
		String stem;
		//while(suffixIter.hasNext()){
		for(int suffixIter=0; suffixIter<lrr.suffixes.size(); suffixIter++){
			//String suffix = suffixIter.next().trim();
			//System.out.println("Suffix is " + suffix);
			String suffix = lrr.suffixes.get(suffixIter);
			/*for(int catIter=0; catIter<lr.categories.size(); catIter++){
				String category = lr.categories.get(catIter);
				if(category.equals("noun")){*/		
				
				if(suffix.equals("Null")){
					//System.out.println("Here it is");
					stem = token;
				}
				else if(token.endsWith(suffix)){
					stem = token.replaceAll(suffix+"$", "");				
				}
				else{
					continue;
				}
				//if(lr.checkInLex(stem)){
//				 FOR NOUNS //	check if noun exists.
				Vector<Lex> lexVector = lr.getLexResults(stem,"noun");
					//System.out.println("I am in with : " + lexVector.size());
					//check for constraints
				Vector<NNSuffixRule> srv = lrr.suffixRuleNNHash.get(suffix);
				if(lexVector != null && !lexVector.isEmpty() && srv != null && !srv.isEmpty()){
					for(int lv = 0; lv<lexVector.size(); lv++){
						Lex lex = lexVector.get(lv);
						for(int s=0; s<srv.size(); s++){
							NNSuffixRule sr = srv.get(s);
							/*lex.getFeatures().print();
							sr.getFeatures().print();*/
							boolean chk = lex.getFeatures().isEqual(sr.getFeatures());
							if(chk){
								StemmedResult str = new StemmedResult(stem,lex.getFeatures(),sr.getMorphAnalysis(),suffix,"noun");
								stemmedOutputs.add(str);
							}
							else if(suffix.equals("Null")){
								StemmedResult str = new StemmedResult(stem,lex.getFeatures(),"",suffix,"noun");
								stemmedOutputs.add(str);
							}
						}
					}
				//}
				//else{
					if(lrr.reAdjustmentRuleNNHash.containsKey(suffix)){
						Vector<NNReadjustmentRule> rrv = lrr.reAdjustmentRuleNNHash.get(suffix);
						for(int r=0; r<rrv.size(); r++){
							NNReadjustmentRule rr = rrv.get(r);
							//System.out.println("Stem : " + stem + ", suffix to delete : " + rr.getSuffixToDelete());
							String tempStem = stem.replaceAll(rr.getSuffixToDelete()+"$", "");
							//System.out.println("Stem : " + tempStem);
							tempStem = tempStem + rr.getSuffixToAdd();
							//System.out.println("Stem : " + tempStem);
							if(lr.checkInLex(tempStem)){
								
								//Vector<Lex> lexVector = lr.getLexResults(tempStem);
								lexVector = lr.getLexResults(tempStem,"noun");
								//check for constraints
								//System.out.println("lex result size : " + lexVector.size());
								if(lexVector != null && !lexVector.isEmpty()){
									for(int lv = 0; lv<lexVector.size(); lv++){
										Lex lex = lexVector.get(lv);
										boolean chk = lex.getFeatures().isEqual(rr.getFeatures());
										if(chk){	
											String morphAnalysis = "";
											for(int s=0; s<srv.size(); s++){
												NNSuffixRule sr = srv.get(s);										
												chk = sr.getFeatures().isEqual(rr.getFeatures());
												if(chk){
													morphAnalysis = sr.getMorphAnalysis();
												}
											}
											StemmedResult str = new StemmedResult(tempStem,lex.getFeatures(),morphAnalysis,suffix,"noun");//suffix,lex.getFeatures());
											stemmedOutputs.add(str);
										}							
									}
								}
							}
						}					
					//}
					}
				}
					// FOR ADJECTIVES //
					if(lrr.adjRuleHash.containsKey(suffix)){
						Vector<AdjRule> adjRules = lrr.adjRuleHash.get(suffix);
						if(adjRules != null && !adjRules.isEmpty()){
							for(int r=0; r<adjRules.size(); r++){
								
								AdjRule adjRule = adjRules.get(r);
								String tempStem = token.replaceAll(adjRule.getSuffixToDelete()+"$", "");
								tempStem = tempStem + adjRule.getSuffixToAdd();
								if(lr.checkInLex(tempStem)){							
									lexVector = lr.getLexResults(tempStem,"adjective");
									if(lexVector != null && !lexVector.isEmpty()){
										for(int lv = 0; lv<lexVector.size(); lv++){
											Lex lex = lexVector.get(lv);
											boolean chk = lex.getFeatures().getClas() == adjRule.getClas();
											if(chk){	
												String morphAnalysis = adjRule.getMorphAnalysis();
												String parts[] = morphAnalysis.split(":");
												if(parts[0].startsWith("[")){
													parts[0] = parts[0].replaceAll("^\\[", "");
												}
												if(parts[1].endsWith("]")){
													parts[1] = parts[1].replaceAll("\\]"+"$", "");
												}
												char gender;
												if(parts[0].trim().startsWith("+")){
													gender = 'M';
												}
												else{
													gender = 'F';
												}
												morphAnalysis = "< " + parts[1].trim() + " >"; 
												
												StemmedResult str = new StemmedResult(tempStem,lex.getFeatures(),morphAnalysis,suffix,"adjective");//suffix,lex.getFeatures());
												str.setGender(gender);
												stemmedOutputs.add(str);
											}							
										}
									}
								}
							}
						}
					}
				}
			//else if(category.equals("adjective")){
				
			//}
		//}
			/*Vector<NNSuffixRule> srv = lrr.suffixRuleNNHash.get(suffix);
			if(suffix.equals("Null")){
				//System.out.println("Here it is");
				stem = token;
			}
			else if(token.endsWith(suffix)){
				stem = token.replaceAll(suffix+"$", "");				
			}
			else{
				continue;
			}
			//if(lr.checkInLex(stem)){
			
				Vector<Lex> lexVector = lr.getLexResults(stem);
				//System.out.println("I am in with : " + lexVector.size());
				//check for constraints
				for(int lv = 0; lv<lexVector.size(); lv++){
					Lex lex = lexVector.get(lv);
					for(int s=0; s<srv.size(); s++){
						NNSuffixRule sr = srv.get(s);
						lex.getFeatures().print();
						sr.getFeatures().print();
						boolean chk = lex.getFeatures().isEqual(sr.getFeatures());
						if(chk){
							StemmedResult str = new StemmedResult(stem,lex.getFeatures(),sr.getMorphAnalysis(),suffix);
							stemmedOutputs.add(str);
						}
						else if(suffix.equals("Null")){
							StemmedResult str = new StemmedResult(stem,lex.getFeatures(),suffix);
							stemmedOutputs.add(str);
						}
					}
				}
			//}
			//else{
				if(lrr.reAdjustmentRuleNNHash.containsKey(suffix)){
					Vector<NNReadjustmentRule> rrv = lrr.reAdjustmentRuleNNHash.get(suffix);
					for(int r=0; r<rrv.size(); r++){
						NNReadjustmentRule rr = rrv.get(r);
						//System.out.println("Stem : " + stem + ", suffix to delete : " + rr.getSuffixToDelete());
						String tempStem = stem.replaceAll(rr.getSuffixToDelete()+"$", "");
						//System.out.println("Stem : " + tempStem);
						tempStem = tempStem + rr.getSuffixToAdd();
						//System.out.println("Stem : " + tempStem);
						if(lr.checkInLex(tempStem)){
							
							//Vector<Lex> lexVector = lr.getLexResults(tempStem);
							lexVector = lr.getLexResults(tempStem);
							//check for constraints
							//System.out.println("lex result size : " + lexVector.size());
							for(int lv = 0; lv<lexVector.size(); lv++){
								Lex lex = lexVector.get(lv);
								boolean chk = lex.getFeatures().isEqual(rr.getFeatures());
								if(chk){	
									String morphAnalysis = "";
									for(int s=0; s<srv.size(); s++){
										NNSuffixRule sr = srv.get(s);										
										chk = sr.getFeatures().isEqual(rr.getFeatures());
										if(chk){
											morphAnalysis = sr.getMorphAnalysis();
										}
									}
									StemmedResult str = new StemmedResult(tempStem,lex.getFeatures(),morphAnalysis,suffix);//suffix,lex.getFeatures());
									stemmedOutputs.add(str);
								}							
							}
						}
					}					
				//}
			}*/
		//}
		retVal.addAllStemmerOutputs(stemmedOutputs);
		return retVal;
	}
	
	public static void main(String args[]){
		System.out.println("Starting..");
		ConfigReader.read(args[0]);
		NewStemmer stemmer = new NewStemmer();
		String sentence = "माँ को अपने बेटे और किसान को अपने लहलहाते खेत देखकर जो आनंद आता है, वही आनंद बाबा भारती को अपना घोड़ा";//लड़का लड़कियाँ लड़के जीतना";
		sentence = "शहरों बच्चों धमाके";//अंधेरा";//अंगूरी";//छापे ";//नालों";//दौरे";//;
		String words[] = sentence.split(" ");
		StemmedToken st; 
		for(int i =0; i<words.length; i++){
			String word = words[i].trim(); 
			if(words[i].equals("") || words.equals(" ")){
				continue;
			}
			st = stemmer.stem(word);
			st.print();
		}
		
	}
	
	
}
