package jp.co.cybec.laxide.wizards;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStream;

import jp.co.cybec.laxide.util.LetsAjaxWizardUtil;
import lax.LetsAjaxActivator;

import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.ILog;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
import org.eclipse.ui.ide.IDE;

/**
 * 新規LAXファイル作成ウィザード制御クラス.
 * <p>
 * 新規LAX作成時の「ウィザード画面−１」を生成・管理するクラスです。<br>
 * ウィザード画面の各ウィジェット、入力フィールドの初期設定を行います。
 * </p>
 * 
 * @author katoh
 */
public class LetsAjaxNewWizard extends Wizard implements INewWizard {

	/**  */
	private IStructuredSelection selection_;

	/** 新規ファイル作成ウィザードページ */
	private LetsAjaxNewWizardPage pageNewFile;

	/**
	 * コンストラクタ.
	 */
	public LetsAjaxNewWizard() {

		super();
		setNeedsProgressMonitor(true);
		setWindowTitle("LAXファイルの新規作成");
	}

	/**
	 * 初期処理.
	 * 
	 * @param workbench
	 * @param selection
	 * @see org.eclipse.ui.IWorkbenchWizard#init(IWorkbench,
	 *      IStructuredSelection)
	 */
	public void init(IWorkbench workbench, IStructuredSelection selection) {

		selection_ = selection;
	}

	/**
	 * ワークスペースにウィザードオブジェクトを設定します.
	 * 
	 * <p>
	 * ウィザードを生成して、Eclipseのワークスペースに出力します。
	 * </p>
	 * 
	 * @see org.eclipse.jface.wizard.Wizard#addPages()
	 */
	public void addPages() {

		// -------------------------------------------
		// 読み込み元ファイル取得ウィザードページ生成
		// -------------------------------------------

		// ページ生成
		pageNewFile = new LetsAjaxNewWizardPage(LetsAjaxNewWizardPage.PAGE_ID,
				selection_);
		// ページタイトル設定
		pageNewFile.setTitle("新規LAXファイル");
		// ページ説明書き設定
		pageNewFile.setDescription("新規LXAファイルを作成します。");
		// 新規作成ファイルのデフォルト名称設定
		pageNewFile.setFileName("sample.lax");
		// ウィジェットコンテナに格納
		addPage(this.pageNewFile);
	}

	/**
	 * 終了ボタン押下時正常判定.
	 * 
	 * <p>
	 * 終了ボタンが押下された場合のバリデーションを実装します。
	 * </p>
	 * 
	 * @return boolean ファイルが正しく作成されている場合は<code>true</code>を、そうでない場合は<code>false</code>を返します
	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
	 */
	public boolean performFinish() {
		// ファイル作成
		IFile file = pageNewFile.createNewFile();

		// 作成結果がNullの場合はエラー
		if (file == null) {
			return false;
		}
		//LetsAjaxNewWizardPage wizard = (LetsAjaxNewWizardPage) getPage(LetsAjaxNewWizardPage.PAGE_ID);
		
		try {
			
			// ファイルを出力する
			File newLaxfile = new File(file.getProject().getLocation().toString()
					+ "/" + file.getProjectRelativePath());
			newLaxfile.createNewFile();

			InputStream stream = new FileInputStream(newLaxfile);

			file.create(stream, true, null);

			// アクティブコントロールの変更
			IWorkbenchPage page = PlatformUI.getWorkbench()
					.getActiveWorkbenchWindow().getActivePage();
			
            // 作成したファイルをエディターで開く
			IDE.openEditor(page, file, true);
			
			LetsAjaxWizardUtil util = new LetsAjaxWizardUtil();
			util.initLaxDataToFile(newLaxfile);
			
			// html/js, html/cssのフォルダ構成が存在しなければ作成する
			Path htmlFolderPath = new Path(file.getProject().getLocation().toString() + "/html/");
			Path jsFolderPath = new Path(file.getProject().getLocation().toString() + "/html/js");
			Path cssFolderPath = new Path(file.getProject().getLocation().toString() + "/html/css");
			
			IFileStore htmlFileStore = EFS.getLocalFileSystem().getStore(htmlFolderPath);
			htmlFileStore.mkdir(EFS.SHALLOW, null);
			IFileStore jsFileStore = EFS.getLocalFileSystem().getStore(jsFolderPath);
			jsFileStore.mkdir(EFS.SHALLOW, null);
			IFileStore cssFileStore = EFS.getLocalFileSystem().getStore(cssFolderPath);
			cssFileStore.mkdir(EFS.SHALLOW, null);
			
			// プロジェクトのリフレッシュ
			file.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
			
		} catch (PartInitException piex) {
			Plugin plugin = LetsAjaxActivator.getInstance();
			ILog log = plugin.getLog();
			log.log(new Status(IStatus.ERROR, LetsAjaxActivator.PLUGIN_ID, 0,
					"LAXファイル新規作成エラー", piex));
			piex.printStackTrace();
			return false;
		} catch (Exception e) {
			// 
			Plugin plugin = LetsAjaxActivator.getInstance();
			ILog log = plugin.getLog();
			log.log(new Status(IStatus.ERROR, LetsAjaxActivator.PLUGIN_ID, 0,
					"LAXファイル新規作成エラー", e));
			e.printStackTrace();
			return false;
		}

		return true;
	}
}