package dataBase.search;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;

import data.bins.Bins.TYPE_BIN_VALUES;

/**
 * A List of data objects.
 * Can be sorted and limited in length.
 * 
 * @author Krisi
 */
public class DataList {
	
	public static int DefaultTolerance=100;
	
	public ArrayList<Data> dataList = new ArrayList<Data>(DefaultTolerance);
	private boolean sortAndLimit;
	private Comparator<Data> comparator = new DistanceComparator();
	public int lengthLimit, tolerance = DefaultTolerance;
	
	/**
	 * Constructor, simple
	 */
	public DataList(){
		this(-1);
	}
	
	/**
	 * @return actual, internal list size. May be above lengthLimit.
	 */
	public int size(){
		return dataList.size();
	}
	
	/**
	 * Constructor, full
	 * @param lengthLimit - sort&limit activated if parameter > 0
	 */
	public DataList(int lengthLimit){
		
		sortAndLimit = lengthLimit>0 && tolerance>0;
		
		this.lengthLimit = lengthLimit;
		//this.tolerance = tolerance;
	}
	
	/**
	 * Change comparator
	 * @param c - new comparator
	 */
	public void setComparator(Comparator<Data> c){
		this.comparator = c;
	}
	
	public void setLimit(int lengthLimit){
		sortAndLimit = lengthLimit>0 && tolerance>0;
		this.lengthLimit = lengthLimit;
	}
	
	/**
	 * Add a single element.
	 * @param data
	 */
	public void add(Data data){
		
		dataList.add(data);
		
		if(sortAndLimit && dataList.size() > lengthLimit+tolerance){
			sort();
			limitSize();
		}
	}
	
//	/**
//	 * @param sorted - true if list should be sorted
//	 */
//	public void setSortAndLimit(boolean sortAndLimit){
//		
//		if(!this.sortAndLimit && sortAndLimit){
//			sort();
//			limitSize();
//		}
//		
//		this.sortAndLimit = sortAndLimit;
//	}
	
	public void sortAndLimit(){
		sort();
		limitSize();
	}
	
	
	/**
	 * Sort List
	 */
	private void sort() {
		Collections.sort(dataList, comparator);
	}
	
	/**
	 * Shorten list to lengthLimit
	 */
	private void limitSize(){
		if(lengthLimit>0 && lengthLimit<=dataList.size())
			//dataList = (ArrayList<Data>) dataList.subList(0, lengthLimit);
		while(dataList.size() > lengthLimit)
			dataList.remove(dataList.size()-1);
	}
	
	/**
	 * 
	 */
	public void relativeValues(){
		for(Data data : dataList){
			data.bins.valueAction(TYPE_BIN_VALUES.relative1);
			//data.bins.valuesRelative1();
		}
	}
	
	public ArrayList<Data> getList(){
		return dataList;
	}
	
}

///**
// * Compare equality of Data objects
// * @author Krisi
// */
//class EqualityComparator implements Comparator<Data> {
//
//	@Override
//	public int compare(Data a, Data b) {
//		
//		if(a.equality > b.equality){
//			return -1;
//		}
//		if(a.equality < b.equality){
//			return 1;
//		}
//		else{
//			return 0;
//		}
//	}
//}