package fr.pandacube.java.util;

public class EnumUtil {

	/**
	 * List all enum constants which are in the specified enum class.
	 * @param enumType the enum class.
	 * @param separator a string which will be used as a separator
	 * @return a string representation of the enum class.
	 */
	public static <T extends Enum<T>> String enumList(Class<T> enumType, String separator) {
		T[] elements = enumType.getEnumConstants();
		
		String out = "";
		boolean first = true;
		for (T el : elements) {
			if (!first) {
				out += separator;
			}
			first = false;
			out += el.name();
			
		}
		return out;
	}
	

	/**
	 * List all enum constants which are in the specified enum class. It is equivalent to call
	 * {@link #enumList(Class, String)} with the second parameter <code>", "</code>
	 * @param enumType the enum class.
	 * @return a string representation of the enum class.
	 */
	public static <T extends Enum<T>> String enumList(Class<T> enumType) {
		return enumList(enumType, ", ");
	}
	
	/**
	 * Permet de rechercher l'existance d'un élément dans un enum, de façon insensible à la casse
	 * @param enumType la classe correpondant à l'enum à lister
	 * @param search l'élément à rechercher, insensible à la casse
	 * @return l'élément de l'énumarétion, si elle a été trouvée, null sinon
	 */
	public static <T extends Enum<T>> T searchEnum(Class<T> enumType, String search) {
		T[] elements = enumType.getEnumConstants();
		
	    for (T el : elements)
	        if (el.name().equalsIgnoreCase(search))
	            return el;
	    return null;
	}
	
	
	
	
	/**
	 * Retourne une valeur aléatoire parmis les élément de l'Enum spécifié en paramètre.
	 * @param enumType l'enum dans lequel piocher la valeur
	 * @return une des valeurs de l'enum
	 */
	public static <T extends Enum<T>> T randomValue(Class<T> enumType) {
		T[] elements = enumType.getEnumConstants();
		
		return elements[RandomUtil.rand.nextInt(elements.length)];
	}

}