/*******************************************************************************
 * Copyright (c) 2015 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.context.tasks.tests;

import java.io.ByteArrayInputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;

import junit.framework.TestCase;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.mylyn.commons.sdk.util.UiTestUtil;
import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
import org.eclipse.mylyn.internal.tasks.core.LocalTask;
import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
import org.eclipse.mylyn.internal.tasks.core.TaskList;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
import org.eclipse.mylyn.tasks.tests.TaskTestUtil;
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.TextEditor;
import org.eclipse.ui.ide.IDE;
import org.junit.Before;

import com.google.common.base.Function;
import com.google.common.base.Functions;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableSet;

@SuppressWarnings("restriction")
public class TaskEditorRestoreTest extends TestCase {

	private IWorkbenchPage page;

	private TaskActivityManager taskActivityManager;

	private TaskList taskList;

	private IProject project;

	private AbstractTask task1;

	private AbstractTask task2;

	private IFile fileA;

	private IFile fileB;

	@Override
	@Before
	public void setUp() throws Exception {
		page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
		taskActivityManager = TasksUiPlugin.getTaskActivityManager();
		taskActivityManager.deactivateActiveTask();
		taskList = TasksUiPlugin.getTaskList();
		TaskTestUtil.resetTaskListAndRepositories();

		project = ResourcesPlugin.getWorkspace().getRoot().getProject(getClass().getName());
		project.create(null);
		project.open(null);

		fileA = project.getProject().getFile("a.txt");
		fileA.create(new ByteArrayInputStream("abc".getBytes()), false, null);
		fileB = project.getProject().getFile("b.txt");
		fileB.create(new ByteArrayInputStream("abc".getBytes()), false, null);
	}

	@Override
	protected void tearDown() throws Exception {
		taskActivityManager.deactivateActiveTask();
		if (project != null) {
			project.delete(true, null);
		}
		UiTestUtil.closeAllEditors();
	}

	public void testDeactivateDoesNotRestoreForNoOpenTasks() {
		createTasks("testDeactivateDoesNotRestoreForNoOpenTasks");
		taskActivityManager.activateTask(task1);
		taskActivityManager.deactivateTask(task1);
		assertNoTaskOrTextEditorsOpen();
		taskActivityManager.activateTask(task1);
		assertNoTaskOrTextEditorsOpen();
	}

	public void testDeactivateRestoresActiveTaskEditor() {
		createTasks("testDeactivateRestoresActiveTaskEditor");
		taskActivityManager.activateTask(task1);
		TasksUiUtil.openTask(task1);
		taskActivityManager.deactivateTask(task1);
		assertNoTaskOrTextEditorsOpen();
		taskActivityManager.activateTask(task1);

		assertOnlyTask1IsOpen();
		assertEquals(Collections.emptySet(), getOpenEditorsByType(TextEditor.class, Functions.<TextEditor> identity()));
	}

	public void testDeactivateRestoresActiveTaskEditorAndFiles() throws Exception {
		createTasks("testDeactivateRestoresActiveTaskEditorAndFiles");
		taskActivityManager.activateTask(task1);
		IDE.openEditor(page, fileA, true);
		IDE.openEditor(page, fileB, true);
		TasksUiUtil.openTask(task1);
		TasksUiUtil.openTask(task2);
		taskActivityManager.deactivateTask(task1);
		assertNoTaskOrTextEditorsOpen();
		taskActivityManager.activateTask(task1);

		assertOnlyTask1IsOpen();
		assertFilesAreOpen();
	}

	private void createTasks(String name) {
		task1 = new LocalTask(name + 1, "summary1");
		task2 = new LocalTask(name + 2, "summary2");
		taskList.addTask(task1);
		taskList.addTask(task2);
	}

	private void assertNoTaskOrTextEditorsOpen() {
		assertEquals(Collections.emptySet(), getOpenEditorsByType(TextEditor.class, Functions.<TextEditor> identity()));
		assertEquals(Collections.emptySet(), getOpenEditorsByType(TaskEditor.class, Functions.<TaskEditor> identity()));
	}

	private void assertOnlyTask1IsOpen() {
		Set<String> editorSummaries = getOpenEditorsByType(TaskEditor.class, new Function<TaskEditor, String>() {
			@Override
			public String apply(TaskEditor editor) {
				return editor.getTaskEditorInput().getTask().getSummary();
			}
		});
		assertEquals(ImmutableSet.of(task1.getSummary()), editorSummaries);
	}

	private void assertFilesAreOpen() {
		Set<String> editorTitles = getOpenEditorsByType(TextEditor.class, new Function<TextEditor, String>() {
			@Override
			public String apply(TextEditor editor) {
				return editor.getTitle();
			}
		});
		assertEquals(ImmutableSet.of(fileA.getName(), fileB.getName()), editorTitles);
	}

	private <T extends IEditorPart, S> Set<S> getOpenEditorsByType(Class<T> clazz, Function<T, S> propertyFunction) {
		return FluentIterable.from(Arrays.asList(page.getEditorReferences()))
				.transform(new Function<IEditorReference, IEditorPart>() {
					@Override
					public IEditorPart apply(IEditorReference ref) {
						return ref.getEditor(true);
					}
				})
				.filter(clazz)
				.transform(propertyFunction)
				.toSet();
	}
}
