/*******************************************************************************
 * Copyright (c) 2004, 2011 Tasktop Technologies 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:
 *     Tasktop Technologies - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.internal.context.tasks.ui;

import java.lang.reflect.InvocationTargetException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
import org.eclipse.mylyn.internal.context.core.InteractionContext;
import org.eclipse.mylyn.internal.tasks.ui.Messages;
import org.eclipse.mylyn.internal.tasks.ui.TaskListModifyOperation;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.monitor.core.InteractionEvent;

/**
 * Changes a set of old handles to a set of new handles in the Activity Meta Context.
 *
 * @author Rob Elves
 */
public class ChangeActivityHandleOperation extends TaskListModifyOperation {

	private final Map<String, String> handles;

	public ChangeActivityHandleOperation(String oldHandle, String newHandle) {
		this(Collections.singletonMap(oldHandle, newHandle));
	}

	public ChangeActivityHandleOperation(Map<String, String> handles) {
		this.handles = handles;
	}

	@Override
	protected void operations(IProgressMonitor monitor)
			throws CoreException, InvocationTargetException, InterruptedException {
		Map<String, String> changedHandles = handles.entrySet()
				.stream()
				.filter(e -> !e.getKey().equals(e.getValue()))
				.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
		if (changedHandles.isEmpty()) {
			return;
		}
		try {
			refactorMetaContextHandles(changedHandles, monitor);
			TasksUiPlugin.getTaskActivityMonitor().reloadActivityTime();
		} finally {
			monitor.done();
		}
	}

	@SuppressWarnings("restriction")
	private void refactorMetaContextHandles(Map<String, String> oldToNewHandles, IProgressMonitor monitor) {
		ContextCorePlugin.getContextManager().saveActivityMetaContext();
		InteractionContext metaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
		ContextCorePlugin.getContextManager().resetActivityMetaContext();
		InteractionContext newMetaContext = ContextCorePlugin.getContextManager().getActivityMetaContext();
		List<InteractionEvent> interactionHistory = metaContext.getInteractionHistory();
		monitor.beginTask(Messages.ChangeActivityHandleOperation_Activity_migration, interactionHistory.size());
		for (InteractionEvent event : interactionHistory) {
			if (event.getStructureHandle() != null) {
				String newHandle = oldToNewHandles.get(event.getStructureHandle());
				if (newHandle != null) {
					event = new InteractionEvent(event.getKind(), event.getStructureKind(), newHandle,
							event.getOriginId(), event.getNavigation(), event.getDelta(),
							event.getInterestContribution(), event.getDate(), event.getEndDate());
				}
			}
			newMetaContext.parseEvent(event);
			monitor.worked(1);
		}
		ContextCorePlugin.getContextManager().saveActivityMetaContext();
	}

}
