package tools;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;

import authoritymanager.client.Duplicate;


public class DuplicatesSet implements Serializable {
	private String itemType ;
	private int current ;
	private Vector<Duplicate> duplicates ;
	private static HashMap<String, Duplicate> duplicates_cache = new HashMap<String, Duplicate>() ;
	
	public DuplicatesSet(String itemType) {
		this.itemType = itemType ;
		this.current = 0 ;
		this.duplicates = new Vector<Duplicate>() ;
	}
	
	public void addDuplicate(Duplicate duplicate) {
		duplicates.add(duplicate) ;
		addCache(duplicate) ;
	}
	
	public static void addCache(Duplicate duplicate) {
		duplicates_cache.put(duplicate.getWinnerID() + "\t" + duplicate.getLoserID(), duplicate) ;
	}
	
	
	public static boolean isCached(String winnerID, String loserID) {
		return duplicates_cache.containsKey(winnerID + "\t" + loserID) || 
				duplicates_cache.containsKey(loserID + "\t" + winnerID) ;
	}
	
	public Collection<Duplicate> getAll() {
		return duplicates ;
	}
	
	public int size() {
		return duplicates.size() ;
	}
	public Duplicate getNext() {
		if (duplicates.size() > 0) {
			if (current >= duplicates.size()) {
				current = 0 ;
			}
			return duplicates.get(current ++) ;
		}
		else {
			return null ;
		}
	}
	
	public Duplicate getPrev() {
		if (duplicates.size() > 0) {
			if (current <= 0) {
				current = duplicates.size() - 1 ;
			}
			return duplicates.get(current --) ;
		}
		else {
			return null ;
		}
	}
	
	public static DuplicatesSet fromFile(String itemType, String fileName) {
		try {
			DuplicatesSet duplicatesSet = new DuplicatesSet(itemType) ;
			BufferedReader in = new BufferedReader(new FileReader(new File(fileName)));

			String line;
			while ((line = in.readLine()) != null) {
				duplicatesSet.addDuplicate(new Duplicate(line)) ;				
			}	
			return duplicatesSet ;
		}
		catch (IOException e) {
			e.printStackTrace();
			return null ;
		}
	}

	public void toFile(String fileName) {
		try {
			PrintWriter writer = new PrintWriter(fileName) ;
			for (Iterator<Duplicate> itDuplicate = duplicates.iterator() ; itDuplicate.hasNext() ; ) {
				Duplicate duplicate = itDuplicate.next() ;
				writer.println(duplicate.toString()) ;
			}
			writer.flush() ;
			writer.close() ;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}				
	}
	
	public String getType() {
		return this.itemType ;
	}

	public void remove(String winnerID, String loserID) {
		for (Duplicate duplicate: duplicates) {
			if (duplicate.getWinnerID().equals(winnerID)) {
				if (duplicate.getLoserID().equals(loserID)) {
					duplicates.remove(duplicate) ;
					return ;
				}
			} else {
				if (duplicate.getLoserID().equals(winnerID)) {
					if (duplicate.getWinnerID().equals(loserID)) {
						duplicates.remove(duplicate) ;
						return ;
					}
				}
			}
		}
		
	}
}
