import java.io.BufferedReader;
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 WekaInputCounterUnprocessed {
	public static void main(String[] args) throws Exception {
		String[] jj_kws = { "only", "easy", "malicious", "maximum", "simultaneous", "acceptable", "capable", "empty",
				"fast", "incorrect", "standard", "understandable", "corporate", "appropriate", "concurrent",
				"consistent", "dependent", "established", "independent"};/*, "authorized", "first", "same" };*/
		String[] rb_kws = { "successfully", "no", "longer", "once", "only", "easily", "as", "enough", "later",
				"naturally", "prior" };
		String[] md_kws = { "should", "may" };
		String[] dt_kws = { "every", "no"};/*, "this" };*/
		String[] vb_kws = { "interface", "operate", "access", "comply", "ensure", "let", "complete", "use", "handle",
				"run", "simulate", "support", "take", "achieve", "advertise", "avoid", "conform", "find", "help",
				"integrate", "learn", "meet", "process" };
		String[] in_kws = { "per", "under", "without", "than", "with", "between", "during", "after", "while"};/*,
				"within" };*/
		String[] nn_kws = { "%", "server", "management", "training", "application", "software", "support", "market",
				"role", "target", "computer", "internet", "maintenance", "environment", "language", "minimum",
				"navigation", "survey", "team", "cardmember", "connection", "organization", "website", "page",
				"business"};/*, "basis", "budgeting", "feel", "hour", "identity", "implementation", "league", "machine",
				"maximum", "message", "processing", "scheduling", "sound", "technology", "usability"};/*, "response",
				"year", "appearance", "availability", "browser", "budget", "change", "click", "compliance", "exception",
				"fault", "file", "flow", "hardware", "insurance", "integrity", "intranet", "launch", "load", "network",
				"password", "policy", "resource", "screen", "second", "supervisor", "database", "access" };*/
		String[] nns_kws = { "seconds", "minutes", "supervisors", "standards", "systems", "callers", "messages",
				"pages", "reports", "years", "files", "releases", "days", "hours", "databases", "preferences",
				"problems", "servers", "services", "slots", "tasks", "weeks"};/*, "additions", "browsers", "buttons",
				"countries", "instructions", "logons", "queries", "realtors", "representatives", "symbols", "words",
				"users" };*/

		int numberOfCardinals = 0;
		int numberOfDegreeAdjAdv = 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;

		FileReader fr = new FileReader("requirements - All.txt");
		BufferedReader br = new BufferedReader(fr);
		FileWriter wr = new FileWriter("WekaInputFinal.txt");

		wr.write("CD,JJR_JJS_RBR_RBS,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;
			numberOfDegreeAdjAdv = 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++;
						}
					}
					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;
				case "JJR":
				case "JJS":
				case "RBR":
				case "RBS":
					numberOfDegreeAdjAdv++;
					break;
				}
			}

			wr.write(numberOfCardinals + "," + numberOfDegreeAdjAdv + "," + numberOfJJ_KW + "," + numberOfRB_KW + ","
					+ numberOfMD_KW + "," + numberOfDT_KW + "," + numberOfVB_KW + "," + numberOfIN_KW + ","
					+ numberOfNN_KW + "," + numberOfNNS_KW + "\n");
			wr.flush();

		}

		br.close();
		wr.close();
	}
}