package resonantinduction.electrical.transformer;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.ResourceLocation;

import org.lwjgl.opengl.GL11;

import resonantinduction.core.Reference;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.render.CalclaviaRenderHelper;
import calclavia.lib.utility.LanguageUtility;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

@SideOnly(Side.CLIENT)
public class RenderTransformer
{
	public static final ModelTransformer MODEL = new ModelTransformer();
	public static final ResourceLocation TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_TEXTURE_DIRECTORY + "transformer.png");

	public static void render(PartTransformer part, double x, double y, double z)
	{
		String status = LanguageUtility.getLocal((part.stepUp() ? "tooltip.transformer.stepUp" : "tooltip.transformer.stepDown"));

		EntityPlayer player = Minecraft.getMinecraft().thePlayer;
		MovingObjectPosition movingPosition = player.rayTrace(5, 1f);

		if (movingPosition != null)
		{
			if (new Vector3(part.x(), part.y(), part.z()).equals(new Vector3(movingPosition)))
			{
				CalclaviaRenderHelper.renderFloatingText(status, (float) (x + 0.5), (float) (y - 1), (float) (z + 0.5));
			}
		}

		GL11.glPushMatrix();
		GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F);
		GL11.glScalef(1.0F, -1F, -1F);

		switch (part.placementSide)
		{
			case DOWN:

				switch (part.face)
				{
					case 0:
						GL11.glRotatef(90, 0, 1, 0);
						break;
					case 1:
						GL11.glRotatef(180, 0, 1, 0);
						break;
					case 2:
						GL11.glRotatef(-90, 0, 1, 0);
						break;
					case 3:
						break;
				}
				break;
			case UP:
				GL11.glRotatef(180, 0, 0, 1);
				GL11.glTranslatef(0, -2, 0);
				switch (part.face)
				{
					case 0:
						GL11.glRotatef(90, 0, 1, 0);
						break;
					case 1:
						GL11.glRotatef(180, 0, 1, 0);
						break;
					case 2:
						GL11.glRotatef(-90, 0, 1, 0);
						break;
					case 3:
						break;
				}
				break;
			case NORTH:
				GL11.glRotatef(90, 1, 0, 0);
				GL11.glTranslatef(0, -1, -1);
				switch (part.face)
				{
					case 0:
						GL11.glRotatef(90, 0, 1, 0);
						break;
					case 1:
						GL11.glRotatef(180, 0, 1, 0);
						break;
					case 2:
						GL11.glRotatef(-90, 0, 1, 0);
						break;
					case 3:
						break;
				}
				break;
			case SOUTH:
				GL11.glRotatef(-90, 1, 0, 0);
				GL11.glTranslatef(0, -1, 1);
				switch (part.face)
				{
					case 0:
						GL11.glRotatef(-90, 0, 1, 0);
						break;
					case 1:
						break;
					case 2:
						GL11.glRotatef(90, 0, 1, 0);
						break;
					case 3:
						GL11.glRotatef(180, 0, 1, 0);
						break;

				}
				break;
			case WEST:
				GL11.glRotatef(90, 0, 0, 1);
				GL11.glTranslatef(1, -1, 0);
				switch (part.face)
				{
					case 0:
						break;
					case 1:
						GL11.glRotatef(90, 0, 1, 0);
						break;
					case 2:
						GL11.glRotatef(180, 0, 1, 0);
						break;
					case 3:
						GL11.glRotatef(-90, 0, 1, 0);
						break;
				}
				break;
			case EAST:
				GL11.glRotatef(-90, 0, 0, 1);
				GL11.glTranslatef(-1, -1, 0);
				switch (part.face)
				{
					case 0:
						GL11.glRotatef(180, 0, 1, 0);
						break;
					case 1:
						GL11.glRotatef(-90, 0, 1, 0);
						break;
					case 2:
						break;
					case 3:
						GL11.glRotatef(90, 0, 1, 0);
						break;
				}
				break;
		}

		FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE);
		MODEL.render(0.0625F);
		GL11.glPopMatrix();
	}
}