package ei.game.gamestate;

import java.util.LinkedList;
import java.util.Queue;

import ei.engine.LWJGLGameWindow;
import ei.engine.math.Vector3f;
import ei.engine.scene.Sprite;
import ei.engine.sound.SoundLoader;
import ei.engine.state.GameState;
import ei.engine.state.GameStateManager;
import ei.engine.texture.TextureLoader;

/**
 * This class handels the loading of the
 * images and sounds to the memmory.
 * 
 * @author Ziver
 */
public class LoadingState extends GameState{
	// The things to load
	private Queue<String> loadTextures;
	private Queue<String> loadSounds;
	//  The name of the next state to activate after loading
	private String nextState;
	
	// Temp things for the loadingbar
	private int status;
	private Sprite bar;
	private Sprite loadBar;
	private Sprite background;
	
	/**
	 * Creates a loadingstate
	 * @param name The name of the state
	 */
	public LoadingState(String name,String nextState) {
		super(name);
		this.nextState = nextState;
		status = 0;
		loadTextures = new LinkedList<String>();
		loadSounds = new LinkedList<String>();
		bar = new Sprite("Bar","data/loadbar_front.png");
		bar.setLocation(new Vector3f(
				(LWJGLGameWindow.getWidth()/2),
				(LWJGLGameWindow.getHeight()/2),0.0f));
		loadBar = new Sprite("LoadingBar","data/loadbar.png");
		loadBar.setLocation(new Vector3f(
				(LWJGLGameWindow.getWidth()/2)-loadBar.getWidth(),
				(LWJGLGameWindow.getHeight()/2)+3,0.0f));
		background = new Sprite("Bar","data/loadbar_back.png");
		background.setLocation(new Vector3f(
				(LWJGLGameWindow.getWidth()/2),
				(LWJGLGameWindow.getHeight()/2),0.0f));
	}
	
	/**
	 * Add a texture to be loaded
	 * @param url
	 */
	public void addTexture(String url){
		loadTextures.add(url);
	}
	
	/**
	 * Add a sound to be loaded
	 * @param url
	 */
	public void addSound(String url){
		loadSounds.add(url);
	}
	
	/**
	 * Loads the things
	 */
	public void update() {
		if(!loadTextures.isEmpty()){
			TextureLoader.getTextureLoaderInstance().getTexture(loadTextures.poll());
			status++;
		}
		else if(!loadSounds.isEmpty()){
			SoundLoader.getInstnace().loadSound(loadSounds.poll());
			status++;
		}
		else{
			status++;
			if(status >= 100){
				//deactivate this state and activate the next one
				GameStateManager.getInstance().removeState(this);
				GameStateManager.getInstance().setActive(nextState);
			}
			
		}
		background.update();
		loadBar.update();
		bar.update();
	}
	
	/**
	 * Render the load bar
	 */
	public void render() {
		// Calculate the procentage
		float procent = (float)status/100;//(loadTextures.size()+loadSounds.size());
		System.out.println("lol: "+procent);
		loadBar.setLocation(new Vector3f(
				(LWJGLGameWindow.getWidth()/2)-loadBar.getWidth()+(loadBar.getWidth()*procent),
				(LWJGLGameWindow.getHeight()/2)+6,0.0f));
		//render the bar
		background.render();
		loadBar.render();
		bar.render();
	}

}
