package advancedsystemsmanager.flow.execution.commands;
import advancedsystemsmanager.api.tileentities.IInternalTank;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.flow.execution.buffers.elements.FluidBufferElement;
import advancedsystemsmanager.flow.menus.*;
import advancedsystemsmanager.flow.setting.Setting;
import advancedsystemsmanager.reference.Names;
import advancedsystemsmanager.util.SystemCoord;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class CommandFluidCondition extends CommandCondition<Fluid, MenuTargetTank>
{
public CommandFluidCondition()
{
super(FLUID_CONDITION, Names.LIQUID_CONDITION);
}
@Override
public void searchForStuff(SystemCoord block, List<Setting<Fluid>> settings, MenuTargetTank target, Set<Setting<Fluid>> found)
{
TileEntity entity = block.getTileEntity();
if (entity instanceof IInternalTank)
{
} else
{
IFluidHandler tank = (IFluidHandler)entity;
Map<ForgeDirection, FluidTankInfo> tankInfoMap = new HashMap<ForgeDirection, FluidTankInfo>();
for (int i = 0; i < 6; i++)
{
if (target.activatedDirections[i])
{
FluidTankInfo[] tankInfos = tank.getTankInfo(ForgeDirection.getOrientation(i));
if (tankInfos == null || tankInfos[0] == null || tankInfos[0].fluid == null || tankInfos[0].fluid.amount == 0)
continue;
boolean safeToAdd = true;
for (FluidTankInfo tankInfo : tankInfoMap.values())
{
if (tankInfo.capacity == tankInfos[0].capacity && tankInfo.fluid.isFluidStackIdentical(tankInfos[0].fluid))
{
safeToAdd = false;
break;
}
}
if (safeToAdd) tankInfoMap.put(ForgeDirection.getOrientation(i), tankInfos[0]);
}
}
for (Map.Entry<ForgeDirection, FluidTankInfo> entry : tankInfoMap.entrySet())
{
Setting<Fluid> setting = isValid(settings, entry.getValue().fluid.getFluid());
if (setting != null)
{
if (found != null)
{
found.add(setting);
}
setting.reduceAmount(entry.getValue().fluid.amount);
}
}
}
}
@Override
public void getMenus(FlowComponent component, List<Menu> menus)
{
menus.add(new MenuTankCondition(component));
menus.add(new MenuTargetTank(component));
menus.add(new MenuLiquidCondition(component));
}
}