//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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.export.services;

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

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.epf.export.ExportPlugin;
import org.eclipse.epf.export.ExportResources;
import org.eclipse.epf.library.IConfigurationClosure;
import org.eclipse.epf.library.ILibraryManager;
import org.eclipse.epf.library.LibraryManagerFactory;
import org.eclipse.epf.library.LibraryService;
import org.eclipse.epf.library.LibraryServiceUtil;
import org.eclipse.epf.library.configuration.ConfigurationClosure;
import org.eclipse.epf.library.layout.LayoutResources;
import org.eclipse.epf.library.project.MethodLibraryProject;
import org.eclipse.epf.library.util.LibraryUtil;
import org.eclipse.epf.persistence.refresh.RefreshJob;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodLibrary;

/**
 * Exports a library configuration.
 * 
 * @author Jinhua Xi
 * @since 1.0
 */
public class ConfigurationExportService {

	public static String excludes = ".copyarea.dat, **/.copyarea.dat, .copyarea.db, **/.copyarea.db"; //$NON-NLS-1$
	private ConfigurationExportData data;

	/**
	 * Creates a new instance.
	 */
	public ConfigurationExportService(ConfigurationExportData data) {
		this.data = data;
	}
	
	/**
	 * Run to export a configuration closure
	 */
	public void run(IProgressMonitor monitor) {
		try {
			if (data.selectedConfigs == null
					|| data.selectedConfigs.size() == 0) {
				return;
			}
			monitor.setTaskName(ExportResources.ConfigurationExportService_MSG0); //$NON-NLS-1$
			String exportLibPath = data.llData.getParentFolder();
			File exportLibFolder = new File(exportLibPath);
			if (!exportLibFolder.exists()) {
				exportLibFolder.mkdir();
			}
			MethodConfiguration config = (MethodConfiguration) data.selectedConfigs
					.get(0);
			exportConfig(config.getName(), exportLibFolder.getAbsolutePath(),
					monitor);
		} catch (Exception e) {
			ExportPlugin.getDefault().getLogger().logError(e);
		}
	}

	/**
	 * Export a configuration closure
	 */
	public void exportConfig(String selectedConfigName, String filePath,
			IProgressMonitor monitor) throws Exception {

		// need to disable the workspace refreshing
		boolean refresh = RefreshJob.getInstance().isEnabled();
		try {
			if (refresh) {
				// disable resource refreshing during import
				//
				RefreshJob.getInstance().setEnabled(false);
			}
			doEexportConfig(selectedConfigName, filePath, monitor);
		} finally {
			if (refresh) {
				// re-enable resource refreshing
				//
				RefreshJob.getInstance().setEnabled(true);
			}
		}
	}

	private void doEexportConfig(String selectedConfigName, String filePath,
			IProgressMonitor monitor) throws Exception {

		MethodLibrary currentLib = LibraryService.getInstance()
				.getCurrentMethodLibrary();

		try {
			// Load the whole Method Library.
			LibraryUtil.loadAll(currentLib);
		} catch (Throwable e) {
			ExportPlugin.getDefault().getLogger().logError(
					"Error loading library", e); //$NON-NLS-1$
			data.errorMsg = ExportResources.ConfigurationExportService_MSG2; //$NON-NLS-1$
			return;
		}

		// Copy the current library to a new library,
		// since we need to make changes when packaging the new library.
		MethodLibrary newLibrary = null;
		try {
			newLibrary = (MethodLibrary) EcoreUtil.copy(currentLib);
		} catch (Throwable e) {
			ExportPlugin.getDefault().getLogger().logError(e);
			data.errorMsg = ExportResources.ConfigurationExportService_MSG4; //$NON-NLS-1$
			return;
		}

		IConfigurationClosure closure = null;
		ILibraryManager libMgr = null;
		try {
			// Detach the new library from the current resource so it can be
			// added to a new Library Processor instance.
			LibraryUtil.detachFromResource(newLibrary);

			// Create a new Library Manager and create a new resource for the
			// new library.
			// TODO: Update the UI to prompt for the method library type.
			Map params = new HashMap();
			params.put("library.path", filePath); //$NON-NLS-1$
			
			// this will not work since this will mess up the main library
			// Jinhua Xi 07/13/06
//			MethodLibrary library = LibraryService.getInstance()
//					.createMethodLibrary("library.xmi", "xmi", params); //$NON-NLS-1$ //$NON-NLS-2$
//			LibraryService.getInstance().replaceMethodLibrary(library,
//					newLibrary);
//			LibraryService.getInstance().setCurrentMethodLibrary(newLibrary);

			String name = "library.xmi";	//$NON-NLS-1$
			String type = "xmi";		//$NON-NLS-1$
			libMgr = LibraryManagerFactory.getInstance()
				.createLibraryManager(type);	
			libMgr.createMethodLibrary(name, params);
			libMgr.setMethodLibrary(newLibrary);
			LibraryService.getInstance().setLibraryManager(libMgr);
			
			// Begin packaging the new library for export.
			MethodConfiguration config = LibraryServiceUtil
					.getMethodConfiguration(newLibrary, selectedConfigName);

			// Validate the configuration and make sure the global packages are
			// selected. If global packages are missing, the exported library
			// can't be loaded.
			LibraryUtil.validateMethodConfiguration(config);

			closure = new ConfigurationClosure(config);
			closure.packageLibrary(data.removeBrokenReferences);
		} catch (Throwable e) {
			ExportPlugin.getDefault().getLogger().logError(
					"Error making library configuration closure", e); //$NON-NLS-1$
			data.errorMsg = ExportResources.ConfigurationExportService_MSG1; //$NON-NLS-1$

			if (closure != null)
				closure.dispose();
			if ( libMgr != null ) {
				LibraryService.getInstance().removeLibraryManager(libMgr);
				libMgr.closeMethodLibrary();
				libMgr.dispose();
			}
			
			return;
		}

		try {
			LibraryUtil.saveAll(newLibrary);

			// the first round of save will create the resource structure,
			// need to save again to make sure all references are saved.
			// This step is critical since the first round only created the data
			// structure
			// some of the cross-referenced elements might be lost on the first
			// saving
			// for example, when create a method configuration with references
			// to a new plugin,
			// which are not saved yet, those references will be lost.
			// 145891 - Import Configuration: default config is loss after
			// import
			LibraryUtil.saveAll(newLibrary);

		} catch (Throwable e) {
			ExportPlugin.getDefault().getLogger().logError(
					"Error saving library", e); //$NON-NLS-1$
			data.errorMsg = ExportResources.ConfigurationExportService_MSG9; //$NON-NLS-1$

			if (closure != null)
				closure.dispose();
			if ( libMgr != null ) {
				LibraryService.getInstance().removeLibraryManager(libMgr);
				libMgr.closeMethodLibrary();
				libMgr.dispose();
			}
			return;
		}

		// Copy the resource files in the current library to the new library.
		// For simplicity sake, copy all resource files if the files do not
		// exist in the target library or if the files are newer
		//String includes = "resources/**, **/resources/**"; //$NON-NLS-1$
		String includes = "resources/**, **/resources/**, **/diagram.xmi"; //$NON-NLS-1$

		File srcDir = LibraryUtil.getLibraryRootPath(currentLib);
		File destDir = LibraryUtil.getLibraryRootPath(newLibrary);

		LayoutResources.copyDir(srcDir, destDir, includes, excludes);

		// Close the newly created library.
		if (closure != null)
			closure.dispose();
		if ( libMgr != null ) {
			LibraryService.getInstance().removeLibraryManager(libMgr);
			libMgr.closeMethodLibrary();
			libMgr.dispose();
		}
	}

}