package com.bitfire.uracer.screen;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.glutils.FrameBuffer;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.bitfire.uracer.Input;
import com.bitfire.uracer.URacer;
import com.bitfire.uracer.resources.Art;
import com.bitfire.uracer.utils.UIUtils;

/** Implements a Screen that can overlay libgdx's UI elements on it
 * 
 * @author bmanuel */
public abstract class UIScreen extends Screen {
	protected Stage ui;
	protected Input input;

	public UIScreen () {
		input = URacer.Game.getInputSystem();
		ui = createStage();
	}

	protected abstract void setupUI (Stage ui);

	protected abstract void draw ();

	protected Stage createStage () {
		return UIUtils.newFittedStage();
	}

	protected void reload () {
		disable();
		ui.dispose();
		Art.disposeScreensData();
		Art.loadScreensData();
		ui = createStage();
		setupUI(ui);
		enable();
	}

	@Override
	public boolean init () {
		setupUI(ui);
		return true;
	}

	@Override
	public void enable () {
		Gdx.input.setInputProcessor(ui);
	}

	@Override
	public void disable () {
		Gdx.input.setInputProcessor(null);
	}

	@Override
	public void dispose () {
		disable();
		ui.dispose();
	}

	@Override
	public void render (FrameBuffer dest) {
		boolean hasDest = (dest != null);

		if (hasDest) {
			ui.getViewport().update(dest.getWidth(), dest.getHeight(), true);
			dest.begin();
		} else {
			ui.getViewport().update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
		}

		draw();

		if (hasDest) {
			dest.end();
		}
	}
}