package client.renderer.tileentity;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.lwjgl.opengl.GL11;

import client.Client;
import client.renderer.GlState;
import client.renderer.model.ModelBanner;
import client.renderer.texture.LayeredColorMaskTexture;
import common.collect.Lists;
import common.collect.Maps;
import common.color.DyeColor;
import common.init.Blocks;
import common.tileentity.TileEntityBanner;
import common.util.BlockPos;
import common.util.ExtMath;

public class TileEntityBannerRenderer extends TileEntitySpecialRenderer<TileEntityBanner>
{
    private static final Map<String, TileEntityBannerRenderer.TimedBannerTexture> DESIGNS = Maps.<String, TileEntityBannerRenderer.TimedBannerTexture>newHashMap();
    private static final String BANNERTEXTURES = "textures/blocks/banner.png";
    private ModelBanner bannerModel = new ModelBanner();

    public void renderTileEntityAt(TileEntityBanner te, double x, double y, double z, float partialTicks, int destroyStage)
    {
        boolean flag = te.getWorld() != null;
        boolean flag1 = !flag || te.getBlockType() == Blocks.banner;
        int i = flag ? te.getBlockMetadata() : 0;
//        long j = flag ? te.getWorld().getTime() : 0L;
        double j = flag ? (double)(System.nanoTime() / 1000L) / 50000.0 /* te.getWorld().getTime() */ : (double)partialTicks;
        GL11.glPushMatrix();
        float f = 0.6666667F;

        if (flag1)
        {
            GL11.glTranslatef((float)x + 0.5F, (float)y + 0.75F * f, (float)z + 0.5F);
            float f1 = (float)(i * 360) / 16.0F;
            GL11.glRotatef(-f1, 0.0F, 1.0F, 0.0F);
            this.bannerModel.bannerStand.showModel = true;
        }
        else
        {
            float f2 = 0.0F;

            if (i == 2)
            {
                f2 = 180.0F;
            }

            if (i == 4)
            {
                f2 = 90.0F;
            }

            if (i == 5)
            {
                f2 = -90.0F;
            }

            GL11.glTranslatef((float)x + 0.5F, (float)y - 0.25F * f, (float)z + 0.5F);
            GL11.glRotatef(-f2, 0.0F, 1.0F, 0.0F);
            GL11.glTranslatef(0.0F, -0.3125F, -0.4375F);
            this.bannerModel.bannerStand.showModel = false;
        }

        BlockPos blockpos = te.getPos();
        float f3 = (float)(blockpos.getX() * 7 + blockpos.getY() * 9 + blockpos.getZ() * 13) + (float)j; // + partialTicks;
        this.bannerModel.bannerSlate.rotateAngleX = (-0.0125F + 0.01F * ExtMath.cos(f3 * (float)Math.PI * 0.02F)) * (float)Math.PI;
        GlState.enableRescaleNormal();
        String resourcelocation = this.func_178463_a(te);

        if (resourcelocation != null)
        {
            this.bindTexture(resourcelocation);
            GL11.glPushMatrix();
            GL11.glScalef(f, -f, -f);
            this.bannerModel.renderBanner();
            GL11.glPopMatrix();
        }

        GlState.color(1.0F, 1.0F, 1.0F, 1.0F);
        GL11.glPopMatrix();
    }

    private String func_178463_a(TileEntityBanner bannerObj)
    {
        String s = bannerObj.getPatternResourceLocation();

        if (s.isEmpty())
        {
            return null;
        }
        else
        {
            TileEntityBannerRenderer.TimedBannerTexture tileentitybannerrenderer$timedbannertexture = (TileEntityBannerRenderer.TimedBannerTexture)DESIGNS.get(s);

            if (tileentitybannerrenderer$timedbannertexture == null)
            {
                if (DESIGNS.size() >= 256)
                {
                    long i = System.currentTimeMillis();
                    Iterator<String> iterator = DESIGNS.keySet().iterator();

                    while (iterator.hasNext())
                    {
                        String s1 = (String)iterator.next();
                        TileEntityBannerRenderer.TimedBannerTexture tileentitybannerrenderer$timedbannertexture1 = (TileEntityBannerRenderer.TimedBannerTexture)DESIGNS.get(s1);

                        if (i - tileentitybannerrenderer$timedbannertexture1.systemTime > 60000L)
                        {
                            Client.CLIENT.getTextureManager().deleteTexture(tileentitybannerrenderer$timedbannertexture1.bannerTexture);
                            iterator.remove();
                        }
                    }

                    if (DESIGNS.size() >= 256)
                    {
                        return null;
                    }
                }

                List<TileEntityBanner.EnumBannerPattern> list1 = bannerObj.getPatternList();
                List<DyeColor> list = bannerObj.getColorList();
                List<String> list2 = Lists.<String>newArrayList();

                for (TileEntityBanner.EnumBannerPattern tileentitybanner$enumbannerpattern : list1)
                {
                    list2.add("textures/blocks/banner_" + tileentitybanner$enumbannerpattern.getPatternName() + ".png");
                }

                tileentitybannerrenderer$timedbannertexture = new TileEntityBannerRenderer.TimedBannerTexture();
                tileentitybannerrenderer$timedbannertexture.bannerTexture = s;
                Client.CLIENT.getTextureManager().loadTexture(tileentitybannerrenderer$timedbannertexture.bannerTexture, new LayeredColorMaskTexture(BANNERTEXTURES, list2, list));
                DESIGNS.put(s, tileentitybannerrenderer$timedbannertexture);
            }

            tileentitybannerrenderer$timedbannertexture.systemTime = System.currentTimeMillis();
            return tileentitybannerrenderer$timedbannertexture.bannerTexture;
        }
    }

    static class TimedBannerTexture
    {
        public long systemTime;
        public String bannerTexture;

        private TimedBannerTexture()
        {
        }
    }
}
