/*
 * Copyright (c) 2011, Patrik Dufresne. All rights reserved.
 * Patrik Dufresne PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
package com.planimod.core.comparators;

import java.util.Comparator;

import org.apache.commons.collections.ComparatorUtils;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.comparators.ComparatorChain;

import com.planimod.core.AbstractCalendarEvent;
import com.planimod.core.NonAvailability;

public class NonAvailabilityComparators {

	/**
	 * Private constructor for utility class.
	 */
	private NonAvailabilityComparators() {

	}

	/**
	 * Create a new comparator.
	 * 
	 * @return
	 */
	public static Comparator<NonAvailability> byDateAndEmployeeName() {

		ComparatorChain chain = new ComparatorChain();

		chain.addComparator(ComparatorUtils.nullHighComparator(ComparatorUtils
				.transformedComparator(
						ComparatorUtils.nullLowComparator(ComparatorUtils
								.naturalComparator()), new Transformer() {
							@Override
							public Object transform(Object arg0) {
								return ((AbstractCalendarEvent) arg0)
										.getStartDate();
							}
						})));

		chain.addComparator(ComparatorUtils.nullHighComparator(ComparatorUtils
				.transformedComparator(ComparatorUtils
						.nullLowComparator(EmployeeComparators.byName()),
						new Transformer() {
							@Override
							public Object transform(Object arg0) {
								return ((NonAvailability) arg0).getEmployee();
							}
						})));

		return chain;
	}

	/**
	 * Compare Non-Availability by employee's name.
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static Comparator<? super NonAvailability> byEmployeeName() {

		return ComparatorUtils.nullHighComparator(ComparatorUtils
				.transformedComparator(EmployeeComparators.byName(),
						new Transformer() {
							@Override
							public Object transform(Object input) {
								return ((NonAvailability) input).getEmployee();
							}
						}));

	}
}
