package net.minecraft.util;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.IntBuffer;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.client.shader.Framebuffer;
import net.minecraft.event.ClickEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;

@SideOnly(Side.CLIENT)
public class ScreenShotHelper
{
	private static final Logger logger = LogManager.getLogger();
	private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
	private static IntBuffer pixelBuffer;
	private static int[] pixelValues;
	private static final String __OBFID = "CL_00000656";

	public static IChatComponent saveScreenshot(File p_148260_0_, int p_148260_1_, int p_148260_2_, Framebuffer p_148260_3_)
	{
		return saveScreenshot(p_148260_0_, (String)null, p_148260_1_, p_148260_2_, p_148260_3_);
	}

	public static IChatComponent saveScreenshot(File p_148259_0_, String p_148259_1_, int p_148259_2_, int p_148259_3_, Framebuffer p_148259_4_)
	{
		try
		{
			File file2 = new File(p_148259_0_, "screenshots");
			file2.mkdir();

			if (OpenGlHelper.isFramebufferEnabled())
			{
				p_148259_2_ = p_148259_4_.framebufferTextureWidth;
				p_148259_3_ = p_148259_4_.framebufferTextureHeight;
			}

			int k = p_148259_2_ * p_148259_3_;

			if (pixelBuffer == null || pixelBuffer.capacity() < k)
			{
				pixelBuffer = BufferUtils.createIntBuffer(k);
				pixelValues = new int[k];
			}

			GL11.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1);
			GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
			pixelBuffer.clear();

			if (OpenGlHelper.isFramebufferEnabled())
			{
				GL11.glBindTexture(GL11.GL_TEXTURE_2D, p_148259_4_.framebufferTexture);
				GL11.glGetTexImage(GL11.GL_TEXTURE_2D, 0, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
			}
			else
			{
				GL11.glReadPixels(0, 0, p_148259_2_, p_148259_3_, GL12.GL_BGRA, GL12.GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
			}

			pixelBuffer.get(pixelValues);
			TextureUtil.func_147953_a(pixelValues, p_148259_2_, p_148259_3_);
			BufferedImage bufferedimage = null;

			if (OpenGlHelper.isFramebufferEnabled())
			{
				bufferedimage = new BufferedImage(p_148259_4_.framebufferWidth, p_148259_4_.framebufferHeight, 1);
				int l = p_148259_4_.framebufferTextureHeight - p_148259_4_.framebufferHeight;

				for (int i1 = l; i1 < p_148259_4_.framebufferTextureHeight; ++i1)
				{
					for (int j1 = 0; j1 < p_148259_4_.framebufferWidth; ++j1)
					{
						bufferedimage.setRGB(j1, i1 - l, pixelValues[i1 * p_148259_4_.framebufferTextureWidth + j1]);
					}
				}
			}
			else
			{
				bufferedimage = new BufferedImage(p_148259_2_, p_148259_3_, 1);
				bufferedimage.setRGB(0, 0, p_148259_2_, p_148259_3_, pixelValues, 0, p_148259_2_);
			}

			File file3;

			if (p_148259_1_ == null)
			{
				file3 = getTimestampedPNGFileForDirectory(file2);
			}
			else
			{
				file3 = new File(file2, p_148259_1_);
			}

			ImageIO.write(bufferedimage, "png", file3);
			ChatComponentText chatcomponenttext = new ChatComponentText(file3.getName());
			chatcomponenttext.getChatStyle().setChatClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, file3.getAbsolutePath()));
			chatcomponenttext.getChatStyle().setUnderlined(Boolean.valueOf(true));
			return new ChatComponentTranslation("screenshot.success", new Object[] {chatcomponenttext});
		}
		catch (Exception exception)
		{
			logger.warn("Couldn\'t save screenshot", exception);
			return new ChatComponentTranslation("screenshot.failure", new Object[] {exception.getMessage()});
		}
	}

	private static File getTimestampedPNGFileForDirectory(File par0File)
	{
		String s = dateFormat.format(new Date()).toString();
		int i = 1;

		while (true)
		{
			File file2 = new File(par0File, s + (i == 1 ? "" : "_" + i) + ".png");

			if (!file2.exists())
			{
				return file2;
			}

			++i;
		}
	}
}