/**
 * <copyright>
 *
 * Copyright (c) 2016-2021 itemis, Siemens 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:
 *     itemis - Initial API and implementation
 *     Siemens - [577073] URI change detector delegate extension
 *
 * </copyright>
 */
package org.eclipse.sphinx.tests.emf.workspace.referentialintegrity;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.sphinx.emf.workspace.internal.referentialintegrity.IntermittentRemoveTracker;
import org.eclipse.sphinx.emf.workspace.referentialintegrity.IURIChangeDetectorDelegate;
import org.eclipse.sphinx.emf.workspace.referentialintegrity.URIChangeNotification;
import org.eclipse.sphinx.examples.hummingbird20.ide.internal.referentialintegrity.Hummingbird20URIChangeDetectorDelegate;
import org.eclipse.sphinx.examples.hummingbird20.instancemodel.InstanceModel20Factory;
import org.eclipse.sphinx.examples.hummingbird20.instancemodel.ParameterValue;
import org.eclipse.sphinx.tests.emf.workspace.referentialintegrity.scenarios.Hummingbird20TestModel;
import org.junit.Before;
import org.junit.Test;

@SuppressWarnings({ "nls", "restriction" })
public class AbstractHierarchicalFragmentURIChangeDetectorDelegateTest {

	protected static final int MAX_INTERMITTENT_REMOVE_TEST_INTERVAL = 100;

	private static class TestURIChangeDetectorDelegate extends Hummingbird20URIChangeDetectorDelegate {
		@Override
		protected IntermittentRemoveTracker createIntermittentRemoveTracker() {
			IntermittentRemoveTracker intermittentRemoveTracker = super.createIntermittentRemoveTracker();
			intermittentRemoveTracker.setMaxIntermittentRemoveInterval(100);
			return intermittentRemoveTracker;
		}
	}

	private static class TestURIChangeDetectorAdapter extends EContentAdapter {

		private IURIChangeDetectorDelegate delegate;
		private Map<Resource, List<URIChangeNotification>> changedURIs = new HashMap<>();

		public TestURIChangeDetectorAdapter(IURIChangeDetectorDelegate delegate) {
			this.delegate = delegate;
		}

		@Override
		public void notifyChanged(Notification notification) {
			Map<Resource, List<URIChangeNotification>> changedURIsResult = delegate.detectChangedURIs(Collections.singletonList(notification));

			for (Resource resource : changedURIsResult.keySet()) {
				if (changedURIs.containsKey(resource)) {
					changedURIs.get(resource).addAll(changedURIsResult.get(resource));
				} else {
					changedURIs.put(resource, changedURIsResult.get(resource));
				}
			}

		}

		public Map<Resource, List<URIChangeNotification>> getChangedURIs() {
			return changedURIs;
		}

		public long getChangedURISize() {
			return getChangedURIs().values().stream().map(Collection::size).reduce(0, Integer::sum);
		}
	}

	private Hummingbird20TestModel model;
	private TestURIChangeDetectorAdapter uriChangeDectector;

	@Before
	public void setup() {
		model = new Hummingbird20TestModel();
		uriChangeDectector = new TestURIChangeDetectorAdapter(new TestURIChangeDetectorDelegate());
		model.resourceSet.eAdapters().add(uriChangeDectector);
	}

	@Test
	public void testDetectChangedURIsNotification_singleLeafObjectChanged() {
		model.parameterValue111.setName("parameterValue111_changed");

		Map<Resource, List<URIChangeNotification>> changedURIs = uriChangeDectector.getChangedURIs();
		assertEquals(1, uriChangeDectector.getChangedURISize());

		assertTrue(changedURIs.containsKey(model.resource1));
		assertEquals(1, changedURIs.keySet().size());
		URIChangeNotification uriChangeNotification = changedURIs.get(model.resource1).get(0);
		assertSame(model.parameterValue111, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue111"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue111_changed"), uriChangeNotification.getNewURI());
	}

	@Test
	public void testDetectChangedURIsNotification_multipleLeafObjectsChanged() {
		model.parameterValue111.setName("parameterValue111_changed");
		model.parameterValue112.setName("parameterValue112_changed");

		Map<Resource, List<URIChangeNotification>> changedURIs = uriChangeDectector.getChangedURIs();
		assertEquals(2, uriChangeDectector.getChangedURISize());

		assertTrue(changedURIs.containsKey(model.resource1));
		assertEquals(1, changedURIs.keySet().size());
		URIChangeNotification uriChangeNotification = changedURIs.get(model.resource1).get(0);
		assertSame(model.parameterValue111, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue111"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue111_changed"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource1).get(1);
		assertSame(model.parameterValue112, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue112"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue112_changed"), uriChangeNotification.getNewURI());
	}

	@Test
	public void testDetectChangedURIsNotification_containerObjectChanged() {
		model.component11.setName("component11_changed");

		Map<Resource, List<URIChangeNotification>> changedURIs = uriChangeDectector.getChangedURIs();
		assertEquals(4, uriChangeDectector.getChangedURISize());

		assertTrue(changedURIs.containsKey(model.resource1));
		assertEquals(1, changedURIs.keySet().size());
		URIChangeNotification uriChangeNotification = changedURIs.get(model.resource1).get(0);
		assertSame(model.component11, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component11_changed"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource1).get(1);
		assertSame(model.component11ToComponent22Connection, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/component11ToComponent22Connection"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component11_changed/component11ToComponent22Connection"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource1).get(2);
		assertSame(model.parameterValue111, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue111"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component11_changed/parameterValue111"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource1).get(3);
		assertSame(model.parameterValue112, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue112"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component11_changed/parameterValue112"), uriChangeNotification.getNewURI());
	}

	@Test
	public void testDetectChangedURIsNotification_singleLeafObjectRemovedAndAddedElsewhere() {
		model.component22.getParameterValues().remove(model.parameterValue221);
		model.component11.getParameterValues().add(model.parameterValue221);

		Map<Resource, List<URIChangeNotification>> changedURIs = uriChangeDectector.getChangedURIs();
		assertEquals(1, uriChangeDectector.getChangedURISize());

		assertTrue(changedURIs.containsKey(model.resource1));
		assertEquals(1, changedURIs.keySet().size());
		URIChangeNotification uriChangeNotification = changedURIs.get(model.resource1).get(0);
		assertSame(model.parameterValue221, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource2#//component22/parameterValue221"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue221"), uriChangeNotification.getNewURI());
	}

	@Test
	public void testDetectChangedURIsNotification_multipleLeafObjectsRemovedAndAddedElsewhere() {
		model.component11.getParameterValues().remove(model.parameterValue111);
		model.component11.getParameterValues().remove(model.parameterValue112);
		model.component22.getParameterValues().add(model.parameterValue111);
		model.component22.getParameterValues().add(model.parameterValue112);

		Map<Resource, List<URIChangeNotification>> changedURIs = uriChangeDectector.getChangedURIs();
		assertEquals(2, uriChangeDectector.getChangedURISize());

		assertTrue(changedURIs.containsKey(model.resource2));
		assertEquals(1, changedURIs.keySet().size());
		URIChangeNotification uriChangeNotification = changedURIs.get(model.resource2).get(0);
		assertSame(model.parameterValue111, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue111"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource2#//component22/parameterValue111"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource2).get(1);
		assertSame(model.parameterValue112, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue112"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource2#//component22/parameterValue112"), uriChangeNotification.getNewURI());
	}

	@Test
	public void testDetectChangedURIsNotification_containerObjectRemovedAndAddedElsewhere() {
		model.application2.getComponents().remove(model.component22);
		model.application1.getComponents().add(model.component22);

		Map<Resource, List<URIChangeNotification>> changedURIs = uriChangeDectector.getChangedURIs();
		assertEquals(3, uriChangeDectector.getChangedURISize());

		assertTrue(changedURIs.containsKey(model.resource1));
		assertEquals(1, changedURIs.keySet().size());
		URIChangeNotification uriChangeNotification = changedURIs.get(model.resource1).get(0);
		assertSame(model.component22, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource2#//component22"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component22"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource1).get(1);
		assertSame(model.component22ToComponent11Connection, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource2#//component22/component22ToComponent11Connection"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component22/component22ToComponent11Connection"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource1).get(2);
		assertSame(model.parameterValue221, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource2#//component22/parameterValue221"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component22/parameterValue221"), uriChangeNotification.getNewURI());
	}

	@Test
	public void testDetectChangedURIsNotification_singleLeafObjectMoved() {
		model.component11.getParameterValues().add(model.parameterValue221);

		Map<Resource, List<URIChangeNotification>> changedURIs = uriChangeDectector.getChangedURIs();
		assertEquals(1, uriChangeDectector.getChangedURISize());

		assertTrue(changedURIs.containsKey(model.resource1));
		assertEquals(1, changedURIs.keySet().size());
		URIChangeNotification uriChangeNotification = changedURIs.get(model.resource1).get(0);
		assertSame(model.parameterValue221, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource2#//component22/parameterValue221"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue221"), uriChangeNotification.getNewURI());
	}

	@Test
	public void testDetectChangedURIsNotification_multipleObjectsMoved() {
		model.component22.getParameterValues().add(model.parameterValue111);
		model.component22.getParameterValues().add(model.parameterValue112);

		Map<Resource, List<URIChangeNotification>> changedURIs = uriChangeDectector.getChangedURIs();
		assertEquals(2, uriChangeDectector.getChangedURISize());

		assertTrue(changedURIs.containsKey(model.resource2));
		assertEquals(1, changedURIs.keySet().size());
		URIChangeNotification uriChangeNotification = changedURIs.get(model.resource2).get(0);
		assertSame(model.parameterValue111, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue111"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource2#//component22/parameterValue111"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource2).get(1);
		assertSame(model.parameterValue112, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource1#//component11/parameterValue112"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource2#//component22/parameterValue112"), uriChangeNotification.getNewURI());
	}

	@Test
	public void testDetectChangedURIsNotification_containerObjectMoved() {
		model.application1.getComponents().add(model.component22);

		Map<Resource, List<URIChangeNotification>> changedURIs = uriChangeDectector.getChangedURIs();
		assertEquals(3, uriChangeDectector.getChangedURISize());

		assertTrue(changedURIs.containsKey(model.resource1));
		assertEquals(1, changedURIs.keySet().size());
		URIChangeNotification uriChangeNotification = changedURIs.get(model.resource1).get(0);
		assertSame(model.component22, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource2#//component22"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component22"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource1).get(1);
		assertSame(model.component22ToComponent11Connection, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource2#//component22/component22ToComponent11Connection"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component22/component22ToComponent11Connection"), uriChangeNotification.getNewURI());

		uriChangeNotification = changedURIs.get(model.resource1).get(2);
		assertSame(model.parameterValue221, uriChangeNotification.getNewEObject());
		assertNotNull(uriChangeNotification.getOldURI());
		assertEquals(URI.createURI("resource2#//component22/parameterValue221"), uriChangeNotification.getOldURI());
		assertNotNull(uriChangeNotification.getNewURI());
		assertEquals(URI.createURI("resource1#//component22/parameterValue221"), uriChangeNotification.getNewURI());
	}

	@Test
	public void testDetectChangedURIsNotification_unrelatedRemovalsAndAdditions() throws InterruptedException {
		assertEquals(2, model.component11.getParameterValues().size());
		assertEquals(1, model.component22.getParameterValues().size());

		// Isolated addition
		ParameterValue parameterValue113 = InstanceModel20Factory.eINSTANCE.createParameterValue();
		model.component11.getParameterValues().add(parameterValue113);

		assertEquals(3, model.component11.getParameterValues().size());
		assertEquals(1, model.component22.getParameterValues().size());
		assertEquals(0, uriChangeDectector.getChangedURIs().size());

		// Isolated removal
		model.component11.getParameterValues().remove(model.parameterValue111);

		assertEquals(2, model.component11.getParameterValues().size());
		assertEquals(1, model.component22.getParameterValues().size());
		assertEquals(0, uriChangeDectector.getChangedURIs().size());

		// Addition and removal
		ParameterValue parameterValue114 = InstanceModel20Factory.eINSTANCE.createParameterValue();
		model.component11.getParameterValues().add(parameterValue114);
		model.component11.getParameterValues().remove(parameterValue114);

		assertEquals(2, model.component11.getParameterValues().size());
		assertEquals(1, model.component22.getParameterValues().size());
		assertEquals(0, uriChangeDectector.getChangedURIs().size());

		// Unrelated removal and addition
		model.component11.getParameterValues().remove(model.parameterValue112);
		Thread.sleep(MAX_INTERMITTENT_REMOVE_TEST_INTERVAL * 2);
		model.component22.getParameterValues().add(model.parameterValue112);

		assertEquals(1, model.component11.getParameterValues().size());
		assertEquals(2, model.component22.getParameterValues().size());
		assertEquals(0, uriChangeDectector.getChangedURIs().size());
	}
}
