/*******************************************************************************
 * Copyright (C) 2020 Fondazione Bruno Kessler.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 ******************************************************************************/
package org.polarsys.chess.contracts.verificationService.test.runtime.tests;

import java.io.File;
import java.nio.file.Paths;
import java.util.Set;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.papyrus.junit.framework.classification.tests.AbstractPapyrusTest;
import org.eclipse.papyrus.junit.framework.runner.Headless;
import org.eclipse.papyrus.junit.utils.rules.ModelSetFixture;
import org.eclipse.papyrus.junit.utils.rules.PluginResource;
import org.eclipse.papyrus.junit.utils.rules.ResourceSetFixture;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.Package;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
import org.polarsys.chess.OSSImporter.core.actions.ImportOSSFileAction;
import org.polarsys.chess.contracts.profile.chesscontract.util.EntityUtil;
import org.polarsys.chess.contracts.verificationService.test.runtime.util.TestResultsUtil;
import org.polarsys.chess.service.core.model.ChessSystemModel;
import org.polarsys.chess.service.core.model.UMLStateMachineModel;

import eu.fbk.eclipse.standardtools.ModelTranslatorToOcra.core.services.OSSTranslatorServiceAPI;
import eu.fbk.eclipse.standardtools.StateMachineTranslatorToSmv.core.services.SMVTranslatorServiceAPI;
import eu.fbk.tools.adapter.ui.preferences.PreferenceConstants;

@Headless
public class TestBasicOperationsHeadless extends AbstractPapyrusTest {

	@Rule
	public ErrorCollector collector = new ErrorCollector();

	private String testOutput;
	private EntityUtil entityUtil = EntityUtil.getInstance();
	private static final Logger logger = Logger.getLogger(TestBasicOperationsHeadless.class);

	private final String emptyProjectFolderPath = "resources/EmptyProject/";
	private final String emptyProjectPath = "resources/EmptyProject/EmptyProject.di";
		
	private final String projectFolderPath = "resources/SSR_fi/";
	private final String projectPath = projectFolderPath + "SSR.di";

	@Rule
	public final ModelSetFixture modelSet = new ModelSetFixture();
	
	@Rule
	public final ResourceSetFixture resourceSetFixture = new ResourceSetFixture();

	@Test
	@PluginResource(projectPath)
	public void testExportModelAsOss() throws Exception {
		Class umlSelectedComponent = getSystemComponent();

		File ossFile = exportModelAsOss(umlSelectedComponent, testOutput);

		String oracleFilePath = projectFolderPath + "NuSMV3-OCRA/Files/System.oss";
		TestResultsUtil.compareTwoFilesIgnoreEOL(Paths.get(ossFile.getPath()), Paths.get(oracleFilePath));

	}
	
	
	@Test
	@PluginResource(emptyProjectPath)
	public void testImportModelFromOssFile() throws Exception{
		
		Model model = getModel();
		
		//openEditor(model);
		
		Package umlPackage = entityUtil.getSystemViewPackage(model);
		//EntityUtil.getInstance().getCurrentSystemView();
		File ossInputFile = new File("resources//EmptyProject//OssFile//System.oss");
		
		final ImportOSSFileAction action = ImportOSSFileAction.getInstance();

		if (action != null) {
	
			TransactionalEditingDomain domain = modelSet.getEditingDomain();
			System.out.println("domain: "+domain);
			// Parse the file and retrieve results
			action.startParsing((Package) umlPackage, ossInputFile,domain);
			
			Class umlSelectedComponent = entityUtil.getSystemComponent(umlPackage);
			TestBasicOperationsHeadless.exportModelAsOss(umlSelectedComponent, testOutput);

			File outputFolder = new File(testOutput);
			String selectedDirectory = outputFolder.getAbsolutePath();
			
			String oracleFolder = emptyProjectFolderPath + "/OssFile";
			
			TestResultsUtil.dirsAreEqual(oracleFolder, selectedDirectory, collector);

			
			}
	}

	public static File exportModelAsOss(Class umlSelectedComponent,String testOutput) throws Exception {
		
		OSSTranslatorServiceAPI ossTranslatorServiceAPI = OSSTranslatorServiceAPI
				.getInstance(ChessSystemModel.getInstance());
		System.out.println("umlSelectedComponent: " + umlSelectedComponent);
		boolean temp_variable_is_discrete = true;
		logger.debug("exportRootComponentAsOssModel");
		Object ocraModel = ossTranslatorServiceAPI.exportRootComponentToOssModel(umlSelectedComponent,
				temp_variable_is_discrete, new NullProgressMonitor());
		logger.debug("generateOssFileFromOssModel");
		String fileName = ossTranslatorServiceAPI.getFileName(umlSelectedComponent);
		File ossFile = ossTranslatorServiceAPI.exportOSSModelToOSSFile(ocraModel, fileName, testOutput);
		return ossFile;
	}

	private Class getSystemComponent() throws Exception {
		Model model = getModel();
		Package umlSelectedPackage = entityUtil.getSystemViewPackage(model);

		System.out.println("umlSelectedPackage: " + umlSelectedPackage);

		Class umlSelectedComponent = entityUtil.getSystemElement(model);
		return umlSelectedComponent;
	}

	@Test
	@PluginResource(projectPath)
	public void testExportStateMachinesAsSmv() throws Exception {
		Model model = getModel();
		
		SMVTranslatorServiceAPI smvTranslatorService = SMVTranslatorServiceAPI
				.getInstance(ChessSystemModel.getInstance(), UMLStateMachineModel.getInstance());

		String selectedDirectory = testOutput;//"testOutput";

		Set<?> stateMachines = entityUtil.getNominalStateMachines(model);
		logger.debug("stateMachines.size: " + stateMachines.size());
		for (Object stateMachine : stateMachines) {
			smvTranslatorService.exportStateMachineToSmvFile(stateMachine, selectedDirectory, null,
					new NullProgressMonitor());
		}

		String oracleFolder = projectFolderPath + "/SmvFiles";
		TestResultsUtil.dirsAreEqual(oracleFolder, selectedDirectory, collector);
	}

	@Before
	public void setTestParameters() throws Exception {
		testOutput = TestResultsUtil.cleanDirectory("testOutputBasicOperationsHeadless");
		eu.fbk.tools.adapter.ui.Activator.getDefault().getPreferenceStore().setValue(
				PreferenceConstants.OSLC_ENABLED, false);
	}

	Model getModel() {
		return (Model) resourceSetFixture.getModel();
	}
	
}
