package advancedsystemsmanager.registry;
import advancedsystemsmanager.api.ISystemType;
import advancedsystemsmanager.api.tileentities.*;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.flow.elements.RadioButton;
import advancedsystemsmanager.flow.elements.RadioButtonList;
import advancedsystemsmanager.flow.menus.MenuContainer;
import advancedsystemsmanager.reference.Names;
import advancedsystemsmanager.tileentities.TileEntityBUD;
import advancedsystemsmanager.tileentities.TileEntityCamouflage;
import advancedsystemsmanager.tileentities.TileEntitySignUpdater;
import advancedsystemsmanager.tileentities.manager.TileEntityManager;
import net.minecraft.inventory.IInventory;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.fluids.IFluidHandler;
import thaumcraft.api.aspects.IAspectContainer;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class SystemTypeRegistry
{
private static final List<ISystemType> types = new ArrayList<ISystemType>();
public static final ISystemType INVENTORY = register(new SystemType<IInventory>(Names.TYPE_INVENTORY)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return tileEntity instanceof IInventory || tileEntity instanceof IInternalInventory;
}
@Override
public IInventory getType(TileEntity tileEntity)
{
return tileEntity instanceof IInventory ? (IInventory)tileEntity : null;
}
});
public static final ISystemType TANK = register(new SystemType<IFluidHandler>(Names.TYPE_TANK)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return tileEntity instanceof IFluidHandler || tileEntity instanceof IInternalTank;
}
@Override
public IFluidHandler getType(TileEntity tileEntity)
{
return tileEntity instanceof IFluidHandler ? (IFluidHandler)tileEntity : ((IInternalTank)tileEntity).getTank();
}
});
public static final ISystemType EMITTER = register(new SystemType<IRedstoneEmitter>(Names.TYPE_EMITTER)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return tileEntity instanceof IRedstoneEmitter;
}
@Override
public void initRadioButtons(RadioButtonList radioButtonsMulti)
{
}
});
public static final ISystemType RECEIVER = register(new SystemType<IRedstoneReceiver>(Names.TYPE_RECEIVER)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return tileEntity instanceof IRedstoneReceiver || manager == tileEntity;
}
@Override
public void initRadioButtons(RadioButtonList radioButtonsMulti)
{
radioButtonsMulti.add(new RadioButton(0, Names.RUN_SHARED_ONCE));
radioButtonsMulti.add(new RadioButton(1, Names.REQUIRE_ALL_TARGETS));
radioButtonsMulti.add(new RadioButton(2, Names.REQUIRE_ONE_TARGET));
}
@Override
public boolean isVisible(FlowComponent parent)
{
return parent.getConnectionSet() == ConnectionSet.REDSTONE;
}
});
public static final ISystemType NODE = register(new SystemType<IRedstoneNode>(Names.TYPE_NODE)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return tileEntity instanceof IRedstoneNode;
}
@Override
public void initRadioButtons(RadioButtonList radioButtonsMulti)
{
radioButtonsMulti.add(new RadioButton(0, Names.RUN_SHARED_ONCE));
radioButtonsMulti.add(new RadioButton(1, Names.REQUIRE_ALL_TARGETS));
radioButtonsMulti.add(new RadioButton(2, Names.REQUIRE_ONE_TARGET));
}
@Override
public int getDefaultRadioButton()
{
return 2;
}
@Override
public boolean containsGroup(Set<ISystemType> types)
{
return types.contains(EMITTER) || types.contains(RECEIVER);
}
});
public static final ISystemType BUD = register(new SystemType<TileEntityBUD>(Names.TYPE_BUD)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return tileEntity instanceof TileEntityBUD;
}
@Override
public boolean isVisible(FlowComponent parent)
{
return parent.getConnectionSet() == ConnectionSet.BUD;
}
@Override
public void initRadioButtons(RadioButtonList radioButtonsMulti)
{
radioButtonsMulti.add(new RadioButton(0, Names.REQUIRE_ALL_TARGETS));
radioButtonsMulti.add(new RadioButton(1, Names.REQUIRE_ONE_TARGET));
}
});
public static final ISystemType CAMOUFLAGE = register(new SystemType<TileEntityCamouflage>(Names.TYPE_CAMOUFLAGE)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return tileEntity instanceof TileEntityCamouflage;
}
@Override
public void initRadioButtons(RadioButtonList radioButtonsMulti)
{
}
});
public static final ISystemType SIGN = register(new SystemType<TileEntitySignUpdater>(Names.TYPE_SIGN)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return tileEntity instanceof TileEntitySignUpdater;
}
});
public static final ISystemType VARIABLE = new SystemType(Names.TYPE_VARIABLE)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return false;
}
@Override
public void initRadioButtons(RadioButtonList radioButtonsMulti)
{
}
@Override
public void addErrors(List errors, MenuContainer container)
{
}
};
public static final ISystemType COMPARATOR = register(new SystemType(Names.COMPARATOR_CONDITION)
{
@Override
public boolean isInstance(TileEntityManager manager, TileEntity tileEntity)
{
return tileEntity.getBlockType().hasComparatorInputOverride();
}
});
public static ISystemType register(ISystemType type)
{
types.add(type);
return type;
}
public static List<ISystemType> getTypes()
{
return types;
}
public static abstract class SystemType<Type> implements ISystemType<Type>
{
private String name;
private boolean group;
public SystemType(String name)
{
this(name, false);
}
public SystemType(String name, boolean group)
{
this.name = name;
this.group = group;
}
@Override
public String toString()
{
return name;
}
public boolean isGroup()
{
return group;
}
@Override
public Type getType(TileEntity tileEntity)
{
return (Type)tileEntity;
}
@Override
public boolean containsGroup(Set<ISystemType> types)
{
return false;
}
@Override
public String getName()
{
return name;
}
@Override
public void addErrors(List<String> errors, MenuContainer container)
{
if (container.selectedInventories.isEmpty() && container.isVisible())
{
errors.add(getErrorName());
}
}
protected String getErrorName()
{
return name + "Error";
}
@Override
public boolean isVisible(FlowComponent parent)
{
return true;
}
@Override
public void initRadioButtons(RadioButtonList radioButtonsMulti)
{
radioButtonsMulti.add(new RadioButton(0, Names.RUN_SHARED_ONCE));
radioButtonsMulti.add(new RadioButton(1, Names.RUN_ONE_PER_TARGET));
}
@Override
public int getDefaultRadioButton()
{
return 0;
}
}
}