/**
 * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
 * http://www.mod-buildcraft.com
 *
 * BuildCraft is distributed under the terms of the Minecraft Mod Public
 * License 1.0, or MMPL. Please check the contents of the license located in
 * http://www.mod-buildcraft.com/MMPL-1.0.txt
 */
package buildcraft.transport.render;

import buildcraft.api.gates.IGateExpansion;
import buildcraft.transport.gates.ItemGate;
import java.util.Random;
import net.minecraft.item.ItemStack;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.util.IIcon;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraftforge.client.IItemRenderer;
import net.minecraftforge.client.IItemRenderer.ItemRenderType;
import net.minecraftforge.client.IItemRenderer.ItemRendererHelper;
import org.lwjgl.opengl.GL11;
import net.minecraft.entity.item.EntityItem;

public class GateItemRenderer implements IItemRenderer {

	RenderItem renderItem = new RenderItem();

	@Override
	public boolean handleRenderType(ItemStack stack, ItemRenderType type) {
		if (type == ItemRenderType.INVENTORY || type == ItemRenderType.ENTITY || type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON)
			return true;
		return false;
	}

	@Override
	public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack stack, ItemRendererHelper helper) {
		if (helper == ItemRendererHelper.ENTITY_BOBBING)
			return true;
		return false;
	}

	@Override
	public void renderItem(ItemRenderType type, ItemStack stack, Object... data) {
		if (type == ItemRenderType.INVENTORY)
			render(ItemRenderType.INVENTORY, stack);
		else if (type == ItemRenderType.ENTITY)
			if (RenderManager.instance.options.fancyGraphics)
				renderAsEntity(stack, (EntityItem) data[1]);
			else
				renderAsEntityFlat(stack);
		else if (type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON) {
			renderIn3D(stack);
		}
	}

	private void renderIn3D(ItemStack stack) {
		GL11.glPushMatrix();

		renderLayerIn3D(ItemGate.getLogic(stack).getIconItem());
		GL11.glScalef(1, 1, 1.05f);
		renderLayerIn3D(ItemGate.getMaterial(stack).getIconItem());

		for (IGateExpansion expansion : ItemGate.getInstalledExpansions(stack)) {
			renderLayerIn3D(expansion.getOverlayItem());
		}

		GL11.glPopMatrix();
	}

	private void renderLayerIn3D(IIcon icon) {
		if (icon == null)
			return;
		GL11.glPushMatrix();
		Tessellator tessellator = Tessellator.instance;

		float uv1 = icon.getMinU();
		float uv2 = icon.getMaxU();
		float uv3 = icon.getMinV();
		float uv4 = icon.getMaxV();

		ItemRenderer.renderItemIn2D(tessellator, uv2, uv3, uv1, uv4, icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
		GL11.glPopMatrix();
	}

	private void renderAsEntity(ItemStack stack, EntityItem entity) {
		GL11.glPushMatrix();
		byte iterations = 1;
		if (stack.stackSize > 1)
			iterations = 2;
		if (stack.stackSize > 15)
			iterations = 3;
		if (stack.stackSize > 31)
			iterations = 4;

		Random rand = new Random(187L);

		float offsetZ = 0.0625F + 0.021875F;

		GL11.glRotatef((((float) entity.age + 1.0F) / 20.0F + entity.hoverStart) * (180F / (float) Math.PI), 0.0F, 1.0F, 0.0F);
		GL11.glTranslatef(-0.5F, -0.25F, -(offsetZ * (float) iterations / 2.0F));

		for (int count = 0; count < iterations; ++count) {
			if (count > 0) {
				float offsetX = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
				float offsetY = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
				float z = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F / 0.5F;
				GL11.glTranslatef(offsetX, offsetY, offsetZ);
			} else
				GL11.glTranslatef(0f, 0f, offsetZ);

			renderIn3D(stack);
		}
		GL11.glPopMatrix();
	}

	private void renderAsEntityFlat(ItemStack stack) {
		GL11.glPushMatrix();
		byte iterations = 1;
		if (stack.stackSize > 1)
			iterations = 2;
		if (stack.stackSize > 15)
			iterations = 3;
		if (stack.stackSize > 31)
			iterations = 4;

		Random rand = new Random(187L);

		for (int ii = 0; ii < iterations; ++ii) {
			GL11.glPushMatrix();
			GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
			GL11.glRotatef(180 - RenderManager.instance.playerViewY, 0.0F, 1.0F, 0.0F);

			if (ii > 0) {
				float var12 = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F;
				float var13 = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F;
				float var14 = (rand.nextFloat() * 2.0F - 1.0F) * 0.3F;
				GL11.glTranslatef(var12, var13, var14);
			}

			GL11.glTranslatef(0.5f, 0.8f, 0);
			GL11.glRotatef(180.0F, 0.0F, 0.0F, 1.0F);
			GL11.glScalef(1f / 16f, 1f / 16f, 1);

			render(ItemRenderType.ENTITY, stack);
			GL11.glPopMatrix();
		}
		GL11.glPopMatrix();
	}

	private void render(ItemRenderType type, ItemStack stack) {
		GL11.glPushMatrix();
		GL11.glDisable(GL11.GL_LIGHTING);
		IIcon icon = ItemGate.getLogic(stack).getIconItem();
		renderItem.renderIcon(0, 0, icon, 16, 16);

		if (type == ItemRenderType.ENTITY)
			GL11.glTranslatef(0, 0, -0.01f);

		icon = ItemGate.getMaterial(stack).getIconItem();
		if (icon != null)
			renderItem.renderIcon(0, 0, icon, 16, 16);

		for (IGateExpansion expansion : ItemGate.getInstalledExpansions(stack)) {
			icon = expansion.getOverlayItem();
			if (icon != null)
				renderItem.renderIcon(0, 0, icon, 16, 16);
		}
		GL11.glEnable(GL11.GL_LIGHTING);
		GL11.glPopMatrix();
	}
}
