package mekanism.api.energy;

import net.minecraft.item.ItemStack;

/**
 * Implement this in an item's class if it should be able to store electricity.
 * @author aidancbrady
 *
 */
public interface IEnergizedItem
{
	/**
	 * Gets and returns the amount of energy stored in this item.
	 * @param itemStack - the ItemStack to check
	 * @return energy stored
	 */
	public double getEnergy(ItemStack itemStack);

	/**
	 * Sets this item's stored energy value to a new amount.
	 * @param itemStack - the ItemStack who's energy value is to be change
	 * @param amount - new amount of energy
	 */
	public void setEnergy(ItemStack itemStack, double amount);

	/**
	 * Gets and returns this item's maximum amount of energy that can be stored.
	 * @param itemStack - the ItemStack to check
	 * @return maximum energy
	 */
	public double getMaxEnergy(ItemStack itemStack);

	/**
	 * Gets and returns how much energy this item can transfer to and from charging slots.
	 * @param itemStack - the ItemStack to check
	 * @return transfer amount
	 */
	public double getMaxTransfer(ItemStack itemStack);

	/**
	 * Gets and returns whether or not this item can receive energy from a charging slot.
	 * @param itemStack - the ItemStack to check
	 * @return if the item can receive energy
	 */
	public boolean canReceive(ItemStack itemStack);

	/**
	 * Gets and returns whether or not this item can send energy to a charging slot.
	 * @param itemStack - the ItemStack to check
	 * @return if the item can send energy
	 */
	public boolean canSend(ItemStack itemStack);

	/**
	 * Returns whether or not this item contains metadata-specific subtypes instead of using metadata for damage display.
	 * @return if the item contains metadata-specific subtypes
	 */
	public boolean isMetadataSpecific();
}
