package l42;

import java.util.Arrays;
import java.util.Comparator;

public class TestCar {

	public static void main(String[] args) {
		Car[] cars = new Car[5]; // Top five cars
		cars[0]=new Car("Aston Martin","DB5",1964,new FullName("James","","Bond"));
		cars[1]=new Car("George Barris","BatMobile", 1963,new FullName("Bruce","","Wayne"));
		cars[2]=new Car("Rolls Royce","Phantom V",1965,new FullName("John","Winston","Lennon") );
		cars[3]=new Car("Mercedes Benz","300SL Gullwing",1955,new FullName("Clark","","Gable"));
		cars[4]=new Car("Deusenberg","Model J",1931,new FullName("Phil","","Berg"));
		
		System.out.println("Top Five Cars:");
		printCars(cars);
		
		Car[] origCars = cars.clone();
		
		Arrays.sort(cars,new CompareByYear());
		System.out.println("\nSorted by year");
		printCars(cars);
		
		Arrays.sort(cars,new CompareByMake());
		System.out.println("\nSorted by make/model");
		printCars(cars);
		
		// Inner class
		TestCar testCar = new TestCar();
		Arrays.sort(cars, testCar.new CompareByModel());
		System.out.println("\nSorted by model");
		printCars(cars);
						
		// Anonymous inner class with named instance
		Comparator<Car> compareByLastName = new Comparator<Car>() {
			@Override
			public int compare(Car o1, Car o2) {
				return o1.owner.last.compareTo(o2.owner.last);
			}
		};
		Arrays.sort(cars, compareByLastName);
		System.out.println("\nSorted by last name");
		printCars(cars);
		
	
		// Anonymous inner class without instance name
		Arrays.sort(cars,new Comparator<Car>() {
			@Override
			public int compare(Car o1, Car o2) {
				return o1.owner.first.compareTo(o2.owner.first);
			}
		});
		System.out.println("\nSorted by first name");
		printCars(cars);
	 	
		// Lambda Expression
		Arrays.sort(cars,(c1,c2)->c1.year-c2.year);
		System.out.println("\nSorted by year (again)");
		printCars(cars);
		
		System.out.println("\nOriginal order:");
		printCars(origCars);
				
	}
	
	private static void printCars(Car[] cars) {
		for(int i=0;i<cars.length;i++) {
			System.out.println("" + (i+1) + " : " + cars[i]);			
		}
	}

	// Example of a Named Inner Class 
	public class CompareByModel implements Comparator<Car> {
		@Override
		public int compare(Car o1, Car o2) {
			return o1.model.compareTo(o2.model);
		}

	}
}

// Example of a two-class .java file
class CompareByMake implements Comparator<Car> {
	@Override
	public int compare(Car o1, Car o2) {
		if (o1.make.equals(o2.make)) {
			return o1.model.compareTo(o2.model);
		}
		return o1.make.compareTo(o2.make);
	}

}
