package com.hbm.items.machine;

import com.hbm.util.CompatExternal;

import com.hbm.inventory.FluidContainer;
import com.hbm.inventory.FluidContainerRegistry;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.inventory.fluid.tank.FluidTank;
import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Unsiphonable;
import com.hbm.items.ModItems;
import com.hbm.items.tool.ItemPipette;

import api.hbm.fluidmk2.IFluidStandardReceiverMK2;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class ItemFluidSiphon extends Item {

	@Override
	public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int i, float f0, float f1, float f2) {
		TileEntity te = CompatExternal.getCoreFromPos(world, x, y, z);

		if(te != null && te instanceof IFluidStandardReceiverMK2) {
			FluidTank[] tanks = ((IFluidStandardReceiverMK2) te).getReceivingTanks();

			boolean hasDrainedTank = false;

			// We need to iterate through the inventory for _each_ siphonable
			// tank, so we can handle fluids that can only go into certain containers
			// After we successfully siphon any fluid from a tank, we stop
			// further processing, multiple fluid types require multiple clicks
			for(FluidTank tank : tanks) {
				if(tank.getFill() <= 0)
					continue;

				ItemStack availablePipette = null;
				FluidType tankType = tank.getTankType();

				if(tankType.hasTrait(FT_Unsiphonable.class))
					continue;

				for(int j = 0; j < player.inventory.mainInventory.length; j++) {
					ItemStack inventoryStack = player.inventory.mainInventory[j];
					if(inventoryStack == null)
						continue;

					FluidContainer container = FluidContainerRegistry.getContainer(tankType, inventoryStack);

					if(availablePipette == null && inventoryStack.getItem() instanceof ItemPipette) {
						ItemPipette pipette = (ItemPipette) inventoryStack.getItem();
						if(!pipette.willFizzle(tankType) && pipette != ModItems.pipette_laboratory) { // Ignoring laboratory pipettes for now
							availablePipette = inventoryStack;
						}
					}

					if(container == null)
						continue;

					ItemStack full = FluidContainerRegistry.getFullContainer(inventoryStack, tankType);

					while(tank.getFill() >= container.content && inventoryStack.stackSize > 0) {
						hasDrainedTank = true;

						inventoryStack.stackSize--;
						if(inventoryStack.stackSize <= 0) {
							player.inventory.mainInventory[j] = null;
						}

						ItemStack filledContainer = full.copy();
						tank.setFill(tank.getFill() - container.content);
						player.inventory.addItemStackToInventory(filledContainer);
					}
				}

				// If the remainder of the tank can only fit into a pipette,
				// fill a pipette with the remainder
				// Will not auto-fill fizzlable pipettes, there is no feedback
				// for the fizzle in this case, and that's a touch too unfair
				if(availablePipette != null && tank.getFill() < 1000) {
					ItemPipette pipette = (ItemPipette) availablePipette.getItem();

					if(pipette.acceptsFluid(tankType, availablePipette)) {
						hasDrainedTank = true;
						tank.setFill(pipette.tryFill(tankType, tank.getFill(), availablePipette));
					}
				}

				if(hasDrainedTank)
					return true;
			}
		}

		return false;
	}

}
