/*******************************************************************************
 * Copyright (c) 2004 - 2006 Mylar committers 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
 *******************************************************************************/

package org.eclipse.mylyn.tasks.ui;

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

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.mylyn.context.core.MylarStatusHandler;
import org.eclipse.mylyn.internal.context.core.MylarContextManager;
import org.eclipse.mylyn.internal.context.core.util.ZipFileUtil;
import org.eclipse.mylyn.internal.tasks.ui.ITasksUiConstants;
import org.eclipse.mylyn.tasks.core.TaskRepositoryManager;

/**
 * Migrate 0.6 -> 0.7 mylar data format
 * 
 * @author Rob Elves
 */
public class TaskListDataMigration implements IRunnableWithProgress {

	private File dataDirectory = null;

	public TaskListDataMigration(File sourceFolder) {
		this.dataDirectory = sourceFolder;
	}

	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
		try {
			monitor.beginTask("Task Data Migration", IProgressMonitor.UNKNOWN);
			doMigration(monitor);
		} finally {

		}
	}

	public void doMigration(IProgressMonitor monitor) {
		try {
			if(dataDirectory == null || !dataDirectory.exists()) return;
			monitor.beginTask("Mylar Data Migration", 4);
			migrateTaskList(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
			monitor.worked(1);
			migrateRepositoriesData(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
			monitor.worked(1);
			migrateTaskContextData(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
			monitor.worked(1);
			migrateActivityData(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN));
			monitor.worked(1);
		} finally {
			monitor.done();
		}
	}

	public boolean migrateTaskList(IProgressMonitor monitor) {
		File oldTasklistFile = new File(dataDirectory, ITasksUiConstants.OLD_TASK_LIST_FILE);
		File newTasklistFile = new File(dataDirectory, ITasksUiConstants.DEFAULT_TASK_LIST_FILE);
		if (!oldTasklistFile.exists())
			return false;
		if (newTasklistFile.exists()) {
			if (!newTasklistFile.delete()) {
				MylarStatusHandler.fail(null, "Could not overwrite tasklist", false);
				return false;
			}
		}
		ArrayList<File> filesToZip = new ArrayList<File>();
		filesToZip.add(oldTasklistFile);
		try {
			monitor.beginTask("Migrate Tasklist Data", 1);
			ZipFileUtil.createZipFile(newTasklistFile, filesToZip, new SubProgressMonitor(monitor, 1));
			if (!oldTasklistFile.delete()) {
				MylarStatusHandler.fail(null, "Could not remove old tasklist.", false);
				return false;
			}
			monitor.worked(1);
		} catch (Exception e) {
			MylarStatusHandler.fail(e, "Error occurred while migrating old tasklist: " + e.getMessage(), true);
			return false;
		} finally {
			monitor.done();
		}
		return true;
	}

	public boolean migrateRepositoriesData(IProgressMonitor monitor) {
		File oldRepositoriesFile = new File(dataDirectory, TaskRepositoryManager.OLD_REPOSITORIES_FILE);
		File newRepositoriesFile = new File(dataDirectory, TaskRepositoryManager.DEFAULT_REPOSITORIES_FILE);
		if (!oldRepositoriesFile.exists())
			return false;
		if (newRepositoriesFile.exists()) {
			if (!newRepositoriesFile.delete()) {
				MylarStatusHandler.fail(null,
						"Could not overwrite repositories file. Check read/write permission on data directory.", false);
				return false;
			}
		}
		ArrayList<File> filesToZip = new ArrayList<File>();
		filesToZip.add(oldRepositoriesFile);
		try {
			monitor.beginTask("Migrate Repository Data", 1);
			ZipFileUtil.createZipFile(newRepositoriesFile, filesToZip, new SubProgressMonitor(monitor, 1));
			if (!oldRepositoriesFile.delete()) {
				MylarStatusHandler
						.fail(
								null,
								"Could not remove old repositories file. Check read/write permission on data directory.",
								false);
				return false;
			}
			monitor.worked(1);
		} catch (Exception e) {
			MylarStatusHandler.fail(e, "Error occurred while migrating old repositories data: " + e.getMessage(), true);
			return false;
		} finally {
			monitor.done();
		}
		return true;
	}

	public boolean migrateTaskContextData(IProgressMonitor monitor) {
		ArrayList<File> contextFiles = new ArrayList<File>();
		for (File file : dataDirectory.listFiles()) {
			if (file.getName().startsWith("http") || file.getName().startsWith("local") || file.getName().startsWith("task")) {
				if (!file.getName().endsWith(".zip")) {
					contextFiles.add(file);
				}
			}
		}

		try {
			monitor.beginTask("Task Context Migration", contextFiles.size());

			File contextsFolder = new File(dataDirectory, MylarContextManager.CONTEXTS_DIRECTORY);
			if (!contextsFolder.exists()) {
				if (!contextsFolder.mkdir()) {
					MylarStatusHandler.fail(null,
							"Could not create contexts folder. Check read/write permission on data directory.", false);
					return false;
				}
			}
			for (File file : contextFiles) {
				ArrayList<File> filesToZip = new ArrayList<File>();
				filesToZip.add(file);
				File newContextFile = new File(contextsFolder, file.getName()+".zip");
				if (newContextFile.exists()) {
					if (!newContextFile.delete()) {
						MylarStatusHandler.fail(null,
								"Could not overwrite context file. Check read/write permission on data directory.",
								false);
						return false;
					}
				}
				ZipFileUtil.createZipFile(newContextFile, filesToZip, new SubProgressMonitor(monitor, 1));
				if (!file.delete()) {
					MylarStatusHandler.fail(null,
							"Could not remove old context file. Check read/write permission on data directory.", false);
					return false;
				}
				monitor.worked(1);
			}
		} catch (Exception e) {
			MylarStatusHandler.fail(e, "Error occurred while migrating old repositories data: " + e.getMessage(), true);
			return false;
		} finally {
			monitor.done();
		}
		return true;
	}
		
	public boolean migrateActivityData(IProgressMonitor monitor) {
		File oldActivityFile = new File(dataDirectory, MylarContextManager.OLD_CONTEXT_HISTORY_FILE_NAME+MylarContextManager.CONTEXT_FILE_EXTENSION_OLD);
		if (!oldActivityFile.exists())
			return false;
		
		File contextsFolder = new File(dataDirectory, MylarContextManager.CONTEXTS_DIRECTORY);
		if (!contextsFolder.exists()) {
			if (!contextsFolder.mkdir()) {
				MylarStatusHandler.fail(null,
						"Could not create contexts folder. Check read/write permission on data directory.", false);
				return false;
			}
		}
		
		File newActivityFile = new File(contextsFolder, MylarContextManager.CONTEXT_HISTORY_FILE_NAME+MylarContextManager.CONTEXT_FILE_EXTENSION);
		
		if (newActivityFile.exists()) {
			if (!newActivityFile.delete()) {
				MylarStatusHandler.fail(null,
						"Could not overwrite activity file. Check read/write permission on data directory.", false);
				return false;
			}
		}
		ArrayList<File> filesToZip = new ArrayList<File>();
		filesToZip.add(oldActivityFile);
		try {
			monitor.beginTask("Migrate Activity Data", 1);
			ZipFileUtil.createZipFile(newActivityFile, filesToZip, new SubProgressMonitor(monitor, 1));
			if (!oldActivityFile.delete()) {
				MylarStatusHandler
						.fail(
								null,
								"Could not remove old activity file. Check read/write permission on data directory.",
								false);
				return false;
			}
			monitor.worked(1);
		} catch (Exception e) {
			MylarStatusHandler.fail(e, "Error occurred while migrating old activity data: " + e.getMessage(), true);
			return false;
		} finally {
			monitor.done();
		}
		return true;
	}

}

//public boolean migrateActivityData(IProgressMonitor monitor) {
//File oldActivityFile = new File(dataDirectory, MylarContextManager.OLD_CONTEXT_HISTORY_FILE_NAME+MylarContextManager.CONTEXT_FILE_EXTENSION_OLD);
//if (!oldActivityFile.exists())
//	return false;
//		
//File newActivityFile = new File(dataDirectory, MylarContextManager.CONTEXT_HISTORY_FILE_NAME+MylarContextManager.CONTEXT_FILE_EXTENSION);
//
//if (newActivityFile.exists()) {
//	if (!newActivityFile.delete()) {
//		MylarStatusHandler.fail(null,
//				"Could not overwrite activity file. Check read/write permission on data directory.", false);
//		return false;
//	}
//}
//ArrayList<File> filesToZip = new ArrayList<File>();
//filesToZip.add(oldActivityFile);
//try {
//	monitor.beginTask("Migrate Activity Data", 1);
//	ZipFileUtil.createZipFile(newActivityFile, filesToZip, new SubProgressMonitor(monitor, 1));
//	if (!oldActivityFile.delete()) {
//		MylarStatusHandler
//				.fail(
//						null,
//						"Could not remove old activity file. Check read/write permission on data directory.",
//						false);
//		return false;
//	}
//	monitor.worked(1);
//} catch (Exception e) {
//	MylarStatusHandler.fail(e, "Error occurred while migrating old activity data: " + e.getMessage(), true);
//	return false;
//} finally {
//	monitor.done();
//}
//return true;
//}