/**
 * プロジェクト名 laxIde
 * クラス名 LetsAjaxWebAppGenerationWizardForAction.java
 * 作成日: 2007/05/28
 * 
 */
package jp.co.cybec.laxide.wizards;

import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;

import jp.co.cybec.laxGenerator.LaxFileManager;
import lax.LetsAjaxActivator;

import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

/**
 * DhtmlとJSを生成するウィザードクラス
 * <p>
 * ファイル名：LetsAjaxWebAppGenerationWizardForAction.java
 * </p>
 * 
 * @author nakamura 作成時刻：11:03:07
 * 
 */
public class LetsAjaxWebAppGenerationWizardForAction extends Wizard implements
		INewWizard {

	/**  */
	private IStructuredSelection selection;

	/** 読み込み元ファイル取得ウィザードページ */
	private LetsAjaxLoadWizardPage pageLoad;

	// // // /** ジェネレート先指定ウィザードページ */
	// private LetsAjaxWebAppGenerationWizardPage1 pageGene;

	/** ジェネレート先指定ウィザードページ */
	private LetsAjaxGenerateFileNameWizardPage pageGene;

	/** デフォルトジェネレートファイル名 */
	public static final String DEFAULT_FILE_NAME = "test";

	// private IWorkbenchWindow window;

	public LetsAjaxWebAppGenerationWizardForAction() {
		super();
	}

	/**
	 * @see org.eclipse.jface.wizard.Wizard#addPage(org.eclipse.jface.wizard.IWizardPage)
	 */
	@Override
	public void addPages() {
		// ページ生成
		pageLoad = new LetsAjaxLoadWizardPage(LetsAjaxLoadWizardPage.PAGE_ID);
		// ページタイトル設定
		pageLoad.setTitle("HTML、JSファイル生成");
		// ページ説明書き設定
		pageLoad.setDescription("LAXファイルからHTML、JSファイルを生成します。");
		// ウィジェットコンテナに格納
		addPage(pageLoad);

		// ページ生成
		this.pageGene = new LetsAjaxGenerateFileNameWizardPage(
				LetsAjaxGenerateFileNameWizardPage.PAGE_ID);
		// ページタイトル設定
		this.pageGene.setTitle("生成ファイル名指定");
		// ページ説明書き設定
		this.pageGene.setDescription("LAXファイルからHTML、JSファイルを生成します。");
		// ウィジェットコンテナに格納
		addPage(this.pageGene);
	}

	/**
	 * @see org.eclipse.jface.wizard.Wizard#performCancel()
	 */
	@Override
	public boolean performCancel() {
		return true;
	}

	/**
	 * HTMLファイル出力処理をここに書く。出力先やレイアウトファイルの選択 はウィザードの値を使用する。
	 * 
	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
	 */
	@Override
	public boolean performFinish() {
		boolean isSuccess = false;
		try {
			String projectFilePath = getRootPath(pageLoad.getFilePath());
			pageGene.setGenerateDir(projectFilePath);

			String layoutFileName = pageLoad.getFilePath();
			String filePath = pageGene.getGenerateDir();
			String fileName = pageGene.getHtmlFileName() + ".html";
			String jsFileName = "js/" + pageGene.getHtmlFileName() + ".js";
			String dataSourceFile = pageLoad.getDataSourceFilePath();

			IWorkbench workbench = PlatformUI.getWorkbench();
			IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
			Shell shell = window.getShell();
			// プログレスバーを使う
			ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell);
			GenerateWithProgress generateThread = new GenerateWithProgress(
					layoutFileName, filePath, fileName, jsFileName,
					dataSourceFile);
			dialog.run(true, true, generateThread);
			return true;

		} catch (Exception e) {
			Plugin plugin = LetsAjaxActivator.getInstance();
			ILog log = plugin.getLog();
			log.log(new Status(IStatus.ERROR, LetsAjaxActivator.PLUGIN_ID, 0,
					"アプリケーションエラー", e));
			e.printStackTrace();
		}
		return isSuccess;
	}

	private String getRootPath(String filePath) {
		int index = filePath.lastIndexOf("\\");
		if (index == -1) {
			index = filePath.lastIndexOf("/");
			if (index == -1) {
				index = 0;
			}
		}
		return filePath.substring(0, index);
	}

	public void init(IWorkbench workbench, IStructuredSelection selection) {
		System.out.println("INIT WIZARD 1");
		setNeedsProgressMonitor(true);
		// this.window = workbench.getActiveWorkbenchWindow();
		this.selection = selection;
		System.out.println("INIT WIZARD 2");
	}

	private class GenerateWithProgress implements IRunnableWithProgress {
		private String layoutFileName;

		private String filePath;

		private String fileName;

		private String jsFileName;

		private String dataSourceFile;

		public GenerateWithProgress(String layoutFileName, String filePath,
				String fileName, String jsFileName, String dataSourceFile) {
			this.layoutFileName = layoutFileName;
			this.fileName = fileName;
			this.filePath = filePath;
			this.jsFileName = jsFileName;
			this.dataSourceFile = dataSourceFile;
		}

		public void run(IProgressMonitor monitor)
				throws InvocationTargetException, InterruptedException {
			monitor.beginTask("HTML/JavaScriptを自動生成中...", 10);
			try {
				monitor.subTask("LAXファイル解析");
				monitor.worked(1);

				LaxFileManager generator = new LaxFileManager(
						this.layoutFileName, this.fileName);
				Map map = generator.toAppFiles(this.dataSourceFile,
						LetsAjaxWizardsConstant.JS_DICTIONARY);

				monitor.subTask("LAXファイル解析完了...。ファイル生成開始");
				monitor.worked(3);
				LetsAjaxFileGenerateDelegate delegate = new LetsAjaxFileGenerateDelegate();
				delegate.generateHtml(map, filePath + "/html/" + fileName);
				delegate.generateJS((List) map.get(LaxFileManager.SCRIPT_LIST),
						filePath + "/html/" + jsFileName);
				monitor.subTask("ファイルのコピー");
				monitor.worked(3);

				delegate.copyJsFiles(map, pageGene.getGenerateDir() + "/html");
				delegate.copyCssFiles(map, pageGene.getGenerateDir() + "/html");

				monitor.subTask("ファイル生成完了");
				monitor.worked(3);
				if (monitor.isCanceled()) {
					throw new InterruptedException("Cancel has been requested.");
				}

			} catch (Exception e) {
				throw new InvocationTargetException(e);
			}

			monitor.done();
		}
	}

}
