package client.gui;

import client.Client;
import client.gui.element.Bar;
import client.gui.element.Label;

public class GuiLoading extends Gui {
	public static interface Callback {
		void poll(Client gm, GuiLoading gui);
	}

	private final String message;
	private final Callback callback;

	private Label headerLabel;
	private Label taskLabel;
	private Bar progressBar1;
	private Bar progressBar2;
	
	public static GuiLoading makeServerTask(String message) {
		return new GuiLoading(message, new Callback() {
			public void poll(Client gm, GuiLoading gui) {
				int progress = gm.progress;
				if(progress < 0) {
					gui.resetBar();
				}
				else {
					gui.setBar(null, "Chunks", Math.max(1, gm.total));
					gui.setProgress(progress);
				}
				gui.setTask(gm.message);
			}
		});
	}
	
	public static GuiLoading makeWaitTask(String message) {
		return new GuiLoading(message, new Callback() {
			public void poll(Client gm, GuiLoading gui) {
			}
		});
	}
	
	public GuiLoading(String message, Callback callback) {
		this.message = message;
		this.callback = callback;
	}
	
	public void init(int width, int height) {
		this.taskLabel = this.add(new Label(0, 40, 500, 0, ""));
		this.progressBar1 = this.add(new Bar(0, 80, 500, 0));
		this.progressBar2 = this.add(new Bar(0, 120, 500, 0));
		this.shift();
		this.headerLabel = this.add(new Label(0, 40, width, 0, this.message));
		this.progressBar1.visible = false;
		this.progressBar2.visible = false;
	}
	
	public String getTitle() {
		return this.message;
	}
	
	public void setTask(String task) {
		this.taskLabel.setText(task == null ? "" : task);
	}
	
	public void setBar(String desc) {
		this.progressBar1.visible = true;
		this.progressBar1.setDescription(desc);
	}
	
	public void setBar(String desc, String unit, int total) {
		this.progressBar1.visible = true;
		this.progressBar1.setDescription(desc, unit, total);
	}
	
	public void setBar(String desc, int total) {
		this.progressBar1.visible = true;
		this.progressBar1.setDescription(desc, total);
	}
	
	public void setProgress(float progress) {
		this.progressBar1.setProgress(progress);
	}
	
	public void resetBar() {
		this.progressBar1.resetProgress();
		this.progressBar1.visible = false;
	}
	
	public void setSub(String desc) {
		this.progressBar2.visible = true;
		this.progressBar2.setDescription(desc);
	}
	
	public void setSub(String desc, String unit, int total) {
		this.progressBar2.visible = true;
		this.progressBar2.setDescription(desc, unit, total);
	}
	
	public void setSub(String desc, int total) {
		this.progressBar2.visible = true;
		this.progressBar2.setDescription(desc, total);
	}
	
	public void setSubProgress(float progress) {
		this.progressBar2.setProgress(progress);
	}
	
	public void resetSub() {
		this.progressBar2.resetProgress();
		this.progressBar2.visible = false;
	}
	
	public void updateScreen() {
		if(this.callback != null)
			this.callback.poll(this.gm, this);
	}
}
