import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.ling.TaggedWord;
import edu.stanford.nlp.parser.lexparser.LexicalizedParser;
import edu.stanford.nlp.process.CoreLabelTokenFactory;
import edu.stanford.nlp.process.PTBTokenizer;
import edu.stanford.nlp.process.TokenizerFactory;
import edu.stanford.nlp.trees.GrammaticalStructure;
import edu.stanford.nlp.trees.GrammaticalStructureFactory;
import edu.stanford.nlp.trees.PennTreebankLanguagePack;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.trees.TreebankLanguagePack;
import edu.stanford.nlp.trees.TypedDependency;

class WekaInputCounterProcessed {
	public static void main(String[] args) throws Exception {
		String[] jj_kws = { "easy", "simultaneous", "authorized", "unauthorized", "empty", "fast", "standard",
				"consistent", "independent", "first", "same" };
		String[] rb_kws = { "fast", "easily", "only", "once", "as", "easy", "enough", "naturally", "prior", "currently",
				"long", "regularly", "un" };
		String[] md_kws = { "should", "may" };
		String[] dt_kws = { "every" };
		String[] vb_kws = { "operate", "perform", "match", "scale", "access", "use", "meet", "ensure", "let",
				"tolerate", "help", "advertise", "avoid", "enable", "find", "protect", "report", "reveal", "support",
				"adhere", "navigate", "need", "reduce", "require", "run", "scaling" };
		String[] in_kws = { "without", "with", "during", "after", "above", "per", "between" };
		String[] nn_kws = { "appearance", "environment", "%", "authorization", "support", "failure", "training",
				"software", "internet", "role", "computer", "navigation", "target", "un", "connection",
				"implementation", "language", "market", "minimum", "access", "budgeting", "click", "intranet",
				"machine", "maintenance", "survey", "update", "product" };
		String[] nns_kws = { "alltimes", "users", "messages", "regulations", "standards", "reports", "environments",
				"files", "years", "minutes", "preferences", "releases", "slots", "systems", "weeks", "additions",
				"authorizations", "buttons", "databases", "instructions", "pages", "problems", "symbols", "tasks",
				"words", "updates" };

		int numberOfCardinals = 0;
		int numberOfAdverbs = 0;
		int numberOfJJ_KW = 0;
		int numberOfRB_KW = 0;
		int numberOfMD_KW = 0;
		int numberOfDT_KW = 0;
		int numberOfVB_KW = 0;
		int numberOfIN_KW = 0;
		int numberOfNN_KW = 0;
		int numberOfNNS_KW = 0;

		File file = new File(System.getProperty("user.dir") + "/Processed/ProcessedALL.txt");
		FileReader fr = new FileReader(file);
		BufferedReader br = new BufferedReader(fr);
		FileWriter wr = new FileWriter("WekaInputFinal13.txt");

		wr.write("CD,RB,JJ_KW,RB_KW,MD_KW,DT_KW,VB_KW,IN_KW,NN_KW,NNS_KW\n");
		wr.flush();

		String text = "";
		int i = 0;
		while ((text = br.readLine()) != null) {
			i++;
			System.out.println(i);

			TreebankLanguagePack tlp = new PennTreebankLanguagePack();
			GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
			LexicalizedParser lp = LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz");
			lp.setOptionFlags(new String[] { "-maxLength", "500", "-retainTmpSubcategories" });
			TokenizerFactory<CoreLabel> tokenizerFactory = PTBTokenizer.factory(new CoreLabelTokenFactory(), "");
			List<CoreLabel> wordList = tokenizerFactory.getTokenizer(new StringReader(text)).tokenize();
			Tree tree = lp.apply(wordList);
			GrammaticalStructure gs = gsf.newGrammaticalStructure(tree);
			Collection<TypedDependency> tdl = gs.typedDependenciesCCprocessed(true);

			ArrayList<TaggedWord> words = tree.taggedYield();

			numberOfCardinals = 0;
			numberOfAdverbs = 0;
			numberOfJJ_KW = 0;
			numberOfRB_KW = 0;
			numberOfMD_KW = 0;
			numberOfDT_KW = 0;
			numberOfVB_KW = 0;
			numberOfIN_KW = 0;
			numberOfNN_KW = 0;
			numberOfNNS_KW = 0;
			// Counting der Syntactic Features
			for (TaggedWord taggedWord : words) {
				String tag = taggedWord.tag();
				String word = taggedWord.word();

				switch (tag) {
				case "JJ":
					for (String keyword : jj_kws) {
						if (word.equalsIgnoreCase(keyword)) {
							numberOfJJ_KW++;
						}
					}
					break;
				case "RB":
					for (String keyword : rb_kws) {
						if (word.equalsIgnoreCase(keyword)) {
							numberOfRB_KW++;
							numberOfAdverbs++;
						}
					}
					break;
				case "MD":
					for (String keyword : md_kws) {
						if (word.equalsIgnoreCase(keyword)) {
							numberOfMD_KW++;
						}
					}
					break;
				case "DT":
					for (String keyword : dt_kws) {
						if (word.equalsIgnoreCase(keyword)) {
							numberOfDT_KW++;
						}
					}
					break;
				case "VB":
					for (String keyword : vb_kws) {
						if (word.equalsIgnoreCase(keyword)) {
							numberOfVB_KW++;
						}
					}
					break;
				case "IN":
					for (String keyword : in_kws) {
						if (word.equalsIgnoreCase(keyword)) {
							numberOfIN_KW++;
						}
					}
					break;
				case "NN":
					for (String keyword : nn_kws) {
						if (word.equalsIgnoreCase(keyword)) {
							numberOfNN_KW++;
						}
					}
					break;
				case "NNS":
					for (String keyword : nns_kws) {
						if (word.equalsIgnoreCase(keyword)) {
							numberOfNNS_KW++;
						}
					}
					break;
				case "CD":
					numberOfCardinals++;
					break;
				}
			}

			wr.write(numberOfCardinals + "," + numberOfAdverbs + "," + numberOfJJ_KW + "," + numberOfRB_KW + ","
					+ numberOfMD_KW + "," + numberOfDT_KW + "," + numberOfVB_KW + "," + numberOfIN_KW + ","
					+ numberOfNN_KW + "," + numberOfNNS_KW + "\n");
			wr.flush();

		}

		br.close();
		wr.close();
	}
}