/*
 * 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.Calendar;
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.Shift;
import com.planimod.core.TimeRange;

public class ShiftComparators {

	/**
	 * Compare calendar event by hours (and not date).
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static Comparator<Shift> byHourAndTeam() {
		ComparatorChain chain = new ComparatorChain();

		chain.addComparator(ComparatorUtils.transformedComparator(
				ComparatorUtils.nullLowComparator(ComparatorUtils
						.naturalComparator()), new Transformer() {
					@Override
					public Object transform(Object input) {
						Calendar cal = Calendar.getInstance();
						cal.setTime(((TimeRange) input).getStartDate());
						return Integer.valueOf(cal.get(Calendar.HOUR_OF_DAY));
					}
				}));
	
		chain.addComparator(ComparatorUtils.transformedComparator(
				ComparatorUtils.nullLowComparator(ComparatorUtils
						.naturalComparator()), new Transformer() {
					@Override
					public Object transform(Object input) {
						Calendar cal = Calendar.getInstance();
						cal.setTime(((TimeRange) input).getStartDate());
						return Integer.valueOf(cal.get(Calendar.MINUTE));
					}
				}));

		chain.addComparator(ComparatorUtils.transformedComparator(
				TeamComparators.byName(), new Transformer() {
					@Override
					public Object transform(Object input) {
						return ((Shift) input).getTeam();
					}
				}));

		return chain;
	}

}
