/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.jme3.gde.welcome;

import atmosphere.Planet;
import atmosphere.PlanetRendererState;
import com.jme3.gde.core.assets.ProjectAssetManager;
import com.jme3.gde.core.scene.PreviewRequest;
import com.jme3.gde.core.scene.SceneApplication;
import com.jme3.gde.core.scene.SceneListener;
import com.jme3.gde.core.scene.SceneRequest;
import com.jme3.gde.core.sceneexplorer.nodes.NodeUtility;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.niftygui.NiftyJmeDisplay;
import com.jme3.renderer.Caps;
import com.jme3.renderer.queue.RenderQueue.Bucket;
import com.jme3.renderer.queue.RenderQueue.ShadowMode;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Sphere;
import com.jme3.texture.Image;
import com.jme3.texture.TextureCubeMap;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.controls.checkbox.CheckboxControl;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.nifty.screen.ScreenController;
import java.net.URL;
import java.util.concurrent.Callable;
import org.netbeans.api.javahelp.Help;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup;
import org.openide.util.NbPreferences;

/**
 *
 * @author normenhansen
 */
public class WelcomeScreen implements ScreenController {

    PlanetRendererState planetView;
    SceneRequest request;
    NiftyJmeDisplay niftyDisplay;
    Nifty nifty;
    Screen screen;
    Spatial skyBox;

    public void startScreen() {
        final Node rootNode = new Node("Welcome Screen");
        request = new SceneRequest(this, NodeUtility.createNode(rootNode), new ProjectAssetManager(null));
        request.setHelpCtx(new HelpCtx("com.jme3.gde.core.about"));
        request.setWindowTitle("Welcome to jMonkeyPlatform");
        final WelcomeScreen welcomeScreen = this;
        final DirectionalLight dirLight = new DirectionalLight();
        dirLight.setDirection(new Vector3f(.1f, 1, .1f).normalizeLocal());
        dirLight.setColor(ColorRGBA.Gray);
        SceneApplication.getApplication().addSceneListener(new SceneListener() {

            @Override
            public void sceneRequested(SceneRequest request) {
                if (request.getRequester() == WelcomeScreen.this) {
                    //FIXME: planet location dont work?
                    if (SceneApplication.getApplication().getRenderer().getCaps().contains(Caps.OpenGL21)) {
                        planetView = new PlanetRendererState(new Planet(100f, new Vector3f(0, 0, 0)), dirLight);
                        SceneApplication.getApplication().getStateManager().attach(planetView);
                    }
                    SceneApplication.getApplication().getViewPort().getScenes().get(0).addLight(dirLight);
                    SceneApplication.getApplication().getCamera().setLocation(new Vector3f(0, 0, 400));
                    setupSkyBox();
                    niftyDisplay = new NiftyJmeDisplay(SceneApplication.getApplication().getAssetManager(),
                            SceneApplication.getApplication().getInputManager(),
                            SceneApplication.getApplication().getAudioRenderer(),
                            SceneApplication.getApplication().getGuiViewPort());
                    nifty = niftyDisplay.getNifty();
                    try {
                        nifty.fromXml("Interface/WelcomeScreen.xml", new URL("nbres:/Interface/WelcomeScreen.xml").openStream(), "start", welcomeScreen);
                    } catch (Exception ex) {
                        Exceptions.printStackTrace(ex);
                    }

                    // attach the nifty display to the gui view port as a processor
                    SceneApplication.getApplication().getGuiViewPort().addProcessor(niftyDisplay);
                }
            }

            @Override
            public boolean sceneClose(SceneRequest request) {
                SceneApplication.getApplication().getViewPort().getScenes().get(0).removeLight(dirLight);
                skyBox.removeFromParent();
                SceneApplication.getApplication().getGuiViewPort().removeProcessor(niftyDisplay);
                nifty.exit();
                if (planetView != null) {
                    SceneApplication.getApplication().getStateManager().detach(planetView);
                }
                SceneApplication.getApplication().removeSceneListener(this);
                return true;
            }

            @Override
            public void previewRequested(PreviewRequest request) {
            }
        });
        SceneApplication.getApplication().enqueue(new Callable<Object>() {

            @Override
            public Object call() throws Exception {
                SceneApplication.getApplication().requestScene(request);
                return null;
            }
        });
    }

    private void setupSkyBox() {
        Mesh sphere = new Sphere(32, 32, 10f);
        sphere.setStatic();
        skyBox = new Geometry("SkyBox", sphere);
        skyBox.setQueueBucket(Bucket.Sky);
        skyBox.setShadowMode(ShadowMode.Off);

        Image cube = SceneApplication.getApplication().getAssetManager().loadTexture("Textures/blue-glow-1024.dds").getImage();
        TextureCubeMap cubemap = new TextureCubeMap(cube);

        Material mat = new Material(SceneApplication.getApplication().getAssetManager(), "Common/MatDefs/Misc/Sky.j3md");
        mat.setBoolean("SphereMap", false);
        mat.setTexture("Texture", cubemap);
        mat.setVector3("NormalScale", new Vector3f(1, 1, 1));
        skyBox.setMaterial(mat);

        ((Node) SceneApplication.getApplication().getViewPort().getScenes().get(0)).attachChild(skyBox);
    }

    public void setNoStartup() {
        NbPreferences.forModule(Installer.class).put("NO_WELCOME_SCREEN", "true");
    }

    public void startUpdating() {
        nifty.gotoScreen("updating");
    }

    public void startIntro() {
        nifty.gotoScreen("intro");
    }

    public void startPlanet() {
        nifty.gotoScreen("planet");
    }

    public void creatingProjects() {
        Lookup.getDefault().lookup(Help.class).showHelp(new HelpCtx("sdk.project_creation"));
    }

    public void importingModels() {
        Lookup.getDefault().lookup(Help.class).showHelp(new HelpCtx("sdk.model_loader_and_viewer"));
    }

    public void editingScenes() {
        Lookup.getDefault().lookup(Help.class).showHelp(new HelpCtx("sdk.scene_composer"));
    }

    public void editingCode() {
        Lookup.getDefault().lookup(Help.class).showHelp(new HelpCtx("sdk.code_editor"));
    }

    public void updatingJmp() {
        Lookup.getDefault().lookup(Help.class).showHelp(new HelpCtx("com.jme3.gde.core.updating"));
    }

    public void tutorials() {
        Lookup.getDefault().lookup(Help.class).showHelp(new HelpCtx("jme3.beginner.hello_simpleapplication"));
    }

    public void quit() {
        if (screen.findNiftyControl("checkbox", CheckboxControl.class).isChecked()) {
            setNoStartup();
        }
        SceneApplication.getApplication().closeScene(request);
    }

    public void bind(Nifty nifty, Screen screen) {
        this.nifty = nifty;
        this.screen = screen;
    }

    public void onStartScreen() {
    }

    public void onEndScreen() {
    }
}