/*=============================================================================#
 # Copyright (c) 2012, 2021 Stephan Wahlbrink and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 # which is available at https://www.apache.org/licenses/LICENSE-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 # 
 # Contributors:
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
 #=============================================================================*/

package org.eclipse.statet.rtm.base.ui.actions;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
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.XMLResource;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ISetSelectionTarget;
import org.eclipse.ui.statushandlers.StatusManager;

import org.eclipse.statet.internal.rtm.base.ui.actions.Messages;
import org.eclipse.statet.rtm.base.ui.IRtDescriptor;
import org.eclipse.statet.rtm.base.ui.RtModelUIPlugin;


/**
 * This is a simple wizard for creating a new model file.
 * <!-- begin-user-doc -->
 * <!-- end-user-doc -->
 */
public abstract class AbstractNewRTaskFileWizard extends Wizard implements INewWizard {
	
	
	protected final IRtDescriptor rtDescriptor;
	
	/**
	 * This is the file creation page.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected ModelWizardNewFileCreationPage newFileCreationPage;
	
	/**
	 * Remember the selection during initialization for populating the default container.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected IStructuredSelection selection;
	
	/**
	 * Remember the workbench during initialization.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected IWorkbench workbench;
	
	
	protected AbstractNewRTaskFileWizard(final IRtDescriptor descriptor) {
		this.rtDescriptor= descriptor;
	}
	
	/**
	 * This just records the information.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void init(final IWorkbench workbench, final IStructuredSelection selection) {
		this.workbench= workbench;
		this.selection= selection;
		setWindowTitle(NLS.bind(Messages.NewRTaskWizard_title, this.rtDescriptor.getName()));
//		setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(RtGGPlotEditorPlugin.INSTANCE.getImage("full/wizban/NewGGPlot"))); //$NON-NLS-1$
	}
	
	/**
	 * Create a new model.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 */
	protected EObject createInitialModel() {
		return this.rtDescriptor.createInitialModelObject();
	}
	
	/**
	 * Do the work after everything is specified.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean performFinish() {
		try {
			// Remember the file
			final IFile modelFile= getModelFile();
			
			// Do the work within an operation
			final WorkspaceModifyOperation operation= new WorkspaceModifyOperation() {
				@Override
				protected void execute(final IProgressMonitor progressMonitor) throws InvocationTargetException {
					try {
						// Create a resource set
						final ResourceSet resourceSet= new ResourceSetImpl();
						
						// Get the URI of the model file
						final URI fileURI= URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true);
						
						// Create a resource for this file
						final Resource resource= resourceSet.createResource(fileURI, AbstractNewRTaskFileWizard.this.rtDescriptor.getDefaultContentTypeID());
						
						// Add the initial model object to the contents
						final EObject rootObject= createInitialModel();
						if (rootObject != null) {
							resource.getContents().add(rootObject);
						}
						
						// Save the contents of the resource to the file system
						final Map<Object, Object> options= new HashMap<>();
						options.put(XMLResource.OPTION_ENCODING, "UTF-8"); //$NON-NLS-1$
						resource.save(options);
					}
					catch (final IOException e) {
						throw new InvocationTargetException(e);
					}
					finally {
						progressMonitor.done();
					}
				}
			};
			
			getContainer().run(false, false, operation);
			
			final PerspectiveUtil perspectiveUtil= new PerspectiveUtil();
			perspectiveUtil.updatePerspective(this.rtDescriptor.getAssociatedPerspectiveId());
			
			// Select the new file resource in the current view
			final IWorkbenchWindow workbenchWindow= this.workbench.getActiveWorkbenchWindow();
			final IWorkbenchPage page= workbenchWindow.getActivePage();
			final IWorkbenchPart activePart= page.getActivePart();
			if (activePart instanceof ISetSelectionTarget) {
				final ISelection targetSelection= new StructuredSelection(modelFile);
				getShell().getDisplay().asyncExec(new Runnable() {
					@Override
					public void run() {
						((ISetSelectionTarget)activePart).selectReveal(targetSelection);
					}
				});
			}
			
			// Open an editor on the new file
			try {
				page.openEditor(new FileEditorInput(modelFile),
						this.workbench.getEditorRegistry().getDefaultEditor(
								modelFile.getFullPath().toString(),
								Platform.getContentTypeManager().getContentType(this.rtDescriptor.getDefaultContentTypeID())).getId());
			}
			catch (final PartInitException e) {
				StatusManager.getManager().handle(new Status(IStatus.ERROR, RtModelUIPlugin.BUNDLE_ID, 0,
						NLS.bind(Messages.NewRTaskWizard_error_OpenEditor_message, this.rtDescriptor.getName()),
						e ), StatusManager.LOG | StatusManager.SHOW );
				return false;
			}
			
			return true;
		}
		catch (final Exception e) {
			StatusManager.getManager().handle(new Status(IStatus.ERROR, RtModelUIPlugin.BUNDLE_ID, 0,
					NLS.bind(Messages.NewRTaskWizard_error_CreateFile_message, this.rtDescriptor.getName()),
					e ), StatusManager.LOG | StatusManager.SHOW );
			return false;
		}
	}
	
	/**
	 * This is the one page of the wizard.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public class ModelWizardNewFileCreationPage extends WizardNewFileCreationPage {
		/**
		 * Pass in the selection.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		public ModelWizardNewFileCreationPage(final String pageId, final IStructuredSelection selection) {
			super(pageId, selection);
			setFileExtension(AbstractNewRTaskFileWizard.this.rtDescriptor.getDefaultFileExtension());
		}
		
		/**
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		public IFile getModelFile() {
			return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName()));
		}
	}
	
	/**
	 * The framework calls this to create the contents of the wizard.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void addPages() {
		// Create a page, set the title, and the initial model file name
		
		this.newFileCreationPage= new ModelWizardNewFileCreationPage("NewRTask.NewFile", this.selection); //$NON-NLS-1$
		this.newFileCreationPage.setTitle(NLS.bind(Messages.NewRTaskWizard_NewFile_title, this.rtDescriptor.getName()));
		this.newFileCreationPage.setDescription(NLS.bind(Messages.NewRTaskWizard_NewFile_description, this.rtDescriptor.getName()));
		addPage(this.newFileCreationPage);
		
		// Try and get the resource selection to determine a current directory for the file dialog
		if (this.selection != null && !this.selection.isEmpty()) {
			// Get the resource...
			final Object selectedElement= this.selection.iterator().next();
			if (selectedElement instanceof IResource) {
				// Get the resource parent, if its a file
				IResource selectedResource= (IResource)selectedElement;
				if (selectedResource.getType() == IResource.FILE) {
					selectedResource= selectedResource.getParent();
				}
				
				// This gives us a directory...
				if (selectedResource instanceof IFolder || selectedResource instanceof IProject) {
					// Set this for the container
					this.newFileCreationPage.setContainerFullPath(selectedResource.getFullPath());
					
//					// Make up a unique new name here
//					String defaultModelBaseFilename= RtGGPlotEditorPlugin.INSTANCE.getString("_UI_GGPlotEditorFilenameDefaultBase"); //$NON-NLS-1$
//					String defaultModelFilenameExtension= this.rtDescriptor.getDefaultContentTypeFileExtension();
//					String modelFilename= defaultModelBaseFilename + "." + defaultModelFilenameExtension; //$NON-NLS-1$
//					for (int i= 1; ((IContainer)selectedResource).findMember(modelFilename) != null; ++i) {
//						modelFilename= defaultModelBaseFilename + i + "." + defaultModelFilenameExtension; //$NON-NLS-1$
//					}
//					this.newFileCreationPage.setFileName(modelFilename);
				}
			}
		}
	}
	
	/**
	 * Get the file from the page.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 */
	public IFile getModelFile() {
		return this.newFileCreationPage.getModelFile();
	}
	
}
