/*
 * 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.Product;

/**
 * Utility class used to create comparator for {@link Product} objects.
 * 
 * @author Patrik Dufresne
 * 
 */
public class ProductComparators {
	/**
	 * Create a comparator to sort Product by name
	 * 
	 * @return the comparator
	 */
	public static Comparator<Product> byName() {
		return ComparatorUtils.transformedComparator(ComparatorUtils
				.nullLowComparator(ComparatorUtils.naturalComparator()),
				new Transformer() {
					@Override
					public Object transform(Object arg0) {
						return ((Product) arg0).getName();
					}
				});
	}

	public static Comparator<? super Product> byRefIdFamilyName() {
		ComparatorChain chain = new ComparatorChain();

		chain.addComparator(ComparatorUtils.nullHighComparator(ComparatorUtils
				.transformedComparator(ComparatorUtils
						.nullHighComparator(HumanNaturalComparator
								.getInstance()), new Transformer() {
					@Override
					public Object transform(Object arg0) {
						String refId = ((Product) arg0).getRefId();
						return refId == null || refId.isEmpty() ? null : refId;
					}
				})));

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

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

		return chain;
	}

}
