/******************************************************************************
 * Copyright (c) 2008 Versant Corporation 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:
 *     Remy Chi Jian Suen (Versant Corporation) - initial API and implementation
 ******************************************************************************/
package org.eclipse.team.internal.ecf.ui.wizards;

import org.eclipse.core.resources.IResource;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.user.IUser;
import org.eclipse.ecf.presence.roster.IRosterEntry;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.osgi.util.NLS;
import org.eclipse.team.internal.ecf.core.RemoteShare;
import org.eclipse.team.internal.ecf.core.TeamSynchronization;
import org.eclipse.team.internal.ecf.ui.Messages;
import org.eclipse.team.internal.ecf.ui.subscriber.RemoteSubscriberParticipant;
import org.eclipse.team.ui.TeamUI;
import org.eclipse.team.ui.synchronize.ISynchronizeParticipant;

public class RemotePeerSynchronizeWizard extends Wizard {

	private RemotePeerSynchronizeWizardPage page;

	public RemotePeerSynchronizeWizard() {
		setWindowTitle(Messages.RemotePeerSynchronizeWizard_WindowTitle);
	}

	public void addPages() {
		page = new RemotePeerSynchronizeWizardPage();
		addPage(page);
	}

	public boolean performFinish() {
		ID containerId = page.getContainerId();
		RemoteShare share = TeamSynchronization.getShare(containerId);
		IRosterEntry entry = page.getRosterEntry();
		IUser remoteUser = entry.getUser();
		ID ownId = entry.getRoster().getUser().getID();
		IResource[] resources = page.getSelectedResources();

		RemoteSubscriberParticipant participant = getSubscriberParticipant(share, ownId, remoteUser.getID());
		participant.setResources(resources);

		TeamUI.getSynchronizeManager().addSynchronizeParticipants(new ISynchronizeParticipant[] {participant});

		if (resources.length == 1) {
			participant.refresh(resources, NLS.bind(Messages.SynchronizeWithHandler_RemoteSynchronizationTaskName, remoteUser.getNickname()), NLS.bind(Messages.SynchronizeWithHandler_RemoteSynchronizationResourceDescription, resources[0].getName(), remoteUser.getNickname()), null);
		} else {
			participant.refresh(resources, NLS.bind(Messages.SynchronizeWithHandler_RemoteSynchronizationTaskName, remoteUser.getNickname()), NLS.bind(Messages.SynchronizeWithHandler_RemoteSynchronizationResourcesDescription, remoteUser.getNickname()), null);
		}
		return true;
	}

	public static RemoteSubscriberParticipant getSubscriberParticipant(RemoteShare share, ID ownId, ID remoteId) {
		return new RemoteSubscriberParticipant(share, ownId, remoteId);
		// FIXME: we should try to reuse participants, but reusing causes the
		// 'Synchronize' view to currently not update for some reasons, thus,
		// you can effectively only synchronize once per Eclipse session
	}
}
