package eu.dnetlib.efg.stress.vocabulary;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.List;

import eu.dnetlib.efg.stress.vocabulary.TermFactory.FIELD;

public class QueryGenerator {

	private TermFactory termFactory;
	
	public QueryGenerator() throws IOException {
		termFactory = new TermFactory();
	}
	
	public String nextQuery(int complexity) {
		
		FIELD field = getField();
		
		String query = field.toString() + " any \"";
		
		for (int i = 0; i < complexity; i++) {
			query += termFactory.nextTerm(field) + " ";
		}
		
		return query.trim() + "\"";
	}
	
	public String nextRandomQuery(int maxTerms) {
		return nextQuery(randomNumber(maxTerms));
	}
	
	private int randomNumber(int max) {
		return (int) Math.floor((Math.random() * max)) + 1;
	}

	private FIELD getField() {
		List<FIELD> terms = termFactory.availableTerms();
		
		Collections.shuffle(terms);
		
		return terms.iterator().next();
	}
	
	public static void main(final String[] args) throws Exception {
		QueryGenerator qGen = new QueryGenerator();
		
		int nQueries = Integer.parseInt(args[0]);
		int complexity = Integer.parseInt(args[1]);
		boolean encode = Boolean.parseBoolean(args[2]);
		
		if (encode)		
			for (int i = 0; i < nQueries; i++)
				System.out.println(URLEncoder.encode(qGen.nextQuery(complexity), "UTF-8"));
		else
			for (int i = 0; i < nQueries; i++)
				System.out.println(qGen.nextQuery(complexity));
	}
}
