/*******************************************************************************
 * Copyright (C) 2018 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
 *  
 * Contributors:
 *   Alberto Debiasi - initial API and implementation
 ******************************************************************************/
package org.polarsys.chess.paramArchConfigurator.commands;

import java.util.ArrayList;

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.uml2.uml.Class;
import org.polarsys.chess.paramArchConfigurator.ui.dialog.ConfigParameter;
import org.polarsys.chess.paramArchConfigurator.ui.dialog.ConfigureArchitectureDialog;
import org.polarsys.chess.service.core.model.ChessSystemModel;
import org.polarsys.chess.service.gui.utils.SelectionUtil;

import eu.fbk.eclipse.standardtools.ExecOcraCommands.ui.services.OCRAExecService;
import eu.fbk.eclipse.standardtools.utils.ui.commands.AbstractJobCommand;
import eu.fbk.eclipse.standardtools.utils.ui.dialogs.MessageTimeModelDialog;
import eu.fbk.eclipse.standardtools.utils.ui.utils.OCRADirectoryUtil;
import eu.fbk.tools.editor.contract.expression.validation.ProposalProvider.VariableType;


//command not used.
public class InstantiateParamArchAsOssFileCommand extends AbstractJobCommand {

	private OCRAExecService ocraExecService = OCRAExecService.getInstance(ChessSystemModel.getInstance());
	private SelectionUtil selectionUtil = SelectionUtil.getInstance();
	private OCRADirectoryUtil ocraDirectoryUtil = OCRADirectoryUtil.getInstance();
	
	public InstantiateParamArchAsOssFileCommand() {
		super("Instantiate Parameterized Architecture");
	}

	private Class umlSelectedComponent;
	private Resource umlSelectedResource;
	private boolean isDiscreteTime;
	private boolean showPopups;
	private boolean usexTextValidation;
	private String ossFilepath;
	private String resultFilePath;

	@Override
	public void execPreJobOperations(ExecutionEvent event, IProgressMonitor monitor) throws Exception {
		umlSelectedComponent = selectionUtil.getUmlComponentFromSelectedObject(event);
		umlSelectedResource = umlSelectedComponent.eResource();
		
		final Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
		final ConfigureArchitectureDialog parameterDialog = new ConfigureArchitectureDialog(shell,generateParams());
		parameterDialog.open();
		
		
		
		isDiscreteTime = MessageTimeModelDialog.openQuestion(false);
		showPopups = false;
		usexTextValidation=true;
		ossFilepath = ocraDirectoryUtil.getOSSDirPath();
		resultFilePath = ocraDirectoryUtil.getCommandInstantiateParamArchResultPath(umlSelectedComponent.getName(),1);
	}

	@Override
	public void execJobCommand(ExecutionEvent event, IProgressMonitor monitor) throws Exception {
	//	ocraExecService.executeInstantiateParamArch(umlSelectedComponent, umlSelectedResource, isDiscreteTime,
		//		usexTextValidation,showPopups, ossFilepath, resultFilePath, monitor);
	}

	
private ArrayList<ConfigParameter> generateParams(){
	
	ArrayList<ConfigParameter> params = new ArrayList<ConfigParameter>();
	
	params.add(new ConfigParameter("system.param1", VariableType.BOOLEAN));
	params.add(new ConfigParameter("system.param2", VariableType.CONTINUOUS));
	String[] enum1Values = { "a", "b","c" };
	params.add(new ConfigParameter("system.param3", VariableType.ENUM,enum1Values));
	params.add(new ConfigParameter("system.param4", VariableType.INTEGER));
	params.add(new ConfigParameter("system.sub1.param5", VariableType.REAL));
	params.add(new ConfigParameter("system.sub1.param6", VariableType.REAL));
	params.add(new ConfigParameter("system.sub1.param7", VariableType.BOOLEAN));
	String[] enum2Values = { "er", "vf","vf" };
	params.add(new ConfigParameter("system.sub2.param8", VariableType.ENUM,enum2Values));
	params.add(new ConfigParameter("system.sub2.param9", VariableType.BOOLEAN));
	params.add(new ConfigParameter("system.sub2.param10", VariableType.BOOLEAN));
	params.add(new ConfigParameter("system.sub2.param11", VariableType.BOOLEAN));
	
return 	params;
}

@Override
public void execPostJobOperations(ExecutionEvent event, NullProgressMonitor nullProgressMonitor) throws Exception {
	// TODO Auto-generated method stub
	
}
}
