/********************************************************************************
 * Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
 *
 * See the NOTICE file(s) distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/

package org.eclipse.mdm.businessobjects.control.context;

import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.eclipse.mdm.api.base.adapter.ChildrenStore;
import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.ContextComponent;
import org.eclipse.mdm.api.base.model.ContextRoot;
import org.eclipse.mdm.api.base.model.ContextType;
import org.eclipse.mdm.api.base.model.Entity;
import org.eclipse.mdm.api.base.model.Environment;
import org.eclipse.mdm.api.base.model.Measurement;
import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.api.base.model.Value;
import org.eclipse.mdm.api.base.model.ValueType;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.eclipse.mdm.api.dflt.EntityManager;
import org.eclipse.mdm.connector.boundary.ConnectorService;
import org.mockito.Mockito;

public final class ContextActivityMockHelper {

	public static final int ITEM_COUNT = 1;
	public static final int CC_COUNT = 10;
	public static final int CC_VALUE_COUNT = 10;

	private ContextActivityMockHelper() {
	}

	public static ConnectorService createConnectorMock() throws Exception {

		ConnectorService connectorBean = Mockito.mock(ConnectorService.class);

		List<ApplicationContext> contextList = new ArrayList<>();
		for (int i = 1; i <= ITEM_COUNT; i++) {
			contextList.add(createContextMock("MDMENV_" + i));
		}
		when(connectorBean.getContexts()).thenReturn(contextList);
		when(connectorBean.getContextByName(anyString())).thenReturn(contextList.get(0));
		return connectorBean;
	}

	private static ApplicationContext createContextMock(String sourceName) throws Exception {

		Environment env = createEntityMock(Environment.class, sourceName, sourceName, "1", null);

		EntityManager em = Mockito.mock(EntityManager.class);

		TestStep testStep = createEntityMock(TestStep.class, "TestStepWithContext", "MDM", "1", null);
		Measurement measurement = createEntityMock(Measurement.class, "MeasurementWithContext", "MDM", "1", null);

		when(em.loadEnvironment()).thenReturn(env);
		when(em.load(TestStep.class, "1")).thenReturn(testStep);
		when(em.load(Measurement.class, "1")).thenReturn(measurement);
		when(em.loadParent(measurement, Measurement.PARENT_TYPE_TESTSTEP)).thenReturn(Optional.of(testStep));

		List<Measurement> mList = new ArrayList<>();
		mList.add(measurement);

		when(em.loadChildren(testStep, TestStep.CHILD_TYPE_MEASUREMENT)).thenReturn(mList);

		Map<ContextType, ContextRoot> orderedContext = createContext("ordered");
		Map<ContextType, ContextRoot> measuredContext = createContext("measured");
		when(em.loadContexts(testStep)).thenReturn(orderedContext);
		when(em.loadContexts(measurement)).thenReturn(measuredContext);

		ApplicationContext context = Mockito.mock(ApplicationContext.class);
		when(context.getEntityManager()).thenReturn(Optional.of(em));
		return context;
	}

	private static <T extends Entity> T createEntityMock(Class<T> type, String name, String sourceName, String id,
			ChildrenStore childrenStore) throws Exception {

		HashMap<String, Value> map = new HashMap<String, Value>();
		map.put("Name", ValueType.STRING.create("Name", name));

		Core core = Mockito.mock(Core.class);
		when(core.getSourceName()).thenReturn(sourceName);
		when(core.getValues()).thenReturn(map);
		when(core.getID()).thenReturn(id);
		if (childrenStore != null) {
			when(core.getChildrenStore()).thenReturn(childrenStore);
		}

		if (ContextRoot.class.equals(type)) {
			if (name.contains("TSQ_")) {
				when(core.getTypeName()).thenReturn("TestSequence");
			} else if (name.contains("UUT")) {
				when(core.getTypeName()).thenReturn("UnitUnderTest");
			} else {
				when(core.getTypeName()).thenReturn("TestEquipment");
			}
		}

		Constructor<T> constructor = type.getDeclaredConstructor(Core.class);
		constructor.setAccessible(true);
		T instance = constructor.newInstance(core);
		constructor.setAccessible(false);
		return instance;
	}

	private static ContextRoot createUUTContextRootMock(String type) throws Exception {

		List<ContextComponent> ccList = createContextComponentMocks("UUT");

		ChildrenStore childrenStore = new ChildrenStore();
		for (ContextComponent cc : ccList) {
			childrenStore.add(cc);
		}

		return createEntityMock(ContextRoot.class, "MessungUUT_" + type, "MDM", "1", childrenStore);
	}

	private static ContextRoot createTSQContextRootMock(String type) throws Exception {

		List<ContextComponent> ccList = createContextComponentMocks("TSQ");

		ChildrenStore childrenStore = new ChildrenStore();
		for (ContextComponent cc : ccList) {
			childrenStore.add(cc);
		}

		return createEntityMock(ContextRoot.class, "MessungTSQ_" + type, "MDM", "1", childrenStore);
	}

	private static ContextRoot createTEQContextRootMock(String type) throws Exception {

		List<ContextComponent> ccList = createContextComponentMocks("TEQ");

		ChildrenStore childrenStore = new ChildrenStore();
		for (ContextComponent cc : ccList) {
			childrenStore.add(cc);
		}

		return createEntityMock(ContextRoot.class, "MessungTEQ_" + type, "MDM", "1", childrenStore);
	}

	private static List<ContextComponent> createContextComponentMocks(String type) throws Exception {
		List<ContextComponent> ccList = new ArrayList<>();
		for (int i = 1; i <= CC_COUNT; i++) {
			ContextComponent cc = createEntityMock(ContextComponent.class, type + "_ContextComponent_" + i, "MDM",
					Integer.toString(i), null);
			when(cc.getValues()).thenReturn(createValues(type));
			ccList.add(cc);
		}
		return ccList;
	}

	private static Map<String, Value> createValues(String type) {
		Map<String, Value> valueMap = new HashMap<>();
		for (int i = 1; i <= CC_VALUE_COUNT; i++) {
			String vName = type + "_ValueName_" + i;
			valueMap.put(vName, ValueType.STRING.create(vName, type + "_Value_" + i));
		}
		return valueMap;
	}

	private static Map<ContextType, ContextRoot> createContext(String type) throws Exception {
		Map<ContextType, ContextRoot> contextMap = new HashMap<>();
		contextMap.put(ContextType.UNITUNDERTEST, createUUTContextRootMock(type));
		contextMap.put(ContextType.TESTSEQUENCE, createTSQContextRootMock(type));
		contextMap.put(ContextType.TESTEQUIPMENT, createTEQContextRootMock(type));
		return contextMap;
	}

}
