package tools;

import authoritymanager.client.DataPair;
import java.io.BufferedReader;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

import com.wcohen.ss.*;

import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.classifiers.bayes.NaiveBayes;
import weka.classifiers.functions.SMO;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;

public class TestModule {
	//private static String PATH = "/var/lib/tomcat6/webapps/ROOT/data/" ;
	public static Authority createAuthority(String PATH, String configurationFile, String baseFileName, int numberOfFiles) {
		long curTime;
		/*
		try {
			PrintWriter f = new PrintWriter(PATH + "test.txt");
			f.println("Test") ;
			f.flush() ;
			f.close() ;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		*/
		File f ;
		
		curTime = System.currentTimeMillis();
		Configuration configuration = new Configuration(configurationFile);
		configuration.compile();
		Authority authority = new Authority(configuration);

		long initTime = System.currentTimeMillis();
		curTime = System.currentTimeMillis();		
		for (int i = 0; i < numberOfFiles; i++) {
			System.out.println(i + "/" + numberOfFiles);
			// authority.createFromFileXPATH("./dif/dif_fw" + formatNumber(i) + ".xml") ;
			authority.createFromFile(PATH + baseFileName + formatNumber(i) + ".xml");
			System.out.println(" " + 1.000 * (System.currentTimeMillis() - curTime) + "ms");
			curTime = System.currentTimeMillis();
		}
		System.out.println("Total time reading " + 1.000 * (System.currentTimeMillis() - initTime) + "ms");
		return authority ;
	}
	public static Authority createAuthority(String PATH, String configurationFile) {
		return new Authority(PATH + "/" + configurationFile) ;
	}
	public static void main(String[] argv) {
		try {
			//Authority authorityPersons = createAuthority("", "DIF-persons.conf", "./exp/dif-agent-p-", 326) ;
			Authority authority = new Authority("./data/EFG-movies.conf") ;
			//Authority authority = new Authority("./data/EFG-persons.conf") ;
			//Authority authorityMovies = createAuthority("DIF-movies.conf", "./dif/dif_fw", 486) ;
			//Authority authority = new Authority("./data/EFG-corporate.conf") ;
			authority.writeToFile("records.txt") ;
			System.out.println("Length: " + authority.getAllData().length) ;
			
			//Collection<Field> fields = authority.configuration.getField().values();
			//Collection<Field> fieldsMovies = authorityPersons.configuration.fields.values();

			//PrintWriter resultsMovies = new PrintWriter(new File("movies-duplicates.txt"));
			PrintWriter fout = new PrintWriter(new File("duplicates.txt"));
			
			Vector<DataPair> duplicates = authority.findDuplicates();			
			System.out.println("Duplicates found: " + duplicates.size()) ;			
			for (Iterator<DataPair> it = duplicates.iterator(); it.hasNext();) {
				DataPair pair = it.next();
				fout.println(pair);
			}
			fout.close() ;
			if (1 == 1) return ;
			Vector<DataPair> duplicatePersons = authority.findDuplicates();
			System.out.println("Duplicate persons found: " + duplicatePersons.size()) ;			
			for (Iterator<DataPair> it = duplicatePersons.iterator(); it.hasNext();) {
				DataPair pair = it.next();
				fout.println(pair);
			}
			fout.close() ;
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main2(String[] argv) {
		com.wcohen.ss.Jaro jaro = new com.wcohen.ss.Jaro();
		Jaccard jaccard = new Jaccard();
		JaroWinkler jarowinkler = new JaroWinkler();
		Levenstein levenstein = new Levenstein();
		ScaledLevenstein scaledLevenstein = new ScaledLevenstein();
		SoftTFIDF tfidfl = new SoftTFIDF(levenstein);
		SoftTFIDF tfidfj = new SoftTFIDF(jaro);
		TFIDF tfidf = new TFIDF();
		JaroWinklerDistance jarow = new JaroWinklerDistance();

		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		try {
			String a = "a", b = "b";
			while (!a.equals("quit")) {
				System.out.print("First string: ");
				a = in.readLine();
				System.out.print("Second string: ");
				b = in.readLine();
				System.out.println("jaro(" + a + ", " + b + ") = "
						+ jaro.score(a, b));
				System.out.println("jarow(" + a + ", " + b + ") = "
						+ jarow.getDistance(a, b));
				System.out.println("Explainscore: " + jaro.explainScore(a, b));
				System.out.println("jaro(" + a + ", " + b + ") = "
						+ jaro.score(a, b));
				System.out.println("jaccard(" + a + ", " + b + ") = "
						+ jaccard.score(a, b));
				System.out.println("jarowinkler(" + a + ", " + b + ") = "
						+ jarowinkler.score(a, b));
				System.out.println("levenstein(" + a + ", " + b + ") = "
						+ levenstein.score(a, b));
				System.out.println("scaledLevenstein(" + a + ", " + b + ") = "
						+ scaledLevenstein.score(a, b));
				System.out.println("tfidfl(" + a + ", " + b + ") = "
						+ tfidfl.score(a, b));
				System.out.println("tfidfj(" + a + ", " + b + ") = "
						+ tfidfj.score(a, b));
				System.out.println("tfidf(" + a + ", " + b + ") = "
						+ tfidf.score(a, b));
				System.out.println("year(" + a + ", " + b + ") = "
						+ CompareUtilities.YearDistance(a, b));
			}
			System.out.println("FINISHED!");
		} catch (IOException e) {
			System.out.println("Exception: " + e);
		}
	}

	private static String formatNumber(int num) {
		if (num < 10)
			return "000" + num;
		if (num < 100)
			return "00" + num;
		if (num < 1000)
			return "0" + num;
		return "" + num;
	}

}
