/*****************************************************************************
 * Copyright (c) 2016 Christian W. Damus 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:
 *   Christian W. Damus - Initial API and implementation
 *   
 *****************************************************************************/

package org.eclipse.papyrus.interoperability.rsa.tests.regression;

import static java.util.Spliterators.spliteratorUnknownSize;
import static org.eclipse.papyrus.junit.matchers.MoreMatchers.lessThan;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;

import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.Spliterator;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.m2m.qvt.oml.ExecutionContext;
import org.eclipse.papyrus.interoperability.rsa.concurrent.ExecutorsPool;
import org.eclipse.papyrus.interoperability.rsa.internal.extension.TransformationExtension;
import org.eclipse.papyrus.interoperability.rsa.tests.regression.AbstractMigrationRegressionTest.TransformationExtensionClass;
import org.eclipse.papyrus.interoperability.rsa.tests.regression.StereotypeApplicationsTest.MigrationTracker;
import org.eclipse.papyrus.interoperability.rsa.transformation.ImportTransformation;
import org.eclipse.papyrus.junit.utils.rules.PluginResource;
import org.eclipse.uml2.uml.Classifier;
import org.eclipse.uml2.uml.Element;
import org.junit.Test;

/**
 * Specific regression tests for bugs in access to stereotype applications
 * in the context of transformation extensions.
 */
@TransformationExtensionClass(MigrationTracker.class)
public class StereotypeApplicationsTest extends AbstractMigrationRegressionTest {

	/**
	 * Initializes me.
	 */
	public StereotypeApplicationsTest() {
		super();
	}

	/**
	 * Verifies that transformation extensions have access to stereotype applications
	 * in the before and after phases, before dependency fixing and stereotype repair,
	 * as long as the RSA profile has already been imported to Papyrus at the same
	 * location.
	 * 
	 * @see <a href="http://eclip.se/505330">bug 505330</a>
	 */
	@Test
	@PluginResource({ "bug505330/first.emx", "bug505330/today.profile.uml" })
	@BatchMigration // because the batch launcher sets up the dependency analysis helper
	public void extensionsFindAppliedStereotypes() throws Exception {
		assertThat(MigrationTracker.foundBeforeMainMigration, not(lessThan(2L)));
		assertThat(MigrationTracker.foundAfterMainMigration, not(lessThan(2L)));
	}

	//
	// Test framework
	//

	public static class MigrationTracker implements TransformationExtension {

		public static boolean isEnabled = false;

		static long foundBeforeMainMigration;
		static long foundAfterMainMigration;

		private ImportTransformation transformation;

		@Override
		public Set<EPackage> getAdditionalSourceEPackages() {
			return Collections.emptySet();
		}

		@Override
		public void setResourceSet(ResourceSet resourceSet) {
			// Pass
		}

		@Override
		public void setExecutorsPool(ExecutorsPool executorsPool) {
			// Pass
		}

		@Override
		public void setTransformation(ImportTransformation importTransformation) {
			// Re-initialize counts for this test
			foundBeforeMainMigration = 0L;
			foundAfterMainMigration = 0L;

			this.transformation = importTransformation;
		}

		@Override
		public IStatus executeBefore(ExecutionContext context, IProgressMonitor monitor) {
			if (isEnabled) {
				foundBeforeMainMigration = countStereotypes();
				monitor.worked(1);
			}
			return Status.OK_STATUS;
		}

		@Override
		public IStatus executeAfter(ExecutionContext context, IProgressMonitor monitor) {
			if (isEnabled) {
				foundAfterMainMigration = countStereotypes();
				monitor.worked(1);
			}
			return Status.OK_STATUS;
		}

		long countStereotypes() {
			List<EObject> models = transformation.getInOutUMLModel().getContents();
			Stream<EObject> all = StreamSupport.stream(spliteratorUnknownSize(EcoreUtil.getAllContents(models, true),
					Spliterator.DISTINCT | Spliterator.IMMUTABLE | Spliterator.NONNULL | Spliterator.ORDERED),
					false);

			return all.filter(Classifier.class::isInstance).map(Classifier.class::cast)
					.filter(this::hasStereotype)
					.count();
		}

		boolean hasStereotype(Element element) {
			return (element.getAppliedStereotype("today::Foo") != null)
					|| (element.getAppliedStereotype("today::Bar") != null);
		}

		@Override
		public int getNumberOfSteps() {
			return isEnabled ? 2 : 0;
		}

	}
}
