package exnihiloadscensio.barrel;

import javax.annotation.Nullable;

import exnihiloadscensio.networking.MessageBarrelModeUpdate;
import exnihiloadscensio.networking.MessageFluidUpdate;
import exnihiloadscensio.networking.PacketHandler;
import exnihiloadscensio.registries.BarrelLiquidBlacklistRegistry;
import exnihiloadscensio.registries.BarrelModeRegistry;
import exnihiloadscensio.registries.BarrelModeRegistry.TriggerType;
import exnihiloadscensio.tiles.TileBarrel;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;

public class BarrelFluidHandler extends FluidTank {
	
	private TileBarrel barrel;
	
	public BarrelFluidHandler(TileBarrel barrel) {
		this(Fluid.BUCKET_VOLUME);
		this.barrel = barrel;
	}
	
    public BarrelFluidHandler(int capacity) {
        super(capacity);
    }

    public BarrelFluidHandler(@Nullable FluidStack fluidStack, int capacity) {
        super(fluidStack, capacity);
    }

    public BarrelFluidHandler(Fluid fluid, int amount, int capacity)  {
        super(fluid, amount, capacity);
    }
    
    @Override
    public boolean canFillFluidType(FluidStack fluid) {
        if(fluid == null || fluid.getFluid() == null || BarrelLiquidBlacklistRegistry.isBlacklisted(barrel.getTier(), fluid.getFluid().getName()))
            return false;
        
    	for (IBarrelMode mode : BarrelModeRegistry.getModes(TriggerType.FLUID))	{
    		if (mode.isTriggerFluidStack(fluid))
    			return true;
    	}
        return false;
    }
    
    @Override
    public boolean canFill() {
    	return barrel.getMode() == null ? true : barrel.getMode().canFillWithFluid(barrel);
    }
    
    @Override
    public int fill(FluidStack resource, boolean doFill) {
    	if (barrel.getMode() != null && !barrel.getMode().canFillWithFluid(barrel))
    		return 0;
    	
    	int amount = super.fill(resource, doFill);
    	if (amount > 0) {
    		PacketHandler.sendToAllAround(new MessageFluidUpdate(fluid, barrel.getPos()), barrel);
        	if (this.fluid != null && this.barrel.getMode() == null) {
        		this.barrel.setMode("fluid");
        		PacketHandler.sendToAllAround(new MessageBarrelModeUpdate(barrel.getMode().getName(), barrel.getPos()), barrel);
        	}
    	}
    	return amount;
    }
    
    @Override
    public FluidStack drain(FluidStack resource, boolean doDrain) {
    	FluidStack stack = super.drain(resource, doDrain);
    	if (stack != null && stack.amount > 0) {
    		PacketHandler.sendToAllAround(new MessageFluidUpdate(fluid, barrel.getPos()), barrel);
    	}
    	if (fluid == null && barrel.getMode() != null && barrel.getMode().getName().equals("fluid")) {
    		barrel.setMode("null");
    		PacketHandler.sendToAllAround(new MessageBarrelModeUpdate("null", barrel.getPos()), barrel);
    	}
    	return stack;
    }
    
    @Override
    public FluidStack drain(int maxDrain, boolean doDrain) {
    	FluidStack stack = super.drain(maxDrain, doDrain);
    	if (stack != null && stack.amount > 0) {
    		PacketHandler.sendToAllAround(new MessageFluidUpdate(fluid, barrel.getPos()), barrel);
    	}
    	if (fluid == null && barrel.getMode() != null && barrel.getMode().getName().equals("fluid")) {
    		barrel.setMode("null");
    		PacketHandler.sendToAllAround(new MessageBarrelModeUpdate("null", barrel.getPos()), barrel);
    	}
    	return stack;
    }
    
    @Override
    protected void onContentsChanged() {
    	
    }
    
    public void setBarrel(TileBarrel barrel) {
    	this.barrel = barrel;
    }

}