/*******************************************************************************
 * Copyright (c) 2016 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 v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Stefan Dirix - initial API and implementation
 *     Philip Langer - check for DI files in IComparisonScope2.getAllInvolvedResourceURIs
 *******************************************************************************/
package org.eclipse.papyrus.compare.diagram.ide.ui.internal.context;

import static com.google.common.collect.Collections2.transform;
import static com.google.common.collect.Iterables.any;

import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;

import java.util.Collection;
import java.util.List;

import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.MatchResource;
import org.eclipse.emf.compare.scope.IComparisonScope2;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.papyrus.infra.core.resource.sasheditor.DiModel;

/**
 * Helper class for determining the context of a comparison.
 * 
 * @author Stefan Dirix
 */
public final class PapyrusContextUtil {

	/** Predicate specifying whether the given URI string ends with the Papyrus DI file extension. */
	private static final Predicate<String> ENDS_WITH_PAPYRUS_EXTENSION = new Predicate<String>() {
		public boolean apply(String input) {
			if (input != null) {
				return input.endsWith(DiModel.DI_FILE_EXTENSION);
			}
			return false;
		}
	};

	/** Transforms an URI into the platform string representation. */
	private static final Function<URI, String> URI_TO_STRING = new Function<URI, String>() {
		public String apply(URI input) {
			String uriString = null;
			if (input != null) {
				uriString = input.toPlatformString(true);
				if (uriString == null) {
					uriString = input.toString();
				}
			}
			return uriString;
		}
	};

	/**
	 * Hidden constructor for this utility class.
	 */
	private PapyrusContextUtil() {
		// defeat instantiation
	}

	/**
	 * Determines whether the comparison concerns Papyrus models.
	 * 
	 * @param comparison
	 *            the {@link Comparison} to check.
	 * @return {@code true} if the comparison concerns Papyrus models, {@code false} otherwise.
	 */
	public static boolean isPapyrusContext(Comparison comparison) {
		final IComparisonScope2 comparisonScope = (IComparisonScope2)EcoreUtil
				.getAdapter(comparison.eAdapters(), IComparisonScope2.class);
		if (comparisonScope != null) {
			return containsPapyrusURI(transform(comparisonScope.getAllInvolvedResourceURIs(), URI_TO_STRING));
		}
		// Fallback if the scope is not available. This way of determining the Papyrus context is not as
		// accurate since the MatchResources are already minimized.
		return containsPapyrusURI(comparison.getMatchedResources());
	}

	/**
	 * Specifies whether the given matched resources contain a Papyrus resource.
	 * 
	 * @param matchedResources
	 *            the list of matched resources to check.
	 * @return <code>true</code> if the matched resources contain a Papyrus resources, <code>false</code>
	 *         otherwise.
	 */
	private static boolean containsPapyrusURI(List<MatchResource> matchedResources) {
		final Builder<String> setBuilder = ImmutableSet.builder();
		for (MatchResource res : matchedResources) {
			for (String uri : ImmutableSet.of(res.getLeftURI(), res.getRightURI(), res.getOriginURI())) {
				if (uri != null) {
					setBuilder.add(uri);
				}
			}
		}
		return containsPapyrusURI(setBuilder.build());
	}

	/**
	 * Specifies whether the given URI strings contain a Papyrus resource.
	 * 
	 * @param uris
	 *            the set of uris to check.
	 * @return <code>true</code> if uris contain a Papyrus resources, <code>false</code> otherwise.
	 */
	private static boolean containsPapyrusURI(Collection<String> uris) {
		return any(uris, ENDS_WITH_PAPYRUS_EXTENSION);
	}
}
