/*******************************************************************************
 * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
 * Technische Universitaet Muenchen.
 * 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:
 * ovonwesen
 * emueller
 ******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.model.controller;

import java.text.MessageFormat;
import java.util.Date;

import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.emfstore.client.observer.ESLoginObserver;
import org.eclipse.emf.emfstore.client.observer.ESShareObserver;
import org.eclipse.emf.emfstore.internal.client.common.UnknownEMFStoreWorkloadCommand;
import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
import org.eclipse.emf.emfstore.internal.client.model.Usersession;
import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.ServerCall;
import org.eclipse.emf.emfstore.internal.client.model.impl.AdminBrokerImpl;
import org.eclipse.emf.emfstore.internal.client.model.impl.ProjectSpaceBase;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.model.ProjectId;
import org.eclipse.emf.emfstore.internal.server.model.ProjectInfo;
import org.eclipse.emf.emfstore.internal.server.model.accesscontrol.roles.RolesPackage;
import org.eclipse.emf.emfstore.internal.server.model.versioning.LogMessage;
import org.eclipse.emf.emfstore.internal.server.model.versioning.VersioningFactory;
import org.eclipse.emf.emfstore.server.exceptions.ESException;

/**
 * Shares a project.
 *
 * @author ovonwesen
 * @author emueller
 */
public class ShareController extends ServerCall<ProjectInfo> {

	/**
	 * Constructor.
	 *
	 * @param projectSpace
	 *            the project space to be shared
	 * @param session
	 *            the session to use during share
	 * @param monitor
	 *            a progress monitor that is used to indicate the progress of the share
	 */
	public ShareController(ProjectSpaceBase projectSpace, Usersession session, IProgressMonitor monitor) {
		super(projectSpace);

		// if session is null, session will be injected by sessionmanager
		setUsersession(session);
		setProgressMonitor(monitor);
	}

	@Override
	@SuppressWarnings("unchecked")
	protected ProjectInfo run() throws ESException {

		getProgressMonitor().beginTask(Messages.ShareController_Sharing_Project, 100);
		getProgressMonitor().worked(1);
		getProgressMonitor().subTask(Messages.ShareController_Preparing_Share);

		final LogMessage logMessage = VersioningFactory.eINSTANCE.createLogMessage();
		logMessage.setAuthor(getUsersession().getUsername());
		logMessage.setClientDate(new Date());
		logMessage.setMessage(Messages.ShareController_Initial_Commit);
		ProjectInfo projectInfo = null;

		getProjectSpace().stopChangeRecording();

		getProgressMonitor().worked(10);
		if (getProgressMonitor().isCanceled()) {
			getProjectSpace().save();
			getProjectSpace().startChangeRecording();
			getProgressMonitor().done();
		}
		getProgressMonitor().subTask(Messages.ShareController_Sharing_Project_With_Server);

		// make sure, current state of caches is written to resource
		getProjectSpace().save();

		projectInfo = createProject(logMessage);
		addParticipant(projectInfo.getProjectId());

		getProgressMonitor().worked(30);
		getProgressMonitor().subTask("Finalizing share"); //$NON-NLS-1$

		// set attributes after server call
		getProgressMonitor().subTask(Messages.ShareController_Settings_Attributes);
		setUsersession(getUsersession());
		ESWorkspaceProviderImpl.getObserverBus().register(getProjectSpace(), ESLoginObserver.class);

		getProjectSpace().save();
		getProjectSpace().startChangeRecording();
		getProjectSpace().setBaseVersion(ModelUtil.clone(projectInfo.getVersion()));
		getProjectSpace().setLastUpdated(new Date());
		getProjectSpace().setProjectId(ModelUtil.clone(projectInfo.getProjectId()));
		getProjectSpace().setUsersession(getUsersession());
		getProjectSpace().saveProjectSpaceOnly();

		// TODO ASYNC implement File Upload with observer
		// If any files have already been added, upload them.
		getProgressMonitor().worked(20);
		getProgressMonitor().subTask(Messages.ShareController_Uploading_Files);
		getProjectSpace().getFileTransferManager().uploadQueuedFiles(getProgressMonitor());

		getProgressMonitor().worked(20);
		getProgressMonitor().subTask(Messages.ShareController_Finalizing_Share);
		getProjectSpace().getLocalChangePackage().clear();
		getProjectSpace().save();
		getProjectSpace().updateDirtyState();

		getProgressMonitor().done();
		ESWorkspaceProviderImpl.getObserverBus().notify(ESShareObserver.class)
			.shareDone(getProjectSpace().toAPI());
		return projectInfo;
	}

	private ProjectInfo createProject(final LogMessage logMessage) throws ESException {
		return new UnknownEMFStoreWorkloadCommand<ProjectInfo>(getProgressMonitor()) {
			@Override
			public ProjectInfo run(IProgressMonitor monitor) throws ESException {
				return ESWorkspaceProviderImpl
					.getInstance()
					.getConnectionManager()
					.createProject(
						getUsersession().getSessionId(),
						getProjectSpace().getProjectName() == null ? MessageFormat.format(
							Messages.ShareController_Project_At, new Date())
							: getProjectSpace().getProjectName(),
						StringUtils.EMPTY,
						logMessage,
						getProjectSpace().getProject());
			}
		}.execute();
	}

	private void addParticipant(final ProjectId projectId) throws ESException {
		new UnknownEMFStoreWorkloadCommand<Void>(getProgressMonitor()) {
			@Override
			public Void run(IProgressMonitor monitor) throws ESException {
				new AdminBrokerImpl(getUsersession().getServerInfo(), getSessionId()).addInitialParticipant(
					projectId,
					getUsersession().getACUser().getId(),
					RolesPackage.eINSTANCE.getProjectAdminRole());
				return null;
			}
		}.execute();
	}
}
