package gregtech.api.interfaces.metatileentity;

/**
 * For pipes, wires, and other MetaTiles which need to be decided whether they should connect to the block at each side.
 */
public interface IConnectable {
    int NO_CONNECTION    = 0b00000000;
    int CONNECTED_DOWN   = 0b00000001;
    int CONNECTED_UP     = 0b00000010;
    int CONNECTED_NORTH  = 0b00000100;
    int CONNECTED_SOUTH  = 0b00001000;
    int CONNECTED_WEST   = 0b00010000;
    int CONNECTED_EAST   = 0b00100000;
    int CONNECTED_ALL    = 0b00111111;
    int HAS_FRESHFOAM    = 0b01000000;
    int HAS_HARDENEDFOAM = 0b10000000;
    int HAS_FOAM         = 0b11000000;

    /**
     * Try to connect to the Block at the specified side
     * returns the connection state. Non-positive values for failed, others for succeeded.
     */
    int connect(byte aSide);

    /**
     * Try to disconnect to the Block at the specified side
     */
    void disconnect(byte aSide);

    boolean isConnectedAtSide(int aSide);
}