package advancedsystemsmanager.flow.execution.commands;
import advancedsystemsmanager.api.ISystemType;
import advancedsystemsmanager.api.execution.ICommand;
import advancedsystemsmanager.api.gui.IManagerButton;
import advancedsystemsmanager.flow.Connection;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.flow.elements.Variable;
import advancedsystemsmanager.flow.execution.Executor;
import advancedsystemsmanager.flow.menus.MenuContainer;
import advancedsystemsmanager.flow.setting.Setting;
import advancedsystemsmanager.reference.Textures;
import advancedsystemsmanager.registry.ConnectionOption;
import advancedsystemsmanager.registry.ConnectionSet;
import advancedsystemsmanager.tileentities.manager.TileEntityManager;
import advancedsystemsmanager.util.SystemCoord;
import net.minecraft.util.ResourceLocation;
import java.util.*;
public abstract class CommandBase<Type> implements ICommand
{
protected static final int BUTTON_SHEET_SIZE = 13;
protected static final int TRIGGER = 0;
protected static final int ITEM_INPUT = 1;
protected static final int ITEM_OUTPUT = 2;
protected static final int ITEM_CONDITION = 3;
protected static final int FLOW_CONTROL = 4;
protected static final int FLUID_INPUT = 5;
protected static final int FLUID_OUTPUT = 6;
protected static final int FLUID_CONDITION = 7;
protected static final int REDSTONE_OUTPUT = 8;
protected static final int REDSTONE_CONDITION = 9;
protected static final int VARIABLE = 10;
protected static final int FOR_EACH = 11;
protected static final int AUTOCRAFTING = 12;
protected static final int GROUP = 13;
protected static final int GROUP_NODE = 14;
protected static final int CAMOUFLAGE = 15;
protected static final int SIGN = 16;
protected static final int RF_INPUT = 17;
protected static final int RF_OUTPUT = 18;
protected static final int RF_CONDITION = 19;
protected static final int ASPECT_INPUT = 22;
protected static final int ASPECT_OUTPUT = 23;
protected static final int ASPECT_CONDITION = 24;
protected static final int COMPARATOR_CONDITION = 31;
protected int id;
protected String name;
protected String longName;
protected ConnectionSet[] connectionSets;
protected CommandType type;
protected EnumSet<ConnectionOption> outputs = EnumSet.copyOf(ConnectionOption.OUTPUTS);
protected int energyCost;
protected int[] colour = new int[]{0xc6, 0xc6, 0xc6, 0xff};
public CommandBase(int id, String name, CommandType type, ConnectionSet... connectionSets)
{
this.id = id;
this.name = name;
this.longName = name + "Long";
this.connectionSets = connectionSets;
this.type = type;
}
public static List<SystemCoord> getContainers(TileEntityManager manager, MenuContainer container)
{
return getContainers(manager, container.getSelectedInventories(), container.getValidTypes());
}
private static List<SystemCoord> getContainers(TileEntityManager manager, List<Long> selectedInventories, Set<ISystemType> types)
{
List<SystemCoord> result = new ArrayList<SystemCoord>();
for (Iterator<Long> itr = selectedInventories.iterator(); itr.hasNext(); )
{
long selected = itr.next();
if (selected >= 0)
{
SystemCoord coord = manager.getInventory(selected);
if (coord == null || !coord.isOfAnyType(types))
{
itr.remove();
}
else if (coord.isValid())
{
result.add(coord);
}
} else
{
Variable variable = manager.getVariable((int)selected);
if (variable != null)
{
result.addAll(variable.getContainers(manager, types));
} else
{
// itr.remove();
}
}
}
return result;
}
public boolean isValidSetting(boolean whitelist, Setting<Type> setting)
{
return ((setting != null) == whitelist) || (setting != null && setting.isLimitedByAmount());
}
public List<Setting<Type>> getValidSettings(List<Setting<Type>> oldSettings)
{
List<Setting<Type>> result = new ArrayList<Setting<Type>>();
for (Setting<Type> setting : oldSettings)
{
if (setting.isValid())
{
setting.resetCount();
result.add(setting);
}
}
return result;
}
@Override
public int getId()
{
return id;
}
public Setting<Type> isValid(List<Setting<Type>> settings, Type check)
{
for (Iterator<Setting<Type>> itr = settings.iterator(); itr.hasNext(); )
{
Setting<Type> setting = itr.next();
if (setting.isContentEqual(check))
{
if (!(setting.isLimitedByAmount() && setting.getAmountLeft() < 1))
return setting;
else
{
itr.remove();
}
}
}
return null;
}
@Override
public ConnectionSet[] getSets()
{
return connectionSets;
}
@Override
public void execute(FlowComponent command, int connectionId, Executor executor)
{
}
@Override
public String getName()
{
return name;
}
@Override
public String getLongName()
{
return longName;
}
@Override
public CommandType getCommandType()
{
return type;
}
@Override
public int getX()
{
return (getId() / BUTTON_SHEET_SIZE) * IManagerButton.BUTTON_ICON_SIZE;
}
@Override
public int getY()
{
return (getId() % BUTTON_SHEET_SIZE) * IManagerButton.BUTTON_ICON_SIZE;
}
@Override
public ResourceLocation getTexture()
{
return Textures.BUTTONS;
}
@Override
public List<Connection> getActiveChildren(FlowComponent command, int connectionId)
{
List<Connection> connections = new ArrayList<Connection>();
for (int i = 0; i < command.getConnectionSet().getConnections().length; ++i)
{
Connection connection = command.getConnection(i);
ConnectionOption option = command.getConnectionSet().getConnections()[i];
if (connection != null && !option.isInput() && outputs.contains(option))
{
connections.add(connection);
}
}
return connections;
}
@Override
public void moveComponent(FlowComponent component, FlowComponent oldParent, FlowComponent newParent)
{
}
@Override
public int getEnergyCost()
{
return energyCost;
}
@Override
public void setEnergyCost(int energyCost)
{
this.energyCost = energyCost;
}
@Override
public int[] getColour()
{
return colour;
}
@Override
public void setColour(int[] colour)
{
this.colour = colour;
}
}