package ihl.recipes;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.oredict.OreDictionary;

public class UniversalRecipeOutput{

    private final List<FluidStack> fluidOutputs=new ArrayList();
    private final List<ItemStack> itemOutputs=new ArrayList();
    private final int time;
    
    public UniversalRecipeOutput(List<FluidStack> fluidOutputs1, List<ItemStack> itemOutputs1, int time1)
    {
    	if(fluidOutputs1!=null)fluidOutputs.addAll(fluidOutputs1);
    	if(itemOutputs1!=null)itemOutputs.addAll(itemOutputs1);
    	time=time1;
    }
    
	public UniversalRecipeOutput(FluidStack fluidStack) 
	{
		fluidOutputs.add(fluidStack);
		time=20;
	}

	public UniversalRecipeOutput(List<FluidStack> fluidOutputs1, int time1) 
	{
    	if(fluidOutputs1!=null)fluidOutputs.addAll(fluidOutputs1);
    	time=time1;
	}

	public UniversalRecipeOutput(List<ItemStack> itemOutputs1) 
	{
    	if(itemOutputs1!=null)itemOutputs.addAll(itemOutputs1);
    	time=0;
	}

	public UniversalRecipeOutput(ItemStack itemStack)
	{
		itemOutputs.add(itemStack);
    	time=0;
	}

	public boolean matches(List<FluidStack> fluidOutputs1, List<ItemStack> itemOutputs1) 
	{
		if(fluidOutputs.size()!=fluidOutputs1.size()||itemOutputs.size()!=itemOutputs.size())
		{
			return false;
		}
		Iterator<FluidStack> fi1 = fluidOutputs1.iterator();
		Iterator<ItemStack> ii1 = itemOutputs1.iterator();
		Iterator<FluidStack> fi = fluidOutputs.iterator();
		Iterator<ItemStack> ii = itemOutputs.iterator();
		while(fi.hasNext())
		{
			FluidStack fs = fi.next();
			FluidStack fs1 = fi1.next();
			if(fs.getFluid()!=fs1.getFluid())
			{
				return false;
			}
		}
		while(ii.hasNext())
		{
			ItemStack is = ii.next();
			ItemStack is1 = ii1.next();
			if(is==null)
			{
				return true;
			}
			if((is!=null && is1==null)||(is.getItem()!=is1.getItem()))
			{
				return false;
			}
			else if(is.getItemDamage()!=OreDictionary.WILDCARD_VALUE && is.getItemDamage()!=is1.getItemDamage())
			{
				return false;
			}
		}
		return true;
	}

	public List<FluidStack> getFluidOutputs() {
		return fluidOutputs;
	}
	
	public List<ItemStack> getItemOutputs() {
		return itemOutputs;
	}

	public UniversalRecipeOutput copy()
	{
		ArrayList<FluidStack> fluidStacks = new ArrayList<FluidStack>();
		ArrayList<ItemStack> itemStacks = new ArrayList<ItemStack>();
		if(fluidOutputs!=null && !fluidOutputs.isEmpty())
		{
			Iterator<FluidStack> fi = fluidOutputs.iterator();
			while(fi.hasNext())
			{
				FluidStack fs = fi.next();
				fluidStacks.add(fs.copy());
			}
		}
		if(itemOutputs!=null && !itemOutputs.isEmpty())
		{
			Iterator<ItemStack> ii = itemOutputs.iterator();
			while(ii.hasNext())
			{
				ItemStack is = ii.next();
				if(is!=null)
				{
					itemStacks.add(is.copy());
				}
				else
				{
					itemStacks.add(is);
				}
			}	
		}
		return new UniversalRecipeOutput(fluidStacks,itemStacks, time);
	}
	
	public boolean containItem(Item item) 
	{
		if(itemOutputs==null || itemOutputs.isEmpty())
		{
			return false;
		}
		Iterator<ItemStack> ii = itemOutputs.iterator();
		while(ii.hasNext())
		{
			ItemStack is = ii.next();
			if(is.getItem()==item)
			{
				return true;
			}
		}
		return false;
	}

	public boolean replaceItem(ItemStack newItemStack) {
		if(itemOutputs==null || itemOutputs.isEmpty())
		{
			return false;
		}
		Iterator<ItemStack> ii = itemOutputs.iterator();
		while(ii.hasNext())
		{
			ItemStack is = ii.next();
			if(is.getItem()==newItemStack.getItem())
			{
				is=newItemStack;
				return true;
			}
		}
		return false;
	}

	public UniversalRecipeOutput copyWithMultiplier(int mulipier) {
		ArrayList<FluidStack> fluidStacks = new ArrayList<FluidStack>();
		ArrayList<ItemStack> itemStacks = new ArrayList<ItemStack>();
		if(fluidOutputs!=null && !fluidOutputs.isEmpty())
		{
			Iterator<FluidStack> fi = fluidOutputs.iterator();
			while(fi.hasNext())
			{
				FluidStack fs = fi.next();
				FluidStack newFs = fs.copy();
				newFs.amount*=mulipier;
				fluidStacks.add(newFs);
			}
		}
		if(itemOutputs!=null && !itemOutputs.isEmpty())
		{
			Iterator<ItemStack> ii = itemOutputs.iterator();
			while(ii.hasNext())
			{
				ItemStack is = ii.next();
				if(is!=null)
				{
					ItemStack newIs = is.copy();
					newIs.stackSize*=mulipier;
					itemStacks.add(newIs);
				}
				else
				{
					itemStacks.add(is);
				}
			}	
		}
		return new UniversalRecipeOutput(fluidStacks,itemStacks, time);
	}
}
