/********************************************************************************
 * 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.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);
		}
	}

}
