/*******************************************************************************
 * Copyright (c) 2018, MDH 
 *
 * 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
 * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
 *
 * SPDX-License-Identifier: EPL-2.0
 *  
 *   Contributors:
 *   Faiz Ul Muram, Samina Kanwal and Muhammad Atif Javed
 *   Initial API and implementation and/or initial documentation
 *******************************************************************************/
/**
 */
package org.eclipse.opencert.epf2OpenCert.transformation.popup.action;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.opencert.epf2OpenCert.transformation.popup.action.ProcEvidGUI;
import org.eclipse.opencert.epf2OpenCert.transformation.popup.action.ProcEvidTransformation;
import org.eclipse.swt.widgets.Shell;
//import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
//import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;

//import org.eclipse.opencert.sam.arg.arg.diagram.edit.parts.CaseEditPart;
//import org.eclipse.opencert.sam.arg.arg.diagram.edit.policies.CasePersistedCanonicalEditPolicy;
//import org.eclipse.opencert.sam.arg.arg.diagram.part.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Collections;
//import java.util.LinkedList;

//import org.eclipse.core.commands.ExecutionException;
//import org.eclipse.core.commands.operations.OperationHistoryFactory;
//import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
//import org.eclipse.core.runtime.IAdaptable;
//import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
//import org.eclipse.core.runtime.NullProgressMonitor;
//import org.eclipse.core.runtime.Path;
import org.eclipse.emf.cdo.common.model.EMFUtil;
import org.eclipse.emf.cdo.dawn.preferences.PreferenceConstants;
import org.eclipse.emf.cdo.dawn.util.connection.CDOConnectionUtil;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CommitException;
import org.eclipse.emf.cdo.util.ConcurrentAccessException;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.common.util.URI;
//import org.eclipse.emf.common.util.WrappedException;
//import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.epf.uma.impl.ProcessComponentImpl;



public class ProcEvidTransformationHandler implements IObjectActionDelegate {

	private Shell shell;
	private IWorkbenchPage page;
	private IWorkbenchWindow window;
	private IProgressMonitor monitor2;
	private String name;
	
	
	/**
	 * Constructor for Action1.
	 */
	public ProcEvidTransformationHandler() {
		super();
	}

	/**
	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
	 */
	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
		shell = targetPart.getSite().getShell();
		page = targetPart.getSite().getPage();
		window = targetPart.getSite().getWorkbenchWindow();	
	}


	/**
	 * @see IActionDelegate#run(IAction)
	 */
	public void run(IAction action) {
		
		
		MessageDialog dg = new MessageDialog(
	            shell,
	            "Select directory",
	            null,
	            "Please select the target assurance project from the CDO Repository",
	            MessageDialog.INFORMATION,
	            new String[]{
	                "Browse...", 
	                IDialogConstants.CANCEL_LABEL},
	            -1//SWT.CLOSE
	            );
	    
if(dg.open()==0){
			
			//Connect to the CDO Repository
			CDOConnectionUtil.instance.init(
					PreferenceConstants.getRepositoryName(),
					PreferenceConstants.getProtocol(),
					PreferenceConstants.getServerName());
			CDOSession session = CDOConnectionUtil.instance.getCurrentSession();
			CDOView view = session.openView();
			CDOTransaction transaction = session.openTransaction();
			
			ProcEvidGUI gui = new ProcEvidGUI(shell,view);
			gui.create();
			gui.open();
			
			String selection = gui.resourceName();
	
			if(selection != null){
				
				//Get the current delivery process
				ISelection sel = page.getSelection();
				TreeSelection tree = (TreeSelection) sel;
				ProcessComponentImpl process = (ProcessComponentImpl) tree.getFirstElement();
						
				name = process.getName();
			
				//Invoke transformation
				ProcEvidTransformation transformation = new ProcEvidTransformation(page);
			
				ProgressMonitorDialog dialog = new ProgressMonitorDialog(shell);
				dialog.open();
				IProgressMonitor monitor = dialog.getProgressMonitor();
				monitor.beginTask("Generating the Process and Evidence models ... ", 15);
				monitor.worked(1);
				monitor.subTask("Performing the transformation...");
	
				transformation.execute(monitor);  
				
				monitor.worked(5);
				monitor.subTask("Creating CDO Resources...");

				
				//Create the model CDO Resource
				CDOResource procModel;
				if (transaction.getOrCreateResource("/"+selection+"/PROCESSES/"+name+".process").isExisting()) {
					try {
						transaction.getResource("/"+selection+"/PROCESSES/"+name+".process").delete(Collections.EMPTY_MAP);
						transaction.commit();
					} catch (IOException | CommitException e) {
						e.printStackTrace();
					}
	
					procModel = transaction.getOrCreateResource("/"+selection+"/PROCESSES/"+name+".process");
				}else{
					procModel = transaction.getOrCreateResource("/"+selection+"/PROCESSES/"+name+".process");
				}
				
				String procModelFile = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()+"/Process/"+name+".process";
				URI procXmiUri = URI.createFileURI(procModelFile);
				URI procCDOUri = procModel.getURI();
			
				ResourceSet resourceSet = new ResourceSetImpl();
				resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
			
				Resource procXmiResource1 = resourceSet.createResource(procXmiUri);
				File newFile = new File(procModelFile);
				
				monitor.worked(6);
				monitor.subTask("Loading model to CDO Repository...");
	
				//Load the model contents into the created resource
				try {
					FileInputStream procFileInStream = new FileInputStream(newFile);
					procXmiResource1.load(procFileInStream,Collections.EMPTY_MAP);
					procXmiResource1.setURI(procXmiUri);	
				} catch (IOException e) {
					e.printStackTrace();
				}
			
				EMFUtil.safeResolveAll(resourceSet);
			
				CDOResource procCDOResource = transaction.getOrCreateResource(procCDOUri.path());
				procCDOResource.getContents().addAll(procXmiResource1.getContents());
	
				EMFUtil.safeResolveAll(resourceSet);
				
				monitor.worked(7);
			
				try {
					procCDOResource.save(Collections.EMPTY_MAP);
				} catch (IOException e) {
					e.printStackTrace();
				}
				
				
				monitor.worked(8);
				monitor.subTask("Creating Evidence Model...");
			
				
				monitor.worked(9);
				monitor.subTask("Creating CDO Resources...");
				
			
				
				//Create the model CDO Resource
				CDOResource eviModel;
				if (transaction.getOrCreateResource("/"+selection+"/EVIDENCE/"+name+".evidence").isExisting()) {
					try {
						transaction.getResource("/"+selection+"/EVIDENCE/"+name+".evidence").delete(Collections.EMPTY_MAP);
						transaction.commit();
					} catch (IOException | CommitException e) {
						e.printStackTrace();
					}
	
					eviModel = transaction.getOrCreateResource("/"+selection+"/EVIDENCE/"+name+".evidence");
				}else{
					eviModel = transaction.getOrCreateResource("/"+selection+"/EVIDENCE/"+name+".evidence");
				}
				
				String eviModelFile = ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()+"/Evidence/"+name+".evidence";
				URI eviXmiUri = URI.createFileURI(eviModelFile);
				URI eviCDOUri = eviModel.getURI();
			
				ResourceSet resourceSet1 = new ResourceSetImpl();
				resourceSet1.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
			
				Resource eviXmiResource1 = resourceSet1.createResource(eviXmiUri);

				try {
					FileInputStream eviFileInStream = new FileInputStream(newFile);
					eviXmiResource1.load(eviFileInStream,Collections.EMPTY_MAP);
					eviXmiResource1.setURI(eviXmiUri);	
				} catch (IOException e) {
					e.printStackTrace();
				}
			
				EMFUtil.safeResolveAll(resourceSet1);
			
				CDOResource eviCDOResource = transaction.getOrCreateResource(eviCDOUri.path());
				eviCDOResource.getContents().addAll(eviXmiResource1.getContents());
	
				EMFUtil.safeResolveAll(resourceSet1);
				
				//monitor2.worked(4);
			
				try {
					eviCDOResource.save(Collections.EMPTY_MAP);
				} catch (IOException e) {
					e.printStackTrace();
				}
				
				
				
				monitor.worked(13);
				
				//Commit the transaction
				try {
					transaction.commit();
				} catch (ConcurrentAccessException e) {
					e.printStackTrace();
				} catch (CommitException e) {
					e.printStackTrace();
				}
				
				
				monitor.worked(14);
				monitor.done();
				dialog.close();
				
				//if(transfDiagramOk == true){
					try{
						MessageDialog.openInformation(shell, "Transformation completed", 
									"The CACM Process and Evidence Models are generated under:\n\n"
									+"    - PROCESSES AND EVIDENCE folders of the project "+selection+" in the CDO Repository\n"
									+"    -  project in the current workspace");
					}catch(Exception e){
						System.out.println("Hola");
					}
				}
					
				
				ProgressMonitorDialog dialog2 = new ProgressMonitorDialog(shell);
				dialog2.open();
				monitor2 = dialog2.getProgressMonitor();
				monitor2.beginTask("Opening Evidence Model... ", 6);
				monitor2.worked(1);
				
				//Change the perspective
				if (PlatformUI.getWorkbench() != null) {
					IPerspectiveDescriptor descriptor = window.getWorkbench()
					    .getPerspectiveRegistry().findPerspectiveWithId("org.eclipse.ui.resourcePerspective");
		
		    		PlatformUI.getWorkbench().getActiveWorkbenchWindow()
					    .getActivePage().setPerspective(descriptor);
		        }
				
				monitor2.worked(2); 
				
			
				
				monitor2.worked(5);
				monitor2.done();
				dialog2.close();
			
			}else{
				MessageDialog.openError(shell, "Selection error", "An assurance project must be selected in order to perform the transformation"); 
			}



	
		}
	
	

	/**
	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
	 */
	public void selectionChanged(IAction action, ISelection selection) {

	}


}
	
