package universalelectricity.api.energy;

import net.minecraftforge.common.ForgeDirection;
import universalelectricity.api.net.IConnectable;

/**
 * Applied to all TileEntities that can interact with energy.
 * 
 * @author Calclavia, Inspired by Thermal Expansion
 */
public interface IEnergyInterface extends IConnectable
{
	/**
	 * Adds energy to a block. Returns the quantity of energy that was accepted. This should always
	 * return 0 if the block cannot be externally charged.
	 * 
	 * @param from Orientation the energy is sent in from.
	 * @param receive Maximum amount of energy (joules) to be sent into the block.
	 * @param doReceive If false, the charge will only be simulated.
	 * @return Amount of energy that was accepted by the block.
	 */
	public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive);

	/**
	 * Removes energy from a block. Returns the quantity of energy that was extracted. This should
	 * always return 0 if the block cannot be externally discharged.
	 * 
	 * @param from Orientation the energy is requested from. This direction MAY be passed as
	 * "Unknown" if it is wrapped from another energy system that has no clear way to find
	 * direction. (e.g BuildCraft 4)
	 * @param energy Maximum amount of energy to be sent into the block.
	 * @param doExtract If false, the charge will only be simulated.
	 * @return Amount of energy that was given out by the block.
	 */
	public long onExtractEnergy(ForgeDirection from, long extract, boolean doExtract);

}
