//------------------------------------------------------------------------------
// 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.library.ui.wizards;

import java.io.File;
import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.epf.common.ui.util.MsgBox;
import org.eclipse.epf.library.ILibraryService;
import org.eclipse.epf.library.edit.ui.UserInteractionHelper;
import org.eclipse.epf.library.layout.LayoutResources;
import org.eclipse.epf.library.services.SafeUpdateController;
import org.eclipse.epf.library.ui.LibraryUIPlugin;
import org.eclipse.epf.library.ui.LibraryUIResources;
import org.eclipse.epf.library.ui.dialogs.LibraryBackupDialog;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Shell;

/**
 * Utility class to back up library.
 * 
 * @author Jinhua Xi
 * @author Weiping Lu
 * @since 1.0
 */
public class LibraryBackupUtil {

	private String path = null;

	/**
	 * Prompts to backup the current library
	 * 
	 * @param shell
	 */
	public static void promptBackupCurrentLibrary(Shell shell, ILibraryService service) {
		String libPathStr = service.getCurrentMethodLibraryLocation();
		File libPath = new File(libPathStr);
		new LibraryBackupUtil().doBackup(shell, libPath, service);
	}
	
	/**
	 * Prompts to backup library
	 * 
	 * @param shell
	 * @param libPath
	 */
	public static void promptBackupLibrary(Shell shell, File libPath) {
		new LibraryBackupUtil().doBackup(shell, libPath, null);
	}

	private void doBackup(final Shell shell, final File libPath, ILibraryService service) {
		path = null;
		final ILibraryService fservice = service;
		
		SafeUpdateController.syncExec(new Runnable() {
			public void run() {
				Shell s = shell;
				if (s == null) {
					s = MsgBox.getDefaultShell();
				}

				if (s == null) {
					s = new Shell(MsgBox.getDisplay());
				}

				String title = LibraryUIResources.backupLibraryDialog_title;
				String message = LibraryUIResources.backupLibraryDialog_text;
				String backupPath = libPath.getAbsolutePath() + ".backup"; //$NON-NLS-1$	

				LibraryBackupDialog dlg = new LibraryBackupDialog(s, title,
						message, backupPath);

				if (dlg.open() == Dialog.OK) {
					path = dlg.getPath();
				}
				
				ProgressMonitorDialog pmDialog = new ProgressMonitorDialog(s);
				IRunnableWithProgress op = new IRunnableWithProgress() {
					public void run(IProgressMonitor monitor)
							throws InvocationTargetException {
						monitor.beginTask(
								LibraryUIResources.backingUpLibraryTask_name,
								IProgressMonitor.UNKNOWN);
						if (path != null) {
							if (fservice == null) {
								backup(libPath, new File(path));
							} else {
								fservice.getCurrentLibraryManager().backupMethodLibrary(path);
							}
						}
					}
				};
				
				try {
					pmDialog.run(true, false, op);
				} catch (Exception e){
					LibraryUIPlugin.getDefault().getLogger().logError(e);
				}
			}
		});

	}

	/**
	 * Back up library 
	 * 
	 * @param source
	 * @param dest
	 */
	public static void backup(final File source, final File dest) {
		Runnable runnable = new Runnable() {
			public void run() {
				try {
					// excude the non-library files that might be locked by rmc.
					// these files may cause backup to fail due to file lock.
					String excludes = ".lock"; //$NON-NLS-1$
					LayoutResources.copyDir(source, dest, "**", excludes); //$NON-NLS-1$
				} catch (RuntimeException e) {
					LibraryUIPlugin.getDefault().getLogger().logError(e);
				}
			}
		};

		UserInteractionHelper.runWithProgress(runnable,
				LibraryUIResources.backingUpLibraryTask_name);
	}

}
