import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

public class Sorting
{
    public static final void main(String[] args)
    {
        if (args.length != 1)
        {
            System.out.println("Usage: java Sorting <name of data file>");
            return;
        }

        String fileName = args[0];

        int[] array = null;
        long startTimeNanos = -1;
        long endTimeNanos = -1;

        // insertion sort
        array = loadFileIntoArray(fileName);
        startTimeNanos = System.nanoTime();
        array = InsertionSort.sort(array);
        endTimeNanos = System.nanoTime();
        printResults(startTimeNanos, endTimeNanos, array, "Insertion Sort");

        // selection sort
        array = loadFileIntoArray(fileName);
        startTimeNanos = System.nanoTime();
        array = SelectionSort.sort(array);
        endTimeNanos = System.nanoTime();
        printResults(startTimeNanos, endTimeNanos, array, "Selection Sort");

        // bubble sort
        array = loadFileIntoArray(fileName);
        startTimeNanos = System.nanoTime();
        array = BubbleSort.sort(array);
        endTimeNanos = System.nanoTime();
        printResults(startTimeNanos, endTimeNanos, array, "Bubble Sort");
        
        // merge sort
        array = loadFileIntoArray(fileName);
        startTimeNanos = System.nanoTime();
        array = MergeSort.sort(array);
        endTimeNanos = System.nanoTime();
        printResults(startTimeNanos, endTimeNanos, array, "Merge Sort");
    }

    public static void printResults(
        long startTime,
        long endTime,
        int[] sortedArray,
        String sortName)
    {
        long totalTime = (endTime - startTime) / 1000000;

        System.out.println(sortName + " ******************");
        System.out.println(
            "Total time in milliseconds = " + totalTime
            );
        System.out.println("Contents:");
        for (int i = 0; i < sortedArray.length; i ++)
        {
            System.out.println(sortedArray[i]);
        }
        System.out.println("");
    }

    /**
     * Loads the file fileName into an integer array
     */
    public static int[] loadFileIntoArray(String fileName)
    {
        // we don't care about exceptions, so just consume it
        Scanner scanner = null;
        try
        {
            scanner = new Scanner(new File(fileName));
        }
        catch (FileNotFoundException ex)
        {
            ex.printStackTrace();
        }
        
        // First get the number of lines in the file, which is the first line
        int size = Integer.parseInt(scanner.nextLine());

        // Now we can initialize the array
        int[] a = new int[size];

        // And read in the rest of the data
        int counter = 0;
        while (scanner.hasNext())
        {
            a[counter] = Integer.parseInt(scanner.nextLine());
            counter ++;
        }

        return a;
    }
}

