/********************************************************************************
 * Copyright (c) 2015-2018 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.filerelease;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;

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

import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.adapter.EntityStore;
import org.eclipse.mdm.api.base.model.Entity;
import org.eclipse.mdm.api.base.model.Environment;
import org.eclipse.mdm.api.base.model.Test;
import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.api.base.model.User;
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.eclipse.mdm.filerelease.control.FileConvertJobManager;
import org.eclipse.mdm.filerelease.control.FileReleaseManager;
import org.eclipse.mdm.filerelease.entity.FileRelease;
import org.mockito.Mockito;

public class FileReleaseServiceMockHelper {

	public static final String TEST_USERNAME_SELF = "sa";
	public static final String TEST_USERNAME_OTHER = "ot";

	public static final String TESTSTEP = "TestStep";

	public static final int NUM_FILE_REL_IN = 3;
	public static final int NUM_FILE_REL_OUT = 5;

	public static final String ID_IN_PREFIX = "IN";
	public static final String ID_OUT_PREFIX = "OUT";
	
	private FileReleaseServiceMockHelper() {
	}

	public static FileReleaseManager createFileReleaseManagerMock() throws Exception {

		FileReleaseManager frManagerMock = new FileReleaseManager();
		Field releaseMapField = frManagerMock.getClass().getDeclaredField("releaseMap");
		releaseMapField.setAccessible(true);
		releaseMapField.set(frManagerMock, new HashMap<>());
		for (FileRelease fr : createFileReleaseMockList()) {
			frManagerMock.addFileRelease(fr);
		}

		releaseMapField.setAccessible(false);
		return frManagerMock;
	}

	public static FileConvertJobManager createFileConvertJobManagerMock() {
		return Mockito.mock(FileConvertJobManager.class);
	}

	public static ConnectorService createConnectorServiceMock() throws Exception {
		ConnectorService mockedConnectorService = Mockito.mock(ConnectorService.class);
		ApplicationContext mockedContext = createContextMock();
		List<ApplicationContext> contextList = new ArrayList<>();
		contextList.add(mockedContext);
		when(mockedConnectorService.getContexts()).thenReturn(contextList);
		when(mockedConnectorService.getContextByName("MDMENV")).thenReturn(contextList.get(0));
		return mockedConnectorService;
	}

	public static ApplicationContext createContextMock() throws Exception {
		EntityManager em = Mockito.mock(EntityManager.class);

		Environment mockedEnv = createEntityMock(Environment.class, "MDMENV", "MDMENV", "1");
		when(em.loadEnvironment()).thenReturn(mockedEnv);

		User mockedUser = createEntityMock(User.class, TEST_USERNAME_SELF, "MDMENV", "1");
		when(em.loadLoggedOnUser()).thenReturn(Optional.of(mockedUser));

		Test mockedTest = createEntityMock(Test.class, "Test", "MDMENV", "1");
		mockedTest.setResponsiblePerson(mockedUser);
		when(em.loadParent(any(TestStep.class), eq(TestStep.PARENT_TYPE_TEST)))
				.thenReturn(Optional.of(mockedTest));

		TestStep mockedTestStep1 = createEntityMock(TestStep.class, "Teststep", "MDMENV", "123");
		when(em.load(TestStep.class, "123")).thenReturn(mockedTestStep1);

		TestStep mockedTestStep2 = createEntityMock(TestStep.class, "Teststep", "MDMENV", "1234");
		when(em.load(TestStep.class, "1234")).thenReturn(mockedTestStep2);

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

	private static List<FileRelease> createFileReleaseMockList() {
		List<FileRelease> fileReleasMockList = new ArrayList<>();

		for (int i = 0; i < NUM_FILE_REL_IN; i++) {
			FileRelease fileRelease = new FileRelease();
			fileRelease.receiver = TEST_USERNAME_SELF;
			fileRelease.sourceName = "MDMENV";
			fileRelease.typeName = "TestStep";
			fileRelease.id = String.valueOf(i);
			fileRelease.sender = TEST_USERNAME_OTHER;
			fileRelease.identifier = ID_IN_PREFIX + i;
			fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_ORDERED;
			fileReleasMockList.add(fileRelease);
		}

		for (int i = 0; i < NUM_FILE_REL_OUT; i++) {
			FileRelease fileRelease = new FileRelease();
			fileRelease.sourceName = "MDMENV";
			fileRelease.typeName = "TestStep";
			fileRelease.id = String.valueOf(i + NUM_FILE_REL_IN);
			fileRelease.receiver = TEST_USERNAME_OTHER;
			fileRelease.identifier = ID_OUT_PREFIX + i;
			fileRelease.sender = TEST_USERNAME_SELF;
			fileRelease.state = FileReleaseManager.FILE_RELEASE_STATE_ORDERED;
			fileReleasMockList.add(fileRelease);
		}
		return fileReleasMockList;

	}

	private static <T extends Entity> T createEntityMock(Class<T> type, String name, String sourceName, String id)
			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);
		when(core.getValues()).thenReturn(map);

		EntityStore entityStore = new EntityStore();
		when(core.getMutableStore()).thenReturn(entityStore);

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