package gregtech.api.interfaces;

import gregtech.api.interfaces.tileentity.ICoverable;
import gregtech.api.util.GT_CoverBehavior;
import net.minecraft.block.Block;
import net.minecraft.tileentity.TileEntity;

/**
 * Implemented by the MetaTileEntity of the Redstone Circuit Block
 */
public interface IRedstoneCircuitBlock {
    /**
     * The Output Direction the Circuit Block is Facing
     */
    public byte getOutputFacing();

    /**
     * sets Output Redstone State at Side
     */
    public boolean setRedstone(byte aStrength, byte aSide);

    /**
     * returns Output Redstone State at Side
     * Note that setRedstone checks if there is a Difference between the old and the new Setting before consuming any Energy
     */
    public byte getOutputRedstone(byte aSide);

    /**
     * returns Input Redstone Signal at Side
     */
    public byte getInputRedstone(byte aSide);

    /**
     * If this Side is Covered up and therefor not doing any Redstone
     */
    public GT_CoverBehavior getCover(byte aSide);

    public int getCoverID(byte aSide);

    public int getCoverVariable(byte aSide);

    /**
     * returns whatever Block-ID is adjacent to the Redstone Circuit Block
     */
    public Block getBlockAtSide(byte aSide);

    /**
     * returns whatever Meta-Value is adjacent to the Redstone Circuit Block
     */
    public byte getMetaIDAtSide(byte aSide);

    /**
     * returns whatever TileEntity is adjacent to the Redstone Circuit Block
     */
    public TileEntity getTileEntityAtSide(byte aSide);

    /**
     * returns whatever TileEntity is used by the Redstone Circuit Block
     */
    public ICoverable getOwnTileEntity();

    /**
     * returns worldObj.rand.nextInt(aRange)
     */
    public int getRandom(int aRange);
}