/*******************************************************************************
 * Copyright (c) 2007-2015 BMW Car IT, TUM, EclipseSource Muenchen GmbH, and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 * Johannes Faltermeier - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.edapt.history.instantiation.ui;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.emf.ecore.EPackage;
import org.eclipse.jface.wizard.Wizard;

/**
 * {@link Wizard} to update the ns uris of multiple packages.
 *
 * @author jfaltermeier
 *
 */
public class ReleaseWizard extends Wizard {

	private final Map<EPackage, Boolean> updateMap = new LinkedHashMap<EPackage, Boolean>();
	private final Map<EPackage, String> sourceMap = new LinkedHashMap<EPackage, String>();
	private final Map<EPackage, String> targetMap = new LinkedHashMap<EPackage, String>();

	private final List<EPackage> rootPackages;
	private final Set<EPackage> changedPackages;

	private ReleaseWizardPage releaseWizardPage;

	public ReleaseWizard(List<EPackage> rootPackages, Set<EPackage> changedPackages) {
		if (rootPackages == null || rootPackages.isEmpty()) {
			throw new IllegalArgumentException("There must be at least one root package."); //$NON-NLS-1$
		}
		this.rootPackages = rootPackages;
		this.changedPackages = changedPackages;
	}

	@Override
	public String getWindowTitle() {
		return "Create Release"; //$NON-NLS-1$
	}

	@Override
	public void addPages() {
		final List<EPackage> sources = new ArrayList<EPackage>(rootPackages);
		releaseWizardPage = new ReleaseWizardPage("Update namespace URI of package(s)", //$NON-NLS-1$
			"Enter the label(s) to replace and the target label or deselect the update button", //$NON-NLS-1$
			null,
			sources,
			changedPackages);
		addPage(releaseWizardPage);
	}

	/**
	 * Whether the ns uri of the given EPackage should be updated.
	 */
	public boolean updatePackage(EPackage ePackage) {
		if (!updateMap.containsKey(ePackage)) {
			return false;
		}
		return updateMap.get(ePackage);
	}

	/**
	 * Returns the source label to replace.
	 */
	public String getSource(EPackage ePackage) {
		return sourceMap.get(ePackage);
	}

	/**
	 * Returns the target label which replaces the source label.
	 */
	public String getTarget(EPackage ePackage) {
		return targetMap.get(ePackage);
	}

	@Override
	public boolean performFinish() {
		for (final EPackage ePackage : rootPackages) {
			final boolean isUpdate = releaseWizardPage.isUpdate(ePackage);
			updateMap.put(ePackage, isUpdate);
			if (!isUpdate) {
				continue;
			}
			sourceMap.put(ePackage, releaseWizardPage.getSource(ePackage));
			targetMap.put(ePackage, releaseWizardPage.getTarget(ePackage));
		}
		releaseWizardPage = null;
		return true;
	}

}
