/*********************************************************************
* Copyright (c) 2019 The University of York.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.epsilon.executors.egl;

import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.eclipse.epsilon.common.parse.problem.ParseProblem;
import org.eclipse.epsilon.egl.EglTemplateFactory;
import org.eclipse.epsilon.egl.EglTemplateFactoryModuleAdapter;
import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
import org.eclipse.epsilon.eol.models.IModel;
import org.eclipse.epsilon.eol.types.IToolNativeTypeDelegate;
import org.eclipse.epsilon.erl.execute.RuleProfiler;
import org.eclipse.epsilon.executors.EpsilonLanguageExecutor;
import org.eclipse.epsilon.executors.ModuleWrap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * The EGL executor
 * @author Horacio Hoyos Rodriguez
 * @since 1.6
 */
public class SimpleEglExecutor implements EpsilonLanguageExecutor<Optional<String>> {

	private static final Logger logger = LoggerFactory.getLogger(SimpleEglExecutor.class);
	private EglTemplateFactoryModuleAdapter module;
	private ModuleWrap helper;

	public SimpleEglExecutor() {
		this(new EglTemplateFactoryModuleAdapter(new EglTemplateFactory()));
    }

	public SimpleEglExecutor(EglTemplateFactory templateFactory) {
		this(new EglTemplateFactoryModuleAdapter(templateFactory));
	}
	
	public SimpleEglExecutor(EglTemplateFactoryModuleAdapter mdl) {
		logger.info("Creating the EglExecutor");
		module = mdl;
    	helper = new ModuleWrap(module);
	}
	
	@Override
	public Optional<String> execute() throws EolRuntimeException {
		logger.info("Executing current EGL template.");
		String r = (String) ((EglTemplateFactoryModuleAdapter)module).execute();
		return Optional.ofNullable(r);
	}

	@Override
	public boolean parse(File file) throws Exception {
		return helper.parse(file);
	}

	@Override
	public boolean parse(String code) throws Exception {
		return helper.parse(code);
	}

	@Override
	public List<ParseProblem> getParseProblems() {
		return helper.getParseProblems();
	}

	@Override
	public void addModels(Collection<IModel> models) {
		helper.addModels(models);
	}

	@Override
	public void addParamters(Map<String, ?> parameters) {
		helper.addParamters(parameters);
	}

	@Override
	public void addNativeTypeDelegates(Collection<IToolNativeTypeDelegate> nativeDelegates) {
		helper.addNativeTypeDelegates(nativeDelegates);
	}

	@Override
	public Optional<RuleProfiler> getRuleProfiler() {
		return helper.getRuleProfiler();
	}

	@Override
	public void disposeModelRepository() {
		helper.disposeModelRepository();
	}

	@Override
	public void clearModelRepository() {
		helper.clearModelRepository();
	}

	@Override
	public void dispose() {
		helper.dispose();
	}

	@Override
	public void preProcess() {
		
	}

	@Override
	public void postProcess() {
		
	}

}
