package org.dimdev.vanillafix.dynamicresources;

import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import org.lwjgl.opengl.GL11;

import java.lang.reflect.Field;

public class TextureMapRenderer {
    private static final DynamicStitcher stitcher;
    static {
        try {
            DynamicTextureMap map = (DynamicTextureMap) Minecraft.getMinecraft().getTextureMapBlocks();
            Field stitcherField = DynamicTextureMap.class.getDeclaredField("stitcher");
            stitcherField.setAccessible(true);
            stitcher = (DynamicStitcher) stitcherField.get(map);
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new AssertionError(e);
        }
    }

    public static void draw() {
        float alpha = 1;
        if (GuiScreen.isCtrlKeyDown()) {
            alpha = 0.5f;
        }

        // Bind texture atlas and disable scaling for debug render (see MixinGlStateManager)
        Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
        pushTextureIdentity();

        Minecraft.getMinecraft().entityRenderer.setupOverlayRendering();
        GlStateManager.enableAlpha();
        GlStateManager.enableBlend();
        GlStateManager.disableColorLogic();
        GlStateManager.color(1, 1, 1, alpha);
        drawTexture(5, 5, 0, 0, 230 * stitcher.getImageWidth() / stitcher.getImageHeight(), 230, 1, 1);

        popTextureMatrix();
    }

    private static void drawTexture(int x, int y, int textureX, int textureY, int width, int height, int textureWidth, int textureHeight) {
        double zLevel = 0;

        Tessellator tessellator = Tessellator.getInstance();
        BufferBuilder buffer = tessellator.getBuffer();
        buffer.begin(7, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(x, y + height, zLevel).tex(textureX, textureY + textureHeight).endVertex();
        buffer.pos(x + width, y + height, zLevel).tex(textureX + textureWidth, textureY + textureHeight).endVertex();
        buffer.pos(x + width, y, zLevel).tex(textureX + textureWidth, textureY).endVertex();
        buffer.pos(x, y, zLevel).tex(textureX, textureY).endVertex();
        tessellator.draw();
    }

    public static void pushTextureIdentity() {
        int oldMatrixMode = GlStateManager.glGetInteger(GL11.GL_MATRIX_MODE);
        GL11.glMatrixMode(GL11.GL_TEXTURE);
        GL11.glPushMatrix();
        GL11.glLoadIdentity();
        GL11.glMatrixMode(oldMatrixMode);
    }

    public static void popTextureMatrix() {
        int oldMatrixMode;
        oldMatrixMode = GlStateManager.glGetInteger(GL11.GL_MATRIX_MODE);
        GL11.glMatrixMode(GL11.GL_TEXTURE);
        GL11.glPopMatrix();
        GL11.glMatrixMode(oldMatrixMode);
    }
}