/*********************************************************************************
 * Copyright (c) 2020 Robert Bosch GmbH and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Robert Bosch GmbH - initial API and implementation
 ********************************************************************************
 */

package org.eclipse.app4mc.amalthea.converters097.tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.eclipse.app4mc.amalthea.converters.common.base.ICache;
import org.eclipse.app4mc.amalthea.converters.common.base.IConverter;
import org.eclipse.app4mc.amalthea.converters.common.base.IPostProcessor;
import org.eclipse.app4mc.amalthea.converters.common.converter.NamespaceConverter;
import org.eclipse.app4mc.amalthea.converters.common.utils.AmaltheaNamespaceRegistry;
import org.eclipse.app4mc.amalthea.converters.common.utils.HelperUtil;
import org.eclipse.app4mc.amalthea.converters097.impl.ComponentsModelConverter;
import org.eclipse.app4mc.amalthea.converters097.utils.AmltModelReferencePostProcessor;
import org.eclipse.app4mc.amalthea.converters097.utils.ComponentPortInterfaceCacheBuilder;
import org.jdom2.Document;
import org.jdom2.Element;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.MethodSorters;
import org.junit.runners.Parameterized;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(Parameterized.class)
public class ComponentsModelConverterTest2 extends Abstract097ConverterTest {

	@Parameterized.Parameters(name = "{index}: Test file: {0}")
	public static Collection<Object[]> getTestData() {

		String[] inputFiles = { 
				"/component2/democar-common.amxmi", 
				"/component2/democar-hw.amxmi",
				"/component2/democar-os.amxmi",
				"/component2/democar-req.amxmi",
				"/component2/democar-stimuli.amxmi",
				"/component2/democar-sw.amxmi"};

		return Arrays.asList(new Object[][] { { inputFiles, true } });
	}

	public ComponentsModelConverterTest2(final String[] xmlFileRelativeLocation, final boolean canExecuteTestCase) {
		super(canExecuteTestCase, xmlFileRelativeLocation);
	}

	@Test
	public void testConversion() {
		super.testConversion(NamespaceConverter.class, ComponentsModelConverter.class);
	}

	@Override
	@Test
	public void verification() {
		super.verification();
	}

	@Override
	protected void modelFileVerificationHook(Document document) {
		super.modelFileVerificationHook(document);
		
		if (document.getBaseURI().endsWith("democar-common.amxmi")) {
			// verify that the interfaces are created in democar-common
			List<Element> interfaces = HelperUtil.getXpathResult(
					document.getRootElement(),
					"./componentsModel/interfaces",
					Element.class,
					AmaltheaNamespaceRegistry.getNamespace(getOutputModelVersion(), "am"), 
					AmaltheaNamespaceRegistry.getGenericNamespace("xsi"));

			assertEquals(2, interfaces.size());
			
			// collect element names
			ArrayList<String> interfaceNames = new ArrayList<>();
			for (Element element : interfaces) {
				interfaceNames.add(element.getAttribute("name").getValue());
			}

			assertEquals(2, interfaceNames.size());
			assertTrue(interfaceNames.contains("abc-and-the-rest"));
			assertTrue(interfaceNames.contains("xyz-only"));
		}
		
	}
	
	@Override
	protected List<ICache> buildCaches() {
		List<ICache> caches = super.buildCaches();

		ComponentPortInterfaceCacheBuilder cacheBuilder = new ComponentPortInterfaceCacheBuilder();
		cacheBuilder.buildCache(this.fileDocumentMapping);
		caches.add(cacheBuilder);
		
		// only cache the interfaces for one of the files to convert
		assertEquals(1, cacheBuilder.getCacheMap().size());
		
		Map<String, Object> interfaceMap = cacheBuilder.getCacheMap().values().iterator().next();
		assertEquals(2, interfaceMap.size());
		assertTrue(interfaceMap.containsKey(ComponentPortInterfaceCacheBuilder.INTERFACE_CACHE_KEY));
		assertTrue(interfaceMap.containsKey(ComponentPortInterfaceCacheBuilder.INSTANCE_PARENT_CACHE_KEY));

		Collection<String> interfaceNames = cacheBuilder.getCachedInterfaceNames();
		assertEquals(2, interfaceNames.size());
		assertTrue(interfaceNames.contains("abc-and-the-rest"));
		assertTrue(interfaceNames.contains("xyz-only"));
		
		return caches;
	}

	// accessibility updates in test cases are ok here, at runtime the reference is set by the SCR
	@SuppressWarnings("squid:S3011")
	@Override
	protected void setCache(IConverter converter, List<ICache> caches)
			throws IllegalAccessException, NoSuchFieldException {

		if (converter instanceof ComponentsModelConverter) {
			for (ICache iCache : caches) {
				if (iCache instanceof ComponentPortInterfaceCacheBuilder) {
					Field declaredField = ((ComponentsModelConverter) converter).getClass().getDeclaredField("cache");
					declaredField.setAccessible(true);
					declaredField.set(converter, iCache);
					return;
				}
			}
		}
	}
	

	@Override
	protected List<IPostProcessor> buildPostProcessors() {
		List<IPostProcessor> postProcessors = new ArrayList<>();		
		postProcessors.add(new AmltModelReferencePostProcessor());		
		return postProcessors;
	}

}
