package advancedsystemsmanager.flow.execution.commands;
import advancedsystemsmanager.api.execution.IBuffer;
import advancedsystemsmanager.api.execution.IBufferElement;
import advancedsystemsmanager.api.execution.Key;
import advancedsystemsmanager.api.tileentities.IInternalTank;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.flow.menus.Menu;
import advancedsystemsmanager.flow.menus.MenuContainer;
import advancedsystemsmanager.flow.menus.MenuLiquid;
import advancedsystemsmanager.flow.menus.MenuTargetTank;
import advancedsystemsmanager.flow.setting.Setting;
import advancedsystemsmanager.reference.Names;
import advancedsystemsmanager.registry.SystemTypeRegistry;
import advancedsystemsmanager.util.SystemCoord;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidHandler;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class CommandFluidOutput extends CommandOutput<Fluid>
{
public CommandFluidOutput()
{
super(FLUID_OUTPUT, Names.LIQUID_OUTPUT, IBuffer.FLUID);
}
@Override
protected void outputFromBuffer(FlowComponent component, IBuffer<Fluid> buffer)
{
MenuLiquid menuLiquid = (MenuLiquid)component.menus.get(2);
List<Setting<Fluid>> validSettings = getValidSettings(menuLiquid.getSettings());
List<Integer> validSides = new ArrayList<Integer>();
for (int i = 0; i < ((MenuTargetTank)component.getMenus().get(1)).activatedDirections.length; i++)
if (((MenuTargetTank)component.getMenus().get(1)).activatedDirections[i]) validSides.add(i);
for (SystemCoord block : getContainers(component.manager, (MenuContainer)component.menus.get(0)))
{
IFluidHandler tank = block.getTileEntity() instanceof IInternalTank ? ((IInternalTank)block.getTileEntity()).getTank() : (IFluidHandler)block.getTileEntity();
Iterator<Map.Entry<Key<Fluid>, IBufferElement<Fluid>>> iterator = buffer.getOrderedIterator();
while (iterator.hasNext())
{
IBufferElement<Fluid> fluidBufferElement = iterator.next().getValue();
FluidStack fluidStack = new FluidStack(fluidBufferElement.getContent(), 0);
Setting<Fluid> setting = isValid(validSettings, fluidBufferElement.getContent());
boolean whitelist = menuLiquid.useWhiteList();
if ((setting == null) == whitelist) continue;
for (int side : validSides)
{
FluidStack temp = fluidStack.copy();
temp.amount = fluidBufferElement.getSizeLeft();
int amount = tank.fill(ForgeDirection.VALID_DIRECTIONS[side], temp, false);
if (amount > 0)
{
temp.amount = amount;
temp.amount = fluidBufferElement.reduceBufferAmount(amount);
if (temp.amount > 0)
{
tank.fill(ForgeDirection.VALID_DIRECTIONS[side], temp, true);
if (fluidBufferElement.getSizeLeft() == 0)
{
fluidBufferElement.remove();
break;
}
}
}
}
}
}
}
@Override
public void getMenus(FlowComponent component, List<Menu> menus)
{
menus.add(new MenuContainer(component, SystemTypeRegistry.TANK));
menus.add(new MenuTargetTank(component));
menus.add(new MenuLiquid(component, false));
}
}