package forestry.api.recipes;

import java.util.HashMap;

import net.minecraft.item.ItemStack;

/**
 * Provides an interface to the recipe manager of the centrifuge.
 * 
 * The manager is initialized at the beginning of Forestry's BaseMod.load() cycle. Begin adding recipes in BaseMod.ModsLoaded() and this shouldn't be null even
 * if your mod loads before Forestry.
 * 
 * Accessible via {@link RecipeManagers}
 * 
 * @author SirSengir
 */
public interface ICentrifugeManager extends ICraftingProvider {

	/**
	 * Add a recipe to the centrifuge
	 * 
	 * @param timePerItem
	 *            Time to centrifugate one item of the given type
	 * @param resource
	 *            ItemStack containing information on item id and damage. Stack size will be ignored.
	 * @param products
	 *            HashMap<ItemStack, Integer> specifying the possible products and the chances of them resulting from centrifugation.
	 */
	public void addRecipe(int timePerItem, ItemStack resource, HashMap<ItemStack, Integer> products);

	/**
	 * Add a recipe to the centrifuge
	 * 
	 * @param timePerItem
	 *            Time to centrifugate one item of the given type
	 * @param resource
	 *            ItemStack containing information on item id and damage. Stack size will be ignored.
	 * @param produce
	 *            Array of ItemStacks that can be the result of this recipe.
	 * @param chances
	 *            Array of integers corresponding and matching to produce providing the chance (0-100) for the ItemStack at the given index to be
	 *            produced.
	 */
	public void addRecipe(int timePerItem, ItemStack resource, ItemStack[] produce, int[] chances);

	/**
	 * Add a recipe to the centrifuge
	 * 
	 * @param timePerItem
	 *            Time to centrifugate one item of the given type
	 * @param resource
	 *            ItemStack containing information on item id and damage. Stack size will be ignored.
	 * @param primary
	 *            Primary product produced by centrifugating one item. Yield 100 %.
	 * @param secondary
	 *            Secondary product that may be produced when centrifugating the given item. May be null.
	 * @param chance
	 *            Chance (1 - 100) for centrifugation to yield the secondary product.
	 */
	public void addRecipe(int timePerItem, ItemStack resource, ItemStack primary, ItemStack secondary, int chance);

	/**
	 * Add a recipe to the centrifuge
	 * 
	 * @param timePerItem
	 *            Time to centrifugate one item of the given type
	 * @param resource
	 *            ItemStack containing information on item id and damage. Stack size will be ignored.
	 * @param primary
	 *            Primary product produced by centrifugating one item. Yield 100 %.
	 */
	public void addRecipe(int timePerItem, ItemStack resource, ItemStack primary);

}
