package sg.states;

import java.util.logging.Logger;

import sg.env.Environment;
import sg.input.SGThirdPersonHandler;
import sg.util.SGUtil;

import com.jme.input.InputHandler;
import com.jme.light.PointLight;
import com.jme.math.Vector3f;
import com.jme.renderer.ColorRGBA;
import com.jme.renderer.Renderer;
import com.jme.scene.Node;
import com.jme.scene.state.LightState;
import com.jme.system.DisplaySystem;
import com.jmex.game.state.CameraGameState;
import com.jmex.game.state.GameStateManager;
import com.jmex.physics.DynamicPhysicsNode;
import com.jmex.physics.PhysicsDebugger;
import com.jmex.physics.PhysicsSpace;
import com.jmex.physics.StaticPhysicsNode;

public class InGameState extends CameraGameState {
	/** The Keyboard/ mouse input handler */
	protected InputHandler input;
	/** The environment of the game */
	protected Environment environment;
	/** The physics space */
	private PhysicsSpace physicsSpace;
	/** The Speed of the physics */
	private float physicsSpeed = 1;
	/** Render pass manager */
	//protected BasicPassManager passManager;

	public InGameState(String name) {
		super(name);

		// Pass (render thingies)
		//passManager = new BasicPassManager();

		//physics				
		physicsSpace = PhysicsSpace.create();

		physicsSpace.setDirectionalGravity(new Vector3f(0f, 0f, 0f));
		StaticPhysicsNode staticNode = physicsSpace.createStaticNode();
		DynamicPhysicsNode dynamicNode = physicsSpace.createDynamicNode();
		rootNode.attachChild(dynamicNode);
		rootNode.attachChild(staticNode);

		// environment				
		environment = new Environment(rootNode);
		rootNode.attachChild(environment);

		// ship			
		Node ship = SGUtil.loadModel("sg/data/models/ships/G6.3ds");
		ship.setLocalTranslation(new Vector3f( 0, 0, 40));
		rootNode.attachChild(ship);

		// inputs
		input = new SGThirdPersonHandler( cam, ship );

		// lights
		/** Set up a basic, default light. */
		PointLight light = new PointLight();
		light.setDiffuse( new ColorRGBA( 0.75f, 0.75f, 0.75f, 0.75f ) );
		light.setAmbient( new ColorRGBA( 0.5f, 0.5f, 0.5f, 1.0f ) );
		light.setLocation( new Vector3f( 100, 100, 100 ) );
		light.setEnabled( true );

		/** Attach the light to a lightState and the lightState to rootNode. */
		LightState lightState = DisplaySystem.getDisplaySystem().getRenderer().createLightState();
		lightState.setEnabled( true );
		lightState.attach( light );
		rootNode.setRenderState( lightState );
		rootNode.updateRenderState();

		HudState hud = new HudState("hud");
		GameStateManager.getInstance().attachChild(hud);

		cam.setFrustumFar(5000);

		// ***************** Done loading **********************************
		setActive(true);

	}

	public void setActive(boolean b){
		if(b){
			this.active = true;
			super.setActive(b);
			GameStateManager.getInstance().activateChildNamed("hud");
		}
		else{
			this.active = false;
			super.setActive(b);
			GameStateManager.getInstance().deactivateChildNamed("hud");
		}
	}

	public void stateUpdate(float tpf) {		
		input.update(tpf);

		environment.update();

		if ( tpf > 0.2 || Float.isNaN( tpf ) ) {
			Logger.getLogger( PhysicsSpace.LOGGER_NAME ).warning( "Maximum physics update interval is 0.2 seconds - capped." );
			physicsSpace.update( 0.2f * physicsSpeed );
		}
		else physicsSpace.update( tpf * physicsSpeed );

		//passManager.updatePasses(tpf);
	}

	public void stateRender(float tpf){
		Renderer r = DisplaySystem.getDisplaySystem().getRenderer();

		// debug
		PhysicsDebugger.drawPhysics( physicsSpace, r );

		/** Have the PassManager render. */
		//passManager.renderPasses(r);
	}

}
