package crazypants.enderio.conduit.geom;
import java.util.HashMap;
import java.util.Map;
import net.minecraftforge.common.util.ForgeDirection;
import crazypants.enderio.conduit.IConduit;
import crazypants.enderio.conduit.gas.IGasConduit;
import crazypants.enderio.conduit.item.IItemConduit;
import crazypants.enderio.conduit.liquid.ILiquidConduit;
import crazypants.enderio.conduit.me.IMEConduit;
import crazypants.enderio.conduit.oc.IOCConduit;
import crazypants.enderio.conduit.power.IPowerConduit;
import crazypants.enderio.conduit.redstone.IRedstoneConduit;
public class Offsets {
private static Map<OffsetKey, Offset> OFFSETS = new HashMap<OffsetKey, Offset>();
static {
OFFSETS.put(key(IRedstoneConduit.class, Axis.NONE), Offset.UP);
OFFSETS.put(key(IRedstoneConduit.class, Axis.X), Offset.UP);
OFFSETS.put(key(IRedstoneConduit.class, Axis.Y), Offset.NORTH);
OFFSETS.put(key(IRedstoneConduit.class, Axis.Z), Offset.UP);
OFFSETS.put(key(IPowerConduit.class, Axis.NONE), Offset.DOWN);
OFFSETS.put(key(IPowerConduit.class, Axis.X), Offset.DOWN);
OFFSETS.put(key(IPowerConduit.class, Axis.Y), Offset.SOUTH);
OFFSETS.put(key(IPowerConduit.class, Axis.Z), Offset.DOWN);
OFFSETS.put(key(ILiquidConduit.class, Axis.NONE), Offset.WEST);
OFFSETS.put(key(ILiquidConduit.class, Axis.X), Offset.NORTH);
OFFSETS.put(key(ILiquidConduit.class, Axis.Y), Offset.WEST);
OFFSETS.put(key(ILiquidConduit.class, Axis.Z), Offset.WEST);
OFFSETS.put(key(IItemConduit.class, Axis.NONE), Offset.EAST);
OFFSETS.put(key(IItemConduit.class, Axis.X), Offset.SOUTH);
OFFSETS.put(key(IItemConduit.class, Axis.Y), Offset.EAST);
OFFSETS.put(key(IItemConduit.class, Axis.Z), Offset.EAST);
OFFSETS.put(key(IGasConduit.class, Axis.NONE), Offset.NORTH_UP);
OFFSETS.put(key(IGasConduit.class, Axis.X), Offset.NORTH_UP);
OFFSETS.put(key(IGasConduit.class, Axis.Y), Offset.NORTH_WEST);
OFFSETS.put(key(IGasConduit.class, Axis.Z), Offset.WEST_UP);
OFFSETS.put(key(IMEConduit.class, Axis.NONE), Offset.SOUTH_UP);
OFFSETS.put(key(IMEConduit.class, Axis.X), Offset.SOUTH_UP);
OFFSETS.put(key(IMEConduit.class, Axis.Y), Offset.NORTH_EAST);
OFFSETS.put(key(IMEConduit.class, Axis.Z), Offset.EAST_UP);
OFFSETS.put(key(IOCConduit.class, Axis.NONE), Offset.NORTH_DOWN);
OFFSETS.put(key(IOCConduit.class, Axis.X), Offset.NORTH_DOWN);
OFFSETS.put(key(IOCConduit.class, Axis.Y), Offset.SOUTH_WEST);
OFFSETS.put(key(IOCConduit.class, Axis.Z), Offset.WEST_DOWN);
// OFFSETS.put(key(IxConduit.class, Axis.NONE), Offset.SOUTH_DOWN);
// OFFSETS.put(key(IxConduit.class, Axis.X), Offset.SOUTH_DOWN);
// OFFSETS.put(key(IxConduit.class, Axis.Y), Offset.SOUTH_EAST);
// OFFSETS.put(key(IxConduit.class, Axis.Z), Offset.EAST_DOWN);
}
public static Offset get(Class<? extends IConduit> type, ForgeDirection dir) {
Offset res = OFFSETS.get(key(type, getAxisForDir(dir)));
if(res == null) {
res = Offset.NONE;
}
return res;
}
public static OffsetKey key(Class<? extends IConduit> type, Axis axis) {
return new OffsetKey(type, axis);
}
public static Axis getAxisForDir(ForgeDirection dir) {
if(dir == ForgeDirection.UNKNOWN) {
return Axis.NONE;
}
if(dir == ForgeDirection.EAST || dir == ForgeDirection.WEST) {
return Axis.X;
}
if(dir == ForgeDirection.UP || dir == ForgeDirection.DOWN) {
return Axis.Y;
}
if(dir == ForgeDirection.NORTH || dir == ForgeDirection.SOUTH) {
return Axis.Z;
}
return Axis.NONE;
}
public static enum Axis {
NONE,
X,
Y,
Z
}
public static class OffsetKey {
String typeName;
Axis axis;
private OffsetKey(Class<? extends IConduit> type, Axis axis) {
this.typeName = type.getCanonicalName();
this.axis = axis;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((axis == null) ? 0 : axis.hashCode());
result = prime * result + ((typeName == null) ? 0 : typeName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj == null) {
return false;
}
if(getClass() != obj.getClass()) {
return false;
}
OffsetKey other = (OffsetKey) obj;
if(axis != other.axis) {
return false;
}
if(typeName == null) {
if(other.typeName != null) {
return false;
}
} else if(!typeName.equals(other.typeName)) {
return false;
}
return true;
}
@Override
public String toString() {
return "OffsetKey [typeName=" + typeName + ", axis=" + axis + "]";
}
}
}