/*******************************************************************************
 * Copyright 2014 Rafael Garcia Moreno.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/
package com.bladecoder.engineeditor.ui;

import java.io.File;

import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.utils.Timer;
import com.badlogic.gdx.utils.Timer.Task;
import com.bladecoder.engine.actions.Param;
import com.bladecoder.engineeditor.Ctx;
import com.bladecoder.engineeditor.common.EditorLogger;
import com.bladecoder.engineeditor.common.Message;
import com.bladecoder.engineeditor.ui.panels.EditDialog;
import com.bladecoder.engineeditor.ui.panels.FileInputPanel;
import com.bladecoder.engineeditor.ui.panels.InputPanel;
import com.bladecoder.engineeditor.ui.panels.InputPanelFactory;

public class CreateProjectDialog extends EditDialog {

	public static final String INFO = "A project folder with the proper structure will be created in the selected location.";

	private static final String ANDROID_SDK_PROP = "package.SDK";

	private InputPanel projectName;
	private InputPanel pkg;
	private InputPanel spinePlugin;
	private FileInputPanel location;
	private FileInputPanel androidSdk;

	public CreateProjectDialog(Skin skin) {
		super("CREATE PROJECT", skin);

		setInfo(INFO);

		projectName = InputPanelFactory.createInputPanel(skin, "Project Name", "Set the name of the project", true);

		pkg = InputPanelFactory.createInputPanel(skin, "Package",
				"The package will be used as package ID in Android and IOS. The launchers will be in this package too.",
				Param.Type.STRING, true, "com.myadv.game");

		spinePlugin = InputPanelFactory.createInputPanel(skin, "Spine animation support",
				"The game can use Spine animations, require Spine License to distribute the game. See http://www.esotericsoftware.com for more info.",
				Param.Type.BOOLEAN, true, "false");

		location = new FileInputPanel(skin, "Location", "Select the folder location for the project",
				FileInputPanel.DialogType.DIRECTORY);

		androidSdk = new FileInputPanel(skin, "Android SDK",
				"Select the Android SDK folder to create the Android package. If empty, the ANDROID_HOME variable will be used.",
				FileInputPanel.DialogType.DIRECTORY, false);

		addInputPanel(projectName);
		addInputPanel(pkg);
		addInputPanel(location);
		addInputPanel(spinePlugin);
		addInputPanel(androidSdk);

		String sdkprop = Ctx.project.getEditorConfig().getProperty(ANDROID_SDK_PROP);

		if (sdkprop != null && new File(sdkprop).exists()) {
			androidSdk.setText(sdkprop);
		}

		// getStage().setKeyboardFocus(projectName.getField());
	}

	@Override
	protected void ok() {
		try {
			Ctx.project.getEditorConfig().setProperty(ANDROID_SDK_PROP, androidSdk.getText());
			Ctx.project.saveProject();
		} catch (Exception ex) {
			String msg = ex.getClass().getSimpleName()
					+ " - " + ex.getMessage();
			Message.showMsgDialog(getStage(), "Error saving project", msg);
		}
		
		final Stage stage = getStage();

		Message.showMsg(getStage(), "Creating project...", true);
		Timer.schedule(new Task() {
			@Override
			public void run() {
				createProject(stage);
			}
		},1);
	}

	private void createProject(Stage stage) {

		try {
			Ctx.project.createProject(location.getText(), projectName.getText(), pkg.getText(), androidSdk.getText(),
					Boolean.parseBoolean(spinePlugin.getText()));

			Message.showMsg(stage, "Project successfully created", 3);
		} catch (Exception e) {
			String msg = e.getClass().getSimpleName() + " - "
					+ e.getMessage();
			Message.showMsgDialog(stage, "Error creating project", msg);
			EditorLogger.error(msg, e);
			return;
		}
	}

	@Override
	protected boolean validateFields() {
		boolean isOk = true;

		if (!projectName.validateField()) {
			isOk = false;
		}

		if (!pkg.validateField()) {
			isOk = false;
		}

		if (location.getFile() != null) {
			location.setError(false);
		} else {
			location.setError(true);
			isOk = false;
		}

//		if (System.getenv("ANDROID_HOME") == null && androidSdk.getFile() == null) {
//			androidSdk.setError(true);
//			isOk = false;
//		} else {
//			androidSdk.setError(false);
//		}

		return isOk;
	}
}
