/*******************************************************************************
 * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl-3.0-standalone.html
 ******************************************************************************/
package se.unlogic.standardutils.enums;

import java.lang.reflect.Field;
import java.util.ArrayList;

public class EnumUtils {

	public static <Type extends Enum<Type>> boolean isEnum(Class<Type> e, String s) {
		try {
			Enum.valueOf(e, s);
			return true;
		} catch (IllegalArgumentException ex) {
			return false;
		} catch (NullPointerException ex) {
			return false;
		}
	}

	public static <Type extends Enum<Type>> Type toEnum(Class<Type> e, String s) {
		try {
			return Type.valueOf(e, s);
		} catch (IllegalArgumentException ex) {
			return null;
		} catch (NullPointerException ex) {
			return null;
		}
	}

	public static <Type extends Enum<Type>> ArrayList<Type> toEnum(Class<Type> e, String[] values) {

		ArrayList<Type> enumValues = new ArrayList<Type>();

		for (String value : values) {

			Type enumValue = toEnum(e, value);

			if (enumValue != null) {
				enumValues.add(enumValue);
			}
		}

		if (enumValues.isEmpty()) {
			return null;
		} else {
			return enumValues;
		}
	}

	public static <Type extends Enum<Type>> Type toEnum(Type[] es, int ordinal) {

		for (Type typeValue : es) {

			if (typeValue.ordinal() == ordinal) {

				return typeValue;
			}
		}

		return null;
	}

	public static Enum<?> getInstanceFromField(Field field) {

		Object[] enumValues = field.getType().getEnumConstants();

		return (Enum<?>) enumValues[0];
	}

	public static Enum<?>[] getValuesFromField(Field field) {

		Object[] enumValues = field.getType().getEnumConstants();

		return (Enum[]) enumValues;
	}
}
