package crazypants.enderio.conduit.liquid;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import com.enderio.core.common.util.FluidUtil;
public class FluidFilter {
private final FluidStack[] fluids = new FluidStack[5];
private boolean isBlacklist;
public boolean isEmpty() {
for (FluidStack f : fluids) {
if(f != null) {
return false;
}
}
return true;
}
public int size() {
return fluids.length;
}
@Deprecated
public Fluid getFluidAt(int index) {
return fluids[index].getFluid();
}
public FluidStack getFluidStackAt(int index) {
return fluids[index];
}
@Deprecated
public boolean setFluid(int index, Fluid fluid) {
fluids[index] = new FluidStack(fluid, 0);
return true;
}
public boolean setFluid(int index, FluidStack fluid) {
if (fluid == null || fluid.getFluid() == null) {
fluids[index] = null;
} else {
fluids[index] = fluid;
}
return true;
}
public boolean setFluid(int index, ItemStack stack) {
if(stack == null) {
return setFluid(index, (FluidStack) null);
}
FluidStack f = FluidUtil.getFluidFromItem(stack);
if (f == null || f.getFluid() == null) {
return false;
}
return setFluid(index, f);
}
public boolean removeFluid(int index) {
if(index < 0 || index >= fluids.length) {
return false;
}
fluids[index] = null;
return true;
}
@Deprecated
protected void setFluid(int index, String fluidName) {
Fluid f = FluidRegistry.getFluid(fluidName);
setFluid(index, f);
}
public boolean isBlacklist() {
return isBlacklist;
}
public void setBlacklist(boolean isBlacklist) {
this.isBlacklist = isBlacklist;
}
public boolean isDefault() {
return !isBlacklist && isEmpty();
}
public void writeToNBT(NBTTagCompound root) {
root.setBoolean("isBlacklist", isBlacklist);
if(isEmpty()) {
root.removeTag("fluidFilter");
return;
}
NBTTagList fluidList = new NBTTagList();
int index = 0;
for (FluidStack f : fluids) {
if(f != null) {
NBTTagCompound fRoot = new NBTTagCompound();
fRoot.setInteger("index", index);
f.writeToNBT(fRoot);
fluidList.appendTag(fRoot);
}
index++;
}
root.setTag("fluidStackFilter", fluidList);
}
public void readFromNBT(NBTTagCompound root) {
isBlacklist = root.getBoolean("isBlacklist");
if (root.hasKey("fluidFilter")) {
NBTTagList fluidList = (NBTTagList) root.getTag("fluidFilter");
for (int i = 0; i < fluidList.tagCount(); i++) {
NBTTagCompound fRoot = fluidList.getCompoundTagAt(i);
setFluid(fRoot.getInteger("index"), fRoot.getString("fluidName"));
}
} else if (root.hasKey("fluidStackFilter")) {
NBTTagList fluidList = (NBTTagList) root.getTag("fluidStackFilter");
for (int i = 0; i < fluidList.tagCount(); i++) {
NBTTagCompound fRoot = fluidList.getCompoundTagAt(i);
setFluid(fRoot.getInteger("index"), FluidStack.loadFluidStackFromNBT(fRoot));
}
} else {
clear();
return;
}
}
private void clear() {
for(int i=0;i<fluids.length;i++) {
fluids[i] = null;
}
}
public boolean matchesFilter(FluidStack drained) {
if(drained == null || drained.getFluid() == null) {
return false;
}
if(isEmpty()) {
return true;
}
for (FluidStack f : fluids) {
if (f != null && f.isFluidEqual(drained)) {
return !isBlacklist;
}
}
return isBlacklist;
}
}