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

import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.mylyn.commons.core.DelegatingProgressMonitor;
import org.eclipse.mylyn.internal.tasks.core.LocalRepositoryConnector;
import org.eclipse.mylyn.internal.tasks.core.LocalTask;
import org.eclipse.mylyn.internal.tasks.core.RepositoryModel;
import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
import org.eclipse.mylyn.internal.tasks.core.TaskList;
import org.eclipse.mylyn.internal.tasks.core.TaskRepositoryManager;
import org.eclipse.mylyn.internal.tasks.core.data.SynchronizationManger;
import org.eclipse.mylyn.internal.tasks.core.data.TaskDataManager;
import org.eclipse.mylyn.internal.tasks.core.data.TaskDataStore;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.TaskMapping;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.tests.connector.MockRepositoryConnector;
import org.eclipse.mylyn.tasks.tests.connector.MockTask;

public class MockTestContext {

	private final TaskList taskList;

	private final TaskRepositoryManager repositoryManager;

	private final TaskDataManager dataManager;

	private final TaskDataStore dataStore;

	private final TaskActivityManager activityManager;

	private final SynchronizationManger synchronizationManger;

	private final RepositoryModel repositoryModel;

	private final TaskRepository mockRepository;

	private final TaskRepository localRepository;

	private final AtomicInteger idSeed = new AtomicInteger(1003);

	private final FullMockRepositoryConnector mockRepositoryConnector;

	public MockTestContext() {
		taskList = new TaskList();
		repositoryManager = new TaskRepositoryManager();

		mockRepositoryConnector = new FullMockRepositoryConnector();
		repositoryManager.addRepositoryConnector(mockRepositoryConnector);
		mockRepository = new TaskRepository(MockRepositoryConnector.CONNECTOR_KIND,
				MockRepositoryConnector.REPOSITORY_URL);
		repositoryManager.addRepository(mockRepository);

		repositoryManager.addRepositoryConnector(new LocalRepositoryConnector());
		localRepository = new TaskRepository(LocalRepositoryConnector.CONNECTOR_KIND,
				LocalRepositoryConnector.REPOSITORY_URL);
		repositoryManager.addRepository(localRepository);

		dataStore = new TaskDataStore(repositoryManager);
		activityManager = new TaskActivityManager(repositoryManager, taskList);
		repositoryModel = new RepositoryModel(taskList, repositoryManager);
		synchronizationManger = new SynchronizationManger(repositoryModel);
		dataManager = new TaskDataManager(dataStore, repositoryManager, taskList, activityManager,
				synchronizationManger);

	}

	public TaskList getTaskList() {
		return taskList;
	}

	public TaskRepositoryManager getRepositoryManager() {
		return repositoryManager;
	}

	public TaskDataManager getDataManager() {
		return dataManager;
	}

	public TaskDataStore getDataStore() {
		return dataStore;
	}

	public TaskActivityManager getActivityManager() {
		return activityManager;
	}

	public SynchronizationManger getSynchronizationManger() {
		return synchronizationManger;
	}

	public RepositoryModel getRepositoryModel() {
		return repositoryModel;
	}

	public ITask createLocalTask() {
		LocalTask task = new LocalTask(Integer.toString(idSeed.incrementAndGet()), "summary");
		task.setNotes("description " + task.getTaskKey());

		taskList.addTask(task);

		return task;
	}

	public ITask createRepositoryTask() throws CoreException {
		MockTask task = new MockTask(Integer.toString(idSeed.incrementAndGet()));

		TaskData taskData = new TaskData(new TaskAttributeMapper(mockRepository), task.getConnectorKind(),
				task.getRepositoryUrl(), task.getTaskId());

		mockRepositoryConnector.getTaskDataHandler().initializeTaskData(mockRepository, taskData, new TaskMapping(),
				new NullProgressMonitor());

		taskData.getRoot().getMappedAttribute(TaskAttribute.SUMMARY).setValue("summary");
		taskData.getRoot()
				.getMappedAttribute(TaskAttribute.DATE_CREATION)
				.setValue(Long.toString(new Date().getTime()));
		taskData.getRoot().getMappedAttribute(TaskAttribute.USER_REPORTER).setValue("reporter@example.com");
		taskData.getRoot().getMappedAttribute(TaskAttribute.USER_ASSIGNED).setValue("assignee@example.com");
		taskData.getRoot()
				.getMappedAttribute(TaskAttribute.DESCRIPTION)
				.setValue("task description " + task.getTaskKey());

		mockRepositoryConnector.getTaskMapping(taskData).applyTo(task);

		dataManager.putSubmittedTaskData(task, taskData, new DelegatingProgressMonitor());
		taskList.addTask(task);

		return task;
	}

	public TaskRepository getMockRepository() {
		return mockRepository;
	}

	public FullMockRepositoryConnector getMockRepositoryConnector() {
		return mockRepositoryConnector;
	}
}
