package sorters;

abstract public class Sorter {
	private AnimationThread messenger;
	
	public Sorter() {
		messenger = null;
	}
	
	public void setMessenger(AnimationThread msgr) {
		this.messenger = msgr;
	}
	
	abstract public void sort(int[] array, int minIndex, int maxIndex);
	
	public void sort(int[] array) {
		sort(array, 0, array.length - 1);
	}

	public void assign(int[] array, int i, int value) {
		array[i] = value;
		if (messenger != null) {
			messenger.sendUpdate(new Update(i, value));
		}
	}

	public void swap(int[] array, int i, int j) {
		int temp = array[i];
		assign(array, i, array[j]);
		assign(array, j, temp);
	}
	
	public static void scramble(int[] array) {
		for (int i = 0; i < array.length - 1; ++i) {
			int target = (int)(Math.random() * (array.length - i) + i);
			int temp = array[i];
			array[i] = array[target];
			array[target] = temp;
		}
	}
	
	public static boolean isSorted(int[] array) {
		for (int i = 0; i < array.length - 1; ++i) {
			if (array[i] > array[i+1]) {
				return false;
			}
		}
		return true;
	}
	
	public static void test(Sorter sorter) {
		int[] nums = new int[1000];
		for (int i = 0; i < nums.length; ++i) {
			nums[i] = i;
		}
		
		Sorter.scramble(nums);
		System.out.println("initial: ");
		for (Integer i: nums) {System.out.print(i + " ");}
		System.out.println();
		
		sorter.sort(nums);
		if (isSorted(nums)) {
			System.out.println("Sort successful");
		} else {
			System.out.println("Sort flawed");
			for (Integer i: nums) {
				System.out.print(i + " ");
			}
			System.out.println();
		}
	}
}
