/*******************************************************************************
 * Copyright (c) 2016 CEA LIST.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Erwan Mahe (CEA LIST) erwan.mahe@cea.fr - Initial API and implementation
 *******************************************************************************/
package org.eclipse.efm.modeling.ui.newproject;

import java.io.IOException;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
import org.eclipse.papyrus.infra.core.resource.ModelsReader;
import org.eclipse.papyrus.infra.core.services.ExtensionServicesRegistry;
import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
import org.eclipse.papyrus.uml.diagram.common.commands.CreateUMLModelCommand;
import org.eclipse.papyrus.uml.tools.model.UmlModel;
import org.eclipse.papyrus.uml.tools.model.UmlUtils;
import org.eclipse.papyrus.uml.tools.utils.PackageUtil;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.dialogs.WizardNewProjectCreationPage;
import org.eclipse.ui.wizards.newresource.BasicNewProjectResourceWizard;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.Profile;



public class WizardNewFormalModelProject extends BasicNewProjectResourceWizard implements INewWizard {

	private String WIZARD_NAME = "From Scratch EFM Project Wizard";
	private String WIZARD_DESC = "This wizard creates a new Eclipse Formal Modeling Project.";
	
    private WizardNewProjectCreationPage project_page;
    private WizardNewFormalModelCreationPage model_page;

	public WizardNewFormalModelProject() {
		setWindowTitle("Eclipse Formal Modeling New Project");
	}


	public void addPages() {
		project_page = new WizardNewProjectCreationPage(WIZARD_NAME);
		project_page.setTitle(WIZARD_NAME);
		project_page.setDescription(WIZARD_DESC + "\nPlease enter a project name.");
        addPage(project_page);
        
        model_page = new WizardNewFormalModelCreationPage();
        addPage(model_page);
	}
	
	public boolean performFinish() {
		//final ModelSet modelSet = new ModelSet();
		
		final ModelSet modelSet = new ModelSet();//DiResourceSet();
		
		create_project_and_papyrus_model(modelSet);
		
		TransactionalEditingDomain editingDomain = modelSet.getTransactionalEditingDomain();
		
		final UmlModel umlModel = UmlUtils.getUmlModel(modelSet);
		
		RecordingCommand command = new RecordingCommand(editingDomain) {
			public void doExecute() {
				
				try {
					EObject rootNode = umlModel.lookupRoot();

					org.eclipse.uml2.uml.Package rootPackage = PackageUtil.getRootPackage((Element) rootNode);
					rootPackage.setName(model_page.getRootNodeName());
					modelSet.save(new NullProgressMonitor());
					
					URI profileURI = URI.createURI("platform:/plugin/org.eclipse.efm.formalml/resources/profile/FormalML.profile.uml");
					Profile EFM_profile = (Profile) PackageUtil.loadPackage(profileURI, rootPackage.eResource().getResourceSet());
					
					rootPackage.applyProfile(EFM_profile);
					modelSet.save(new NullProgressMonitor());
				} catch (Exception e) {
					e.printStackTrace();
					System.err.print("================================="+ "\n");
					System.err.print(e.toString());
					System.err.print("================================="+ "\n");
				}

			}
		};
		editingDomain.getCommandStack().execute(command);

		return true;
	}

	private void create_project_and_papyrus_model(ModelSet modelSet) {
		IProjectDescription desc = ResourcesPlugin.getWorkspace().newProjectDescription(project_page.getProjectName());

		IProject project = project_page.getProjectHandle();
		try {
			project.create(desc, new NullProgressMonitor());
			project.open(new NullProgressMonitor());
		} catch (CoreException e) {
			e.printStackTrace();
			System.err.print("=================================\n");
			System.err.print(e.toString());
			System.err.print("=================================\n");
		}
		
		String modelFilePath = project.getFullPath().toString() + "/" + model_page.getModelFileName();
		URI modelPResURI =  URI.createPlatformResourceURI(modelFilePath, true);
		
		try {
			createPapyrusModel(modelPResURI, modelSet);
		} catch (ServiceException | IOException e) {
			e.printStackTrace();
			System.err.print("=================================\n");
			System.err.print(e.toString());
			System.err.print("=================================\n");
		}
	}
	
	private void createPapyrusModel(URI modelPResURI, ModelSet modelSet) throws ServiceException, IOException {
		ModelsReader reader = new ModelsReader(); //Standard ModelsReader for Di + UML + Notation
		reader.readModel(modelSet);

		modelSet.createModels(modelPResURI); //Use an EMF URI instead of an Eclipse IFile
		ServicesRegistry registry = new ExtensionServicesRegistry(org.eclipse.papyrus.infra.core.Activator.PLUGIN_ID);
		registry.startServicesByClassKeys(ModelSet.class);

		CreateUMLModelCommand creationCommand = new CreateUMLModelCommand();
		creationCommand.createModel(modelSet);
		modelSet.save(new NullProgressMonitor());
	}

}