/*******************************************************************************
 * Copyright (c) 2011-2014 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:
 * Eugen - initial API and implementation
 ******************************************************************************/
package org.eclipse.emf.ecp.diffmerge.swt;

import org.eclipse.emf.ecp.diffmerge.spi.context.ControlPair;
import org.eclipse.emf.ecp.diffmerge.spi.context.DiffMergeModelContext;
import org.eclipse.emf.ecp.view.spi.model.VControl;
import org.eclipse.emfforms.spi.core.services.label.NoLabelFoundException;
import org.eclipse.emfforms.spi.localization.LocalizationServiceHelper;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Shell;

/**
 * The Diff Dialog helper provides methods to open a Diff Dialog.
 *
 * @author Eugen Neufeld
 *
 */
public final class DiffDialogHelper {
	private DiffDialogHelper() {
	}

	/**
	 * This opens a dialog displaying the differences of the elements of the {@link DiffMergeModelContext} based on the
	 * index of the difference. If the index is not valid, less then 0 or greater equals the number of differences, then
	 * an {@link IllegalArgumentException} is thrown.
	 *
	 * @param diffModelContext the {@link DiffMergeModelContext} containing the data
	 * @param diffIndex the index of the difference
	 * @throws IllegalArgumentException if the index is invalid
	 */
	public static void showDialog(DiffMergeModelContext diffModelContext, int diffIndex)
		throws IllegalArgumentException {
		final VControl control = diffModelContext.getControl(diffIndex);
		final String label = getControlLabel(control, diffModelContext);
		showDialog(diffModelContext, control, label);
	}

	/**
	 * Opens a dialog displaying the differences of the elements of the {@link DiffMergeModelContext} based on the
	 * provided {@link VControl}.
	 *
	 * @param diffModelContext the {@link DiffMergeModelContext} containing the data
	 * @param vControl the {@link VControl} having the differences
	 * @param featureLabel the feature text to use in the title of the dialog
	 * @throws IllegalArgumentException if the controls doesn't have a difference
	 */
	public static void showDialog(DiffMergeModelContext diffModelContext, VControl vControl, String featureLabel)
		throws IllegalArgumentException {
		final ControlPair pairWithDiff = diffModelContext.getPairWithDiff(vControl);
		if (pairWithDiff == null) {
			return;
		}
		final DiffDialog dialog = new DiffDialog(diffModelContext, featureLabel, pairWithDiff.getLeftControl(),
			pairWithDiff.getRightControl(), vControl);

		final Shell shell = new Shell(SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL | SWT.MAX | SWT.RESIZE);
		final int index = diffModelContext.getIndexOf(vControl);
		if (index == -1) {
			throw new IllegalArgumentException("This VControl doesn't has a difference."); //$NON-NLS-1$
		}
		shell
			.setText(String.format(
				LocalizationServiceHelper.getString(DiffDialogHelper.class, MessageKeys.DiffDialog_title),
				featureLabel, index + 1, diffModelContext.getTotalNumberOfDiffs()));
		shell.setLayout(new FillLayout());
		final Rectangle clientArea = shell.getDisplay().getBounds();
		shell.setSize(clientArea.width / 2, 500);
		dialog.create(shell);
		shell.setLocation(clientArea.width / 4, clientArea.height / 4);
		shell.open();
	}

	private static String getControlLabel(VControl control, DiffMergeModelContext diffModelContext) {
		try {
			return (String) Activator.getInstance().getEMFFormsLabelProvider()
				.getDisplayName(control.getDomainModelReference(), diffModelContext.getDomainModel()).getValue();
		} catch (final NoLabelFoundException e) {
			return e.getMessage();
		}
	}
}
