package gui;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;

import kussmaulUtils.Refreshable;

public class PreviewStatusPanel extends JPanel {

	private static final long serialVersionUID = -7198039609391537335L;
	
	private static String format = "Time: %1$9s | Resolution: %2$9s | Original: %3$9s";
	private static String formatGif = "Time: %1$9s | Resolution: %2$9s | Original: %3$9s | Frame: %4$9s";
	
	private Refreshable r;
	
	private long renderStart;

	private int lastRendTime;
	private int origW;
	private int origH;
	private int dispW;
	private int dispH;
	private int frame;
	private int frameCount;
	
	private JSlider qualitySlider;
	private JLabel statusLabel;
	private JCheckBox skipFrames;
	
	private boolean error = false;

	public PreviewStatusPanel(Refreshable r) {
//		((FlowLayout) getLayout()).setAlignment(FlowLayout.TRAILING);
		this.r = r;

		initializeComponents();

		setBackground(new Color(50, 50, 50));

		add(new JLabel("Quality:"));
		add(qualitySlider);
		add(statusLabel);
		add(skipFrames);
		
		for(Component c : getComponents()) {
			if(c instanceof JComponent) {
				((JComponent) c).setFont(new Font(Font.MONOSPACED, Font.PLAIN, 10));
				((JComponent) c).setForeground(Color.white);
			}
		}
		refreshText();
	}

	private void initializeComponents() {
		qualitySlider = new JSlider(10, 100, 50) {
			private static final long serialVersionUID = -3633632766184431178L;

			@Override
			public Dimension getPreferredSize() {
				return new Dimension(super.getPreferredSize().width/2, new JLabel(" ").getPreferredSize().height);
			}
		};
		qualitySlider.addChangeListener(ce -> r.refresh());
		
		qualitySlider.setOpaque(false);
		statusLabel = new JLabel();
		skipFrames = new JCheckBox("Skip frames", false);
		skipFrames.setOpaque(false);
	}

	@Override
	public Dimension getMinimumSize() {
		return new Dimension(0, 0);
	}
	
	public void setRendering() {
		renderStart = System.currentTimeMillis();
		lastRendTime =-1;
		refreshText();
	}

	public void setFinishedRendering(int w, int h, int gifFrame) {
		error = false;
		lastRendTime = (int) (System.currentTimeMillis()-renderStart);
		dispW = w;
		dispH = h;
		this.frame = gifFrame;
		SwingUtilities.invokeLater(() -> refreshText());
	}
	
	public void setErrorRendering() {
		error = true;
		refreshText();
	}
	
	private void refreshText() {
		SwingUtilities.invokeLater(() -> {
			
			String renderText = error ? "error" : (lastRendTime == -1 ? "rendering" : lastRendTime+"ms");
			
			if(frameCount > 1)
				statusLabel.setText(String.format(formatGif, renderText, dispW+"x"+dispH, origW+"x"+origH, frame+1 +" of "+frameCount));
			else
				statusLabel.setText(String.format(format, renderText, dispW+"x"+dispH, origW+"x"+origH));
		});
	}

	public void setOriginalRes(int w, int h, int frameCount) {
		this.frameCount = frameCount;
		origW = w;
		origH = h;
	}
	
	public float getResolutionScale() {
		return qualitySlider.getValue()/100f;
	}
	
	public Dimension getOrigResolution() {
		return new Dimension(origW, origH);
	}
	
	public boolean toSkipFrames() {
		return skipFrames.isSelected();
	}
}