import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
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 SyntacticFeatureCounter {
	public static void main(String[] args) throws Exception {
		int numberOfAdjectives = 0;
		int numberOfAdverbs = 0;
		int numberOfAdverbsModifyVerb = 0;
		int numberOfCardinals = 0;
		int numberOfDegreeAdjectives = 0;
		int numberOfDegreeAdverbs = 0;

		boolean adverbFound = false;

		File file = new File(System.getProperty("user.dir") + "/Processed/ProcessedF.txt");
		FileReader fr = new FileReader(file);
		BufferedReader br = new BufferedReader(fr);

		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();

			// Counting der Syntactic Features
			for (TaggedWord taggedWord : words) {
				String tag = taggedWord.tag();

				if (adverbFound == true) {
					adverbFound = false;
					if (tag.equalsIgnoreCase("JJ") == false && tag.equalsIgnoreCase("RB") == false) {
						numberOfAdverbsModifyVerb++;
					}
				}

				if (tag.equalsIgnoreCase("CD")) {
					numberOfCardinals++;
				} else if (tag.equalsIgnoreCase("JJ")) {
					numberOfAdjectives++;
				} else if (tag.equalsIgnoreCase("RB")) {
					numberOfAdverbs++;
					adverbFound = true;
				} else if (tag.equalsIgnoreCase("JJR") || tag.equalsIgnoreCase("JJS")) {
					numberOfDegreeAdjectives++;
				} else if (tag.equalsIgnoreCase("RBR") || tag.equalsIgnoreCase("RBS")) {
					numberOfDegreeAdverbs++;
				}
			}
			
		}
		System.out.println("number of adjectives: " + numberOfAdjectives);
		System.out.println("number of adverbs: " + numberOfAdverbs);
		System.out.println("number of adverbs modify verbs: " + numberOfAdverbsModifyVerb);
		System.out.println("number of cardinals: " + numberOfCardinals);
		System.out.println("number of degree adjectives: " + numberOfDegreeAdjectives);
		System.out.println("number of degree adverbs: " + numberOfDegreeAdverbs);

		br.close();
		// Main.writeImage(tree,tdl, "image.png",3);
	}
}