package codechicken.enderstorage.storage.item;

import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import codechicken.core.ClientUtils;
import codechicken.lib.render.CCModelLibrary;
import codechicken.lib.render.CCRenderState;
import codechicken.lib.vec.Matrix4;
import codechicken.lib.vec.Rotation;
import codechicken.lib.vec.Vector3;
import codechicken.enderstorage.api.EnderStorageManager;
import codechicken.enderstorage.common.RenderCustomEndPortal;
import codechicken.enderstorage.internal.EnderStorageClientProxy;

public class EnderChestRenderer extends TileEntitySpecialRenderer {
    private static ModelEnderChest model = new ModelEnderChest();

    public EnderChestRenderer() {
    }

    public static void renderChest(int rotation, int freq, boolean owned, double x, double y, double z, int offset, float lidAngle) {
        TileEntityRendererDispatcher info = TileEntityRendererDispatcher.instance;
        renderEndPortal.render(x, y, z, 0, info.field_147560_j, info.field_147560_j, info.field_147561_k, info.field_147553_e);
        GL11.glColor4f(1, 1, 1, 1);

        CCRenderState.changeTexture("enderstorage:textures/enderchest.png");
        GL11.glPushMatrix();
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        GL11.glColor4f(1, 1, 1, 1);
        GL11.glTranslated(x, y + 1.0, z + 1.0F);
        GL11.glScalef(1.0F, -1F, -1F);
        GL11.glTranslatef(0.5F, 0.5F, 0.5F);
        GL11.glRotatef(rotation * 90, 0.0F, 1.0F, 0.0F);
        GL11.glTranslatef(-0.5F, -0.5F, -0.5F);
        model.chestLid.rotateAngleX = lidAngle;
        model.render(owned);
        GL11.glPopMatrix();

        GL11.glPushMatrix();
        GL11.glTranslated(x, y, z);
        renderButtons(freq, rotation, lidAngle);
        GL11.glPopMatrix();

        double time = ClientUtils.getRenderTime() + offset;
        Matrix4 pearlMat = CCModelLibrary.getRenderMatrix(
                new Vector3(x + 0.5, y + 0.2 + lidAngle * -0.5 + EnderStorageClientProxy.getPearlBob(time), z + 0.5),
                new Rotation(time / 3, new Vector3(0, 1, 0)),
                0.04);

        GL11.glDisable(GL11.GL_LIGHTING);
        CCRenderState.changeTexture("enderstorage:textures/hedronmap.png");
        CCRenderState.startDrawing(4);
        CCModelLibrary.icosahedron4.render(pearlMat);
        CCRenderState.draw();
        GL11.glEnable(GL11.GL_LIGHTING);
    }

    private static void renderButtons(int freq, int rot, double lidAngle) {
        CCRenderState.changeTexture("enderstorage:textures/buttons.png");

        drawButton(0, EnderStorageManager.getColourFromFreq(freq, 0), rot, lidAngle);
        drawButton(1, EnderStorageManager.getColourFromFreq(freq, 1), rot, lidAngle);
        drawButton(2, EnderStorageManager.getColourFromFreq(freq, 2), rot, lidAngle);
    }

    private static void drawButton(int button, int colour, int rot, double lidAngle) {
        float texx = 0.25F * (colour % 4);
        float texy = 0.25F * (colour / 4);

        GL11.glPushMatrix();

        EnderDyeButton ebutton = TileEnderChest.buttons[button].copy();
        ebutton.rotate(0, 0.5625, 0.0625, 1, 0, 0, lidAngle);
        ebutton.rotateMeta(rot);
        Vector3[] verts = ebutton.verts;

        Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        addVecWithUV(verts[7], texx + 0.0938, texy + 0.0625);
        addVecWithUV(verts[3], texx + 0.0938, texy + 0.1875);
        addVecWithUV(verts[2], texx + 0.1562, texy + 0.1875);
        addVecWithUV(verts[6], texx + 0.1562, texy + 0.0625);

        addVecWithUV(verts[4], texx + 0.0938, texy + 0.0313);
        addVecWithUV(verts[7], texx + 0.0938, texy + 0.0313);
        addVecWithUV(verts[6], texx + 0.1562, texy + 0.0624);
        addVecWithUV(verts[5], texx + 0.1562, texy + 0.0624);

        addVecWithUV(verts[0], texx + 0.0938, texy + 0.2186);
        addVecWithUV(verts[1], texx + 0.1562, texy + 0.2186);
        addVecWithUV(verts[2], texx + 0.1562, texy + 0.1876);
        addVecWithUV(verts[3], texx + 0.0938, texy + 0.1876);

        addVecWithUV(verts[6], texx + 0.1563, texy + 0.0626);
        addVecWithUV(verts[2], texx + 0.1563, texy + 0.1874);
        addVecWithUV(verts[1], texx + 0.1874, texy + 0.1874);
        addVecWithUV(verts[5], texx + 0.1874, texy + 0.0626);

        addVecWithUV(verts[7], texx + 0.0937, texy + 0.0626);
        addVecWithUV(verts[4], texx + 0.0626, texy + 0.0626);
        addVecWithUV(verts[0], texx + 0.0626, texy + 0.1874);
        addVecWithUV(verts[3], texx + 0.0937, texy + 0.1874);
        tessellator.draw();

        GL11.glPopMatrix();
    }

    private static void addVecWithUV(Vector3 vec, double u, double v) {
        Tessellator.instance.addVertexWithUV(vec.x, vec.y, vec.z, u, v);
    }

    public void renderTileEntityAt(TileEntity tile, double d, double d1, double d2, float f) {
        CCRenderState.reset();
        CCRenderState.setBrightness(tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord);
        CCRenderState.useNormals = true;

        TileEnderChest chest = (TileEnderChest) tile;
        renderChest(chest.rotation, chest.freq, !chest.owner.equals("global"), d, d1, d2,
                EnderStorageClientProxy.getTimeOffset(chest.xCoord, chest.yCoord, chest.zCoord), (float) chest.getRadianLidAngle(f));
    }

    public static final double phi = 1.618034;

    static RenderCustomEndPortal renderEndPortal = new RenderCustomEndPortal(0.626, 0.188, 0.812, 0.188, 0.812);
}