//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.publishing.wizards;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.epf.common.utils.FileUtil;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.LibraryServiceUtil;
import org.eclipse.epf.library.configuration.ConfigurationHelper;
import org.eclipse.epf.library.ui.preferences.LibraryUIPreferences;
import org.eclipse.epf.publishing.services.PublishOptions;
import org.eclipse.epf.publishing.ui.PublishingUIPlugin;
import org.eclipse.epf.publishing.ui.PublishingUIResources;
import org.eclipse.epf.publishing.ui.preferences.PublishingUIPreferences;
import org.eclipse.epf.ui.wizards.BaseWizardPage;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWizard;

/**
 * The Publish Method Configuration wizard.
 * 
 * @author Kelvin Low
 * @author Bingxue Xu
 * @author Jinhua Xi
 * @since 1.0
 */
public class PublishConfigurationWizard extends AbstractPublishWizard {

	// The wizard pages.
	protected PublishConfigSelectConfigPage selectConfigPage;

	protected PublishConfigPublishOptionsPage publishOptionsPage;

	private Map configProcesspageMap = new HashMap();

	/**
	 * Creates a new instance.
	 */
	public PublishConfigurationWizard() {
		super();
		setWindowTitle(PublishingUIResources.publishConfigWizard_title); //$NON-NLS-1$
	}

	/**
	 * @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
	 */
	public void init(IWorkbench workbench, IStructuredSelection selection) {
	}

	protected ImageDescriptor getImageDescriptor() {
		return 	PublishingUIPlugin.getDefault()
		.getImageDescriptor("full/wizban/PublishConfiguration.gif"); //$NON-NLS-1$

	}
	
	/**
	 * get the publish options
	 * @return PublishOptions
	 */
	public PublishOptions getPublishOptions() {
		if ( super.dataModel == null ) {
			super.dataModel = new PublishOptions();
		}
		
		return super.dataModel;
	}
	
	/**
	 * @see org.eclipse.jface.wizard.addPages()
	 */
	public void addPages() {
		ImageDescriptor imageDescriptor = getImageDescriptor();

		selectConfigPage = new PublishConfigSelectConfigPage(
				"PublishConfigSelectOverviewPage", dataModel); //$NON-NLS-1$
		selectConfigPage.setImageDescriptor(imageDescriptor);
		addPage(selectConfigPage);

		publishOptionsPage = new PublishConfigPublishOptionsPage(
				"PublishConfigPublishOptionsPage", dataModel); //$NON-NLS-1$
		publishOptionsPage.setImageDescriptor(imageDescriptor);
		addPage(publishOptionsPage);
	}

	/**
	 * get the select process vizwrd page
	 * 
	 * @param configName String the configuration name
	 * 
	 * @return IWizardPage
	 */
	public IWizardPage getSelProcessPage(String configName) {

		PublishConfigSelectProcessPage selectProcessPage = (PublishConfigSelectProcessPage) configProcesspageMap
				.get(configName);

		if (selectProcessPage == null) {
			ImageDescriptor imageDescriptor = PublishingUIPlugin.getDefault()
					.getImageDescriptor("full/wizban/PublishConfiguration.gif"); //$NON-NLS-1$

			selectProcessPage = new PublishConfigSelectProcessPage(
					"PublishConfigSelectProcessPage", dataModel); //$NON-NLS-1$
			selectConfigPage.setImageDescriptor(imageDescriptor);
			addPage(selectProcessPage);

			configProcesspageMap.put(configName, selectProcessPage);
		}

		return selectProcessPage;
	}

	/**
	 * get the next page for the given page
	 * @param page IWizardPage
	 * @return IWizardPage
	 */
	public IWizardPage getNextPage(IWizardPage page) {
		if (page == selectConfigPage) {
			if (dataModel.getSelectedConfig() != null) {
				String configName = dataModel.getSelectedConfig();
				MethodConfiguration config = LibraryServiceUtil
						.getMethodConfiguration(LibraryService.getInstance()
								.getCurrentMethodLibrary(), configName);
				List procs = ConfigurationHelper.getAllProcesses(config);
				if (procs != null && procs.size() > 0) {
					return getSelProcessPage(configName);
				} else {
					((BaseWizardPage)publishOptionsPage).onEnterPage(
							super.dataModel.getSelectedConfig());
					return publishOptionsPage;
				}
			} else
				return null;
		} else if (page == publishOptionsPage) {
			return null;
		} else {
			((BaseWizardPage)publishOptionsPage).onEnterPage(
					super.dataModel.getSelectedConfig());
			return publishOptionsPage;
		}
	}

	/**
	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
	 */
	public boolean canFinish() {
		return (this.getContainer().getCurrentPage() == publishOptionsPage && publishOptionsPage
				.isPageComplete());
	}

	/**
	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
	 */
	public boolean performFinish() {
		dataModel = publishOptionsPage.getPublishingOptions();
		boolean answer = checkAndCreateDir(dataModel.publicationPath);
		if (answer) {
			dataModel.setFinishPressed(true);
			PublishingUIPreferences.setPublishPath(dataModel.getSelectedConfig(),dataModel
					.getPublicationPath());
			PublishingUIPreferences.setTitle(dataModel.getSelectedConfig(),dataModel.getTitle());
			PublishingUIPreferences.setBannerImage(dataModel.getSelectedConfig(),dataModel.getBannerImage());
			PublishingUIPreferences.setAboutHTML(dataModel.getSelectedConfig(),dataModel.getAboutHTML());
			PublishingUIPreferences.setFeedbackURL(dataModel.getSelectedConfig(),dataModel.getFeedbackURL());
			PublishingUIPreferences.setIncludeGlossary(dataModel.getSelectedConfig(),dataModel
					.isGenerateGlossary());
			PublishingUIPreferences
					.setIncludeIndex(dataModel.getSelectedConfig(),dataModel.isGenerateIndex());
//			PublishingUIPreferences.setIncludeSearch(dataModel
//					.isGenerateSearchDB());
//			PublishingUIPreferences.setIncludeProcessCustomization(dataModel
//					.isUseApplet());
			PublishingUIPreferences.setCheckExternalLinks(dataModel.getSelectedConfig(),dataModel
					.isCheckExtLinks());
			PublishingUIPreferences.setConvertBrokenLinks(dataModel.getSelectedConfig(),dataModel.isConvertBrokenLinks());
			PublishingUIPreferences.setLightWeightTree(dataModel.getSelectedConfig(),dataModel.isGenerateLightWeightTree());
			PublishingUIPreferences.setExtraDescriptorInfo(dataModel.getSelectedConfig(),dataModel.isShowExtraDescriptorInfo());
			
			PublishingUIPreferences.setPublishUnopenActivitydd(dataModel.getSelectedConfig(), 
					dataModel.isAutoGenerateActivityDiagrams());
			PublishingUIPreferences.setPublishADForActivityExtension(dataModel.getSelectedConfig(), 
					dataModel.isUnopenExtendedActivityDiagram());
			
			PublishingUIPreferences.saveAllPreferences();
			LibraryUIPreferences.saveAllPreferences();
			
			return true;
		}
		dataModel.setFinishPressed(false);
		return false;
	}

	/**
	 * @see org.eclipse.jface.wizard.IWizard#performCancel()
	 */
	public boolean performCancel() {
		dataModel.setFinishPressed(false);
		return true;
	}

	/**
	 * Checks and creates the destination path.
	 */
	protected boolean checkAndCreateDir(String dir) {
		String defaultPublishPath = PublishingUIPreferences
				.getDefaultPublishPath();
		boolean answer = false;

		IPath ecPath = Path.fromOSString(dir);
		if (!ecPath.isAbsolute()) {
			String path = defaultPublishPath
					+ System.getProperty("file.separator") + dir; //$NON-NLS-1$
			answer = PublishingUIPlugin
					.getDefault()
					.getMsgDialog()
					.displayPrompt(
							PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
							PublishingUIResources.bind(PublishingUIResources.confirmPathDialog_text, path)); //$NON-NLS-1$

			if (answer) {
				dataModel.setPublicationPath(dir);
			} else {
				return false;
			}
		}

		File file = new File(dir);

		if (file.exists()) {
			File[] files = file.listFiles();
			if (files != null && files.length > 0) {
				answer = PublishingUIPlugin
						.getDefault()
						.getMsgDialog()
						.displayConfirmation(
								PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
								PublishingUIResources.bind(PublishingUIResources.overwriteDialog_text, dir)); //$NON-NLS-1$

				if (answer == true) {
					try {
						answer = FileUtil
								.deleteAllFiles(file.getAbsolutePath());
						if (answer == false) {
							PublishingUIPlugin
									.getDefault()
									.getMsgDialog()
									.displayError(
											PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
											PublishingUIResources.cannotPublishError_msg, //$NON-NLS-1$							
											PublishingUIResources.bind(PublishingUIResources.deleteFilesError_reason, dir)); //$NON-NLS-1$
							return false;

						}
					} catch (Exception e) {
						PublishingUIPlugin
								.getDefault()
								.getMsgDialog()
								.displayError(
										PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
										PublishingUIResources.cannotPublishError_msg, //$NON-NLS-1$							
										PublishingUIResources.bind(PublishingUIResources.deleteFilesError_reason, dir), e); //$NON-NLS-1$
						return false;
					}
				}
			} else {
				return true;
			}
		} else {
			try {
				answer = file.mkdirs();
			} catch (Exception e) {
				PublishingUIPlugin
						.getDefault()
						.getMsgDialog()
						.displayError(
								PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
								PublishingUIResources.cannotPublishError_msg, //$NON-NLS-1$
								PublishingUIResources.bind(PublishingUIResources.createDirError_reason, file.getAbsolutePath()), e); //$NON-NLS-1$
				return false;
			}
			if (!answer) {
				PublishingUIPlugin
						.getDefault()
						.getMsgDialog()
						.displayError(
								PublishingUIResources.publishConfigDialog_title, //$NON-NLS-1$
								PublishingUIResources.cannotPublishError_msg, //$NON-NLS-1$
								PublishingUIResources.bind(PublishingUIResources.createDirError_reason, file.getAbsolutePath())); //$NON-NLS-1$
				return false;
			}
		}

		return answer;
	}

}