/*******************************************************************************
 * 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.ui.wizard.page;

import java.io.File;
import java.util.ArrayList;

import org.apache.commons.io.FilenameUtils;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.papyrus.uml.tools.providers.UMLContentProvider;
import org.eclipse.papyrus.uml.tools.providers.UMLLabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.UMLPackage;
import org.polarsys.chess.contracts.profile.chesscontract.util.EntityUtil;
import org.polarsys.chess.paramArchConfigurator.ui.wizard.TreeSelector;
import org.polarsys.chess.service.core.model.ChessSystemModel;

import eu.fbk.eclipse.standardtools.ExecOcraCommands.ui.services.OCRAExecService;

import org.eclipse.uml2.uml.Package;

public class LastPage extends BasicWizardPage {

	private OCRAExecService ocraExecService = OCRAExecService.getInstance(ChessSystemModel.getInstance());

	private File newOssFile;
	private File paramListFile;

	private Composite container;
	private EObject selectedElement;
	private TreeSelector treeSelector;
	private Button checkCreatePackage;
	private Button checkImport;

	private static final Logger logger = Logger.getLogger(LastPage.class);

	public LastPage(EObject selectedElement, File newOssFile, EList<EList<String>> prevParametersList)
			throws Exception {
		super("Arctitecture Instantiated", prevParametersList);
		setTitle("Parameterized Architecture Instantiated");
		setDescription("Instantiation Completed.");
		this.selectedElement = selectedElement;
		this.newOssFile = newOssFile;
		if ((prevParametersList != null) && (newOssFile != null)) {
			this.paramListFile = ocraExecService.prepareFinalParameterValuesFile(prevParametersList,
					"final_" + newOssFile.getName());
		}
	}

	@Override
	public void createControl(Composite parent) {

		container = new Composite(parent, SWT.BORDER);
		GridLayout containerLayout = new GridLayout(2, true);
		container.setLayout(containerLayout);

		createViewPrevParametersArea(container);
		createSelectPackageArea(container);

		container.redraw();
		// required to avoid an error in the system
		setControl(container);
		setPageComplete(false);

	}

	protected void createSelectPackageArea(Composite parent) {

		ScrolledComposite sc = new ScrolledComposite(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
		sc.setLayoutData(gd);

		Composite scrolledContent = new Composite(sc, SWT.BORDER);
		scrolledContent.setLayout(new GridLayout(1, false));
		scrolledContent.setLayoutData(gd);

		Composite importArchComposite = new Composite(scrolledContent, SWT.NONE);
		importArchComposite.setLayout(new GridLayout(2, false));
		Label labelImport = new Label(importArchComposite, SWT.NONE);
		labelImport.setText("Import the instantiated architecture.");
		checkImport = new Button(importArchComposite, SWT.CHECK);
		checkImport.setSelection(true);
		checkImport.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				setPageComplete(!checkImport.getSelection());
			}
		});
		Label labelCheck = new Label(scrolledContent, SWT.NONE);
		labelCheck.setText("Select the destination package of the instantiated architecture.");
		Composite createPackageComposite = new Composite(scrolledContent, SWT.NONE);
		createPackageComposite.setLayout(new GridLayout(2, false));
		checkCreatePackage = new Button(createPackageComposite, SWT.CHECK);
		checkCreatePackage.setSelection(true);
		Label newPackageLabel = new Label(createPackageComposite, SWT.NONE);
		newPackageLabel.setText("Create a nested package in the destination package.");

		createTreeSelector(scrolledContent);

		sc.setExpandHorizontal(true);
		sc.setExpandVertical(true);
		sc.setContent(scrolledContent);
		sc.setMinSize(scrolledContent.computeSize(SWT.DEFAULT, SWT.DEFAULT));
	}

	public Package getSelectedPackage() {
		if ((treeSelector != null) && (treeSelector.getResult() != null)) {
			return (Package) treeSelector.getResult()[0];
		}
		return null;
	}

	public boolean createNestedPackage() {
		return checkCreatePackage.getSelection();
	}

	public boolean importArchitecture() {
		return checkImport.getSelection();
	}

	public String getNestedPackageName() {
		return FilenameUtils.removeExtension(newOssFile.getName());
	}

	public File getOSSFile() {
		return newOssFile;
	}

	public File getParamListFile() {
		return paramListFile;
	}

	private void createTreeSelector(Composite scrolledContent) {
		treeSelector = new TreeSelector(scrolledContent, this);
		Package pkg = EntityUtil.getInstance().getToPackage((Element) selectedElement);
		UMLContentProvider provider = new UMLContentProvider(pkg, UMLPackage.eINSTANCE.getPackage_PackagedElement());
		treeSelector.setContentProvider(provider);
		treeSelector.setLabelProvider(new UMLLabelProvider());
		treeSelector.create();

	}

}
