/********************************************************************************
 * 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;

import static java.util.Objects.requireNonNull;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import javax.ejb.Stateless;
import javax.inject.Inject;

import org.eclipse.mdm.api.base.model.Channel;
import org.eclipse.mdm.api.base.model.ChannelGroup;
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.Test;
import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.api.base.query.DataAccessException;
import org.eclipse.mdm.api.dflt.model.Pool;
import org.eclipse.mdm.api.dflt.model.Project;
import org.eclipse.mdm.connector.boundary.ConnectorService;

/**
 * NavigationActivity Bean implementation to lookup specified business object
 * children
 * 
 * @author Sebastian Dirsch, Gigatronik Ingolstadt GmbH
 *
 */
@Stateless
public class NavigationActivity {

	@Inject
	private ConnectorService connectorService;

	// here for cdi to work
	public NavigationActivity() {

	}

	public NavigationActivity(ConnectorService connectorService) {
		this.connectorService = requireNonNull(connectorService, "ConnectorService cannot be null!");
	}

	/**
	 * returns the MDM {@link Environment} business objects of all connected MDM
	 * systems
	 * 
	 * @return MDM {@link Environment} business objects
	 */
	public List<Environment> getEnvironments() {
		try {
			return this.connectorService.getContexts().stream().map(c -> c.getEntityManager())
					.filter(Optional::isPresent).map(em -> em.get().loadEnvironment()).collect(Collectors.toList());
		} catch (DataAccessException e) {
			throw new MDMEntityAccessException(e.getMessage(), e);
		}
	}

	/**
	 * returns all MDM {@link Project} business objects of the connected MDM system
	 * identified by the given name
	 * 
	 * @param sourceName Name of the MDM system
	 * @return MDM {@link Project} business objects
	 */
	public List<Project> getProjects(String sourceName) {
		try {
			return this.connectorService.getContextByName(sourceName).getEntityManager()
					.map(em -> em.loadAll(Project.class)).orElseThrow(() -> new MDMEntityAccessException(
							"No EntityManager found for source " + sourceName + "!"));
		} catch (DataAccessException e) {
			throw new MDMEntityAccessException(e.getMessage(), e);
		}
	}

	/**
	 * returns all MDM {@link Test} business objects of the connected MDM system
	 * identified by the given name
	 * 
	 * @param sourceName Name of the MDM system
	 * @return MDM {@link Test} business objects
	 */
	public List<Test> getTests(String sourceName) {
		try {
			return this.connectorService.getContextByName(sourceName).getEntityManager()
					.map(em -> em.loadAll(Test.class)).orElseThrow(() -> new MDMEntityAccessException(
							"No EntityManager found for source " + sourceName + "!"));
		} catch (DataAccessException e) {
			throw new MDMEntityAccessException(e.getMessage(), e);
		}
	}

	/**
	 * returns all MDM {@link Test} business object children for a MDM {@link Pool}
	 * identified by the given source name and {@link Pool} ID.
	 * 
	 * @param sourceName Name of the MDM system
	 * @param poolID     The {@code Pool} instance ID
	 * @return MDM {@link Test} business objects
	 */
	public List<Test> getTests(String sourceName, String poolID) {
		return getChildren(sourceName, Pool.class, poolID, Test.class);
	}

	/**
	 * returns all MDM {@link Pool} business object children for a MDM
	 * {@link Project} identified by the given source name and {@link Project} ID.
	 * 
	 * @param sourceName Name of the MDM system
	 * @param projectID  The {@code Project} instance ID
	 * @return MDM {@link Pool} business objects
	 */
	public List<Pool> getPools(String sourceName, String projectID) {
		return getChildren(sourceName, Project.class, projectID, Pool.class);
	}

	/**
	 * returns all MDM {@link TestStep} business object children for a MDM
	 * {@link Test} identified by the given source name and {@link Test} ID.
	 * 
	 * @param sourceName Name of the MDM system
	 * @param testID     The {@code Test} instance ID
	 * @return MDM {@link TestStep} business objects
	 */
	public List<TestStep> getTestSteps(String sourceName, String testID) {
		return getChildren(sourceName, Test.class, testID, TestStep.class);
	}

	/**
	 * returns all MDM {@link Measurement} business object children for a MDM
	 * {@link TestStep} identified by the given source name and {@link TestStep} ID.
	 * 
	 * @param sourceName Name of the MDM system
	 * @param testStepID The {@code TestStep} instance ID
	 * @return MDM {@link Measurement} business objects
	 */
	public List<Measurement> getMeasurements(String sourceName, String testStepID) {
		return getChildren(sourceName, TestStep.class, testStepID, Measurement.class);
	}

	/**
	 * returns all MDM {@link ChannelGroup} business object children for a MDM
	 * {@link Measurement} identified by the given source name and
	 * {@link Measurement} ID.
	 * 
	 * @param sourceName    Name of the MDM system
	 * @param measurementID The {@code Measurement} instance ID
	 * @return MDM {@link ChannelGroup} business objects
	 */
	public List<ChannelGroup> getChannelGroups(String sourceName, String measurementID) {
		return getChildren(sourceName, Measurement.class, measurementID, ChannelGroup.class);
	}

	/**
	 * returns all MDM {@link Channel} business object children for a MDM
	 * {@link ChannelGroup} identified by the given source name and
	 * {@link ChannelGroup} ID.
	 * 
	 * @param sourceName     Name of the MDM system
	 * @param channelGroupID The {@code ChannelGroup} instance ID
	 * @return MDM {@link Channel} business objects
	 */
	public List<Channel> getChannels(String sourceName, String channelGroupID) {
		return getChildren(sourceName, ChannelGroup.class, channelGroupID, Channel.class);
	}

	private <T extends Entity> List<T> getChildren(String sourceName, Class<? extends Entity> parentType,
			String parentID, Class<T> childType) {
		try {
			return this.connectorService.getContextByName(sourceName).getEntityManager()
					.map(em -> em.loadChildren(em.load(parentType, parentID), childType))
					.orElseThrow(() -> new MDMEntityAccessException(
							"No EntityManager found for source " + sourceName + "!"));
		} catch (DataAccessException e) {
			throw new MDMEntityAccessException(e.getMessage(), e);
		}
	}

}
