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

import java.util.List;
import java.util.Optional;

import org.eclipse.mdm.api.dflt.EntityManager;
import org.eclipse.mdm.api.dflt.model.TemplateTest;
import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
import org.eclipse.mdm.api.dflt.model.TemplateTestStepUsage;

/**
 * Resolves templates by always returning the first template found.
 *
 */
public class TemplateResolver {

	private EntityManager entitymanager;

	public TemplateResolver(EntityManager entitymanager) {
		this.entitymanager = entitymanager;
	}

	public Optional<TemplateTest> resolveTemplateTest() {
		List<TemplateTest> listTemplateTests = entitymanager.loadAll(TemplateTest.class);

		if (listTemplateTests.isEmpty()) {
			return Optional.empty();
		} else {
			return Optional.of(listTemplateTests.get(0));
		}

	}

	public Optional<TemplateTestStep> resolveTemplateTestStep(Optional<TemplateTest> templateTestDst) {
		if (!templateTestDst.isPresent()) {
			return Optional.empty();
		}
		return resolveTemplateTestStep(templateTestDst.get());
	}

	public Optional<TemplateTestStep> resolveTemplateTestStep(TemplateTest templateTestDst) {
		for (TemplateTestStepUsage templateTestStepUsage : templateTestDst.getTemplateTestStepUsages())
		{
			return Optional.ofNullable(templateTestStepUsage.getTemplateTestStep());
		}
		return Optional.empty();
	}
}
