package openperipheral.addons.glasses;

import com.google.common.base.Optional;
import net.minecraft.entity.EntityLiving;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.world.World;
import openmods.utils.InventoryUtils;

public class TerminalAddonRecipe implements IRecipe {

	private static boolean isSuitableItem(ItemStack itemStack) {
		return EntityLiving.getArmorPosition(itemStack) == 4 &&
				itemStack.stackSize == 1 &&
				!NbtGuidProviders.hasTerminalCapabilities(itemStack);
	}

	@Override
	public boolean matches(InventoryCrafting inv, World world) {
		boolean glassesFound = false;
		boolean targetFound = false;

		for (ItemStack itemStack : InventoryUtils.asIterable(inv)) {
			if (itemStack != null) {
				if (itemStack.getItem() instanceof ItemGlasses) {
					if (glassesFound) return false;
					glassesFound = true;
				} else if (isSuitableItem(itemStack)) {
					if (targetFound) return false;
					targetFound = true;
				} else return false;
			}
		}

		return glassesFound && targetFound;
	}

	@Override
	public ItemStack getCraftingResult(InventoryCrafting inv) {
		ItemStack targetStack = null;
		ItemStack glassesStack = null;

		for (ItemStack itemStack : InventoryUtils.asIterable(inv)) {
			if (itemStack != null) {
				if (itemStack.getItem() instanceof ItemGlasses) {
					if (glassesStack != null) return null;
					glassesStack = itemStack;
				} else if (isSuitableItem(itemStack)) {
					if (targetStack != null) return null;
					targetStack = itemStack;
				} else return null;
			}
		}

		if (glassesStack == null || targetStack == null) return null;

		final ItemGlasses glassesItem = (ItemGlasses)glassesStack.getItem();
		Optional<Long> guid = Optional.fromNullable(glassesItem.getTerminalGuid(glassesStack));

		final ItemStack result = targetStack.copy();
		NbtGuidProviders.setTerminalGuid(result, guid);

		return result;
	}

	@Override
	public int getRecipeSize() {
		return 2;
	}

	@Override
	public ItemStack getRecipeOutput() {
		return null;
	}

}