/*******************************************************************************
 * Copyright (c) 2006, 2012 Oracle Corporation and others.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Oracle Corporation
 *******************************************************************************/

package org.eclipse.bpel.ui.wizards;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.eclipse.bpel.common.ui.details.viewers.ComboViewer;
import org.eclipse.bpel.model.util.BPELConstants;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.plugin.AbstractUIPlugin;

/**
 * The first page of the wizard to create a new BPEL process.
 * <p>
 * This page deals with the creation mode and the general properties of the BPEL to create.
 * </p>
 *
 * @author Michal Chmielewski - Oracle
 * @author Vincent Zurczak - EBM WebSourcing
 */
public class NewBpelFileFirstPage extends WizardPage {

	/**
	 * The page's name, so that it can be referenced from other pages.
	 */
	public static final String PAGE_NAME = "bpel-first-page";

	/**
	 * The creation mode.
	 */
	private BpelCreationMode creationMode;

	/**
	 * The process name and name space.
	 */
	private String processName, processNamespace;

	/**
	 * True to create an abstract process, false otherwise.
	 */
	private boolean abstractProcess;

	/**
	 * The properties to pass to the template.
	 */
	private final Map<String,Object> processTemplateProperties;

	/**
	 * Images used in the wizard.
	 */
	private Image wsdlImg, arrowImg, bpelImg, tplImg;


	/**
	 * Constructor.
	 */
	public NewBpelFileFirstPage() {
		super( PAGE_NAME );

		setTitle( Messages.NewFileWizardPage1_2 );
		setDescription( Messages.NewFileWizardPage1_3 );
		setImageDescriptor( BPELUIPlugin.INSTANCE.getImageDescriptor( IBPELUIConstants.ICON_WIZARD_BANNER ));

		this.processTemplateProperties = new HashMap<String,Object> ();
		try {
			ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin( BPELUIPlugin.PLUGIN_ID, "icons/misc/wsdl.png" );
			this.wsdlImg = desc.createImage();

		} catch( Exception e ) {
			BPELUIPlugin.log( e, IStatus.WARNING );
		}

		try {
			ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin( BPELUIPlugin.PLUGIN_ID, "icons/misc/bpel-skeleton-2.png" );
			this.bpelImg = desc.createImage();

		} catch( Exception e ) {
			BPELUIPlugin.log( e, IStatus.WARNING );
		}

		try {
			ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin( BPELUIPlugin.PLUGIN_ID, "icons/misc/arrow.png" );
			this.arrowImg = desc.createImage();

		} catch( Exception e ) {
			BPELUIPlugin.log( e, IStatus.WARNING );
		}

		try {
			ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin( BPELUIPlugin.PLUGIN_ID, "icons/misc/templates.png" );
			this.tplImg = desc.createImage();

		} catch( Exception e ) {
			BPELUIPlugin.log( e, IStatus.WARNING );
		}
	}


	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.DialogPage
	 * #dispose()
	 */
	@Override
	public void dispose() {

		if( this.wsdlImg != null && ! this.wsdlImg.isDisposed())
			this.wsdlImg.dispose();

		if( this.arrowImg != null && ! this.arrowImg.isDisposed())
			this.arrowImg.dispose();

		if( this.bpelImg != null && ! this.bpelImg.isDisposed())
			this.bpelImg.dispose();

		if( this.tplImg != null && ! this.tplImg.isDisposed())
			this.tplImg.dispose();

		super.dispose();
	}


	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.wizard.WizardPage
	 * #getNextPage()
	 */
	@Override
	public IWizardPage getNextPage() {

		IWizardPage nextPage;
		if( this.creationMode == BpelCreationMode.CREATE_NEW_BPEL )
			nextPage = getWizard().getPage( NewBpelFileTemplatePage.PAGE_NAME );
		else
			nextPage = getWizard().getPage( NewBpelFilePortTypePage.PAGE_NAME );

		nextPage.setPreviousPage( this );
		return nextPage;
	}


	/**
	 * @return the abstractProcess
	 */
	public boolean isAbstractProcess() {
		return this.abstractProcess;
	}


	/**
	 * @return the properties for the templates
	 */
	public Map<String,Object> getProcessTemplateProperties() {
		return this.processTemplateProperties;
	}


	/**
	 * @return the creationMode
	 */
	public BpelCreationMode getCreationMode() {
		return this.creationMode;
	}


	/*
	 * (non-Javadoc)
	 * @see org.eclipse.jface.dialogs.IDialogPage
	 * #createControl(org.eclipse.swt.widgets.Composite)
	 */
	@Override
	public void createControl( Composite parent ) {

		// Create the container
		final Composite container = new Composite( parent, SWT.NONE );
		container.setFont( parent.getFont());
		initializeDialogUnits( parent );
		container.setLayout( new GridLayout( 2, false ));
		container.setLayoutData( new GridData( GridData.FILL_BOTH ));
		setControl( container );


		// Add a combo to select the creation mode
		Label label = new Label( container, SWT.NONE );
		label.setText( "Creation Mode:" );
		label.setToolTipText( "Select the way to create a new BPEL process" );

		final ComboViewer creationViewer = new ComboViewer( container, SWT.BORDER | SWT.DROP_DOWN | SWT.READ_ONLY );
		creationViewer.setContentProvider( new ArrayContentProvider());
		creationViewer.setLabelProvider( new LabelProvider());
		creationViewer.setInput( BpelCreationMode.values());


		// Add the other common widgets
		Label l = new Label( container, SWT.NONE );
		l.setText( Messages.NewFileWizardPage1_5 );
		l.setToolTipText( "The name of the BPEL process" );

		Text processNameText = new Text( container, SWT.BORDER | SWT.SINGLE );
		processNameText.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
		if( this.processName != null )
			processNameText.setText( this.processName );

		processNameText.addModifyListener( new ModifyListener() {
			@Override
			public void modifyText( ModifyEvent e ) {
				NewBpelFileFirstPage.this.processName = ((Text) e.widget).getText();
				updateStatus();
			}
		});


		l = new Label( container, SWT.NONE );
		l.setText( Messages.NewFileWizardPage1_6 );
		l.setToolTipText( "The target namespace of the BPEL process" );

		Combo processNamespaceCombo = new Combo( container, SWT.DROP_DOWN | SWT.SIMPLE );
		processNamespaceCombo.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ));
		processNamespaceCombo.setItems( BPELUIPlugin.INSTANCE.getTemplates().getNamespaceNames());
		if( this.processNamespace != null )
			processNamespaceCombo.setText( this.processNamespace );

		processNamespaceCombo.addModifyListener( new ModifyListener() {
			@Override
			public void modifyText( ModifyEvent e ) {
				NewBpelFileFirstPage.this.processNamespace = ((Combo) e.widget).getText();
				updateStatus();
			}
		});


		new Label( container, SWT.NONE );
		final Button abstractProcessButton = new Button( container, SWT.CHECK );
		abstractProcessButton.setText( "Abstract Process" );
		abstractProcessButton.setToolTipText( "Make the created process abstract" );
		abstractProcessButton.addSelectionListener( new SelectionListener() {
			@Override
			public void widgetSelected( SelectionEvent e ) {
				widgetDefaultSelected( e );
			}

			@Override
			public void widgetDefaultSelected( SelectionEvent e ) {
				NewBpelFileFirstPage.this.abstractProcess = ((Button) e.widget).getSelection();
				updateStatus();
			}
		});


		// Add an image to illustrate the creation mode
		Composite imageContainer = new Composite( container, SWT.BORDER );
		imageContainer.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE ));
		GridLayout layout = new GridLayout( 3, false );
		layout.horizontalSpacing = 0;
		layout.marginTop = 12;
		imageContainer.setLayout( layout );

		GridData layoutData = new GridData( GridData.FILL_HORIZONTAL );
		layoutData.horizontalSpan = 2;
		layoutData.verticalIndent = 21;
		imageContainer.setLayoutData( layoutData );

		final Label imgLeftLabel = new Label( imageContainer, SWT.NONE );
		imgLeftLabel.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE ));

		Label imgCenterLabel = new Label( imageContainer, SWT.NONE );
		imgCenterLabel.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE ));
		imgCenterLabel.setLayoutData( new GridData( SWT.CENTER, SWT.CENTER, true, true ));
		imgCenterLabel.setImage( this.arrowImg );

		Label imgRightLabel = new Label( imageContainer, SWT.NONE );
		imgRightLabel.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE ));
		imgRightLabel.setImage( this.bpelImg );

		final Text explainationText = new Text( imageContainer, SWT.MULTI | SWT.READ_ONLY | SWT.WRAP );
		explainationText.setBackground( getShell().getDisplay().getSystemColor( SWT.COLOR_WHITE ));
		layoutData = new GridData( GridData.FILL_HORIZONTAL  );
		layoutData.horizontalSpan = 3;
		layoutData.verticalIndent = 21;
		explainationText.setLayoutData( layoutData );


		// Detect when the creation mode changes
		creationViewer.addSelectionChangedListener( new ISelectionChangedListener() {
			@Override
			public void selectionChanged( SelectionChangedEvent event ) {
				NewBpelFileFirstPage.this.creationMode = (BpelCreationMode) ((IStructuredSelection) creationViewer.getSelection()).getFirstElement();
				explainationText.setText( NewBpelFileFirstPage.this.creationMode.getDescription());
				if( NewBpelFileFirstPage.this.creationMode == BpelCreationMode.GENERATE_BPEL_FROM_WSDL )
					imgLeftLabel.setImage( NewBpelFileFirstPage.this.wsdlImg );
				else
					imgLeftLabel.setImage( NewBpelFileFirstPage.this.tplImg );

				imgLeftLabel.getParent().layout();
				imgLeftLabel.getParent().getParent().layout();
				updateStatus();
			}
		});


		// Initialize all the stuff
		creationViewer.setSelection( new StructuredSelection( BpelCreationMode.CREATE_NEW_BPEL ));
		creationViewer.getCombo().notifyListeners( SWT.Selection, new Event());
		if( getErrorMessage() != null ) {
			setPageComplete( false );
			setErrorMessage( null );
		}
	}


	/**
	 * Validates the page data and updates the page state in consequence.
	 */
	private void updateStatus() {
		String errorMsg = validatePage();
		setPageComplete( errorMsg == null );
		setErrorMessage( errorMsg );
	}


	/**
	 * Validates the page data and stores valid values for further use.
	 * @return an error message or null if everything is right
	 */
	private String validatePage() {

		String errorMsg = null;

		// Validate the page fields
		IStatus nameStatus;
		if( this.processName == null || this.processName.trim().length() == 0 )
			errorMsg = "You have to specify the process name.";

		else if( this.processName.matches( "\\s" ))
			errorMsg = "The process name cannot contain spaces or white characters.";

		else if( ! ( nameStatus = ResourcesPlugin.getWorkspace().validateName( this.processName, IResource.FILE )).isOK())
			errorMsg = nameStatus.getMessage();

		else if( this.processNamespace == null || this.processNamespace.trim().length() == 0 )
			errorMsg = "You have to specify the process namespace.";


		//  No error => store properties for the templates
		if( errorMsg == null
				&& this.creationMode == BpelCreationMode.CREATE_NEW_BPEL ) {

			String bpelNamespace = this.abstractProcess ? BPELConstants.NAMESPACE_ABSTRACT_2007 : BPELConstants.NAMESPACE;
			this.processTemplateProperties.put( "processName", this.processName ); //$NON-NLS-1$
			this.processTemplateProperties.put( "namespace", this.processNamespace ); //$NON-NLS-1$
			this.processTemplateProperties.put( "bpelNamespace", bpelNamespace ); //$NON-NLS-1$
			this.processTemplateProperties.put( "date", new Date()); //$NON-NLS-1$
		}


		// Save some fields for further use
		IDialogSettings settings = getWizard().getDialogSettings();
		if( settings != null )
			settings.put( NewBpelFileWizard.DIALOG_SETTINGS_PROCESS_NAME, this.processName );

		return errorMsg;
	}


	/**
	 * The different modes to create a new BPEL to edit.
	 */
	public static enum BpelCreationMode {
		CREATE_NEW_BPEL, GENERATE_BPEL_FROM_WSDL;

		/*
		 * (non-Javadoc)
		 * @see java.lang.Enum#toString()
		 */
		@Override
		public String toString() {

			String result;
			switch( this ) {
			case CREATE_NEW_BPEL:
				result = "Create a BPEL process from a template";
				break;
			case GENERATE_BPEL_FROM_WSDL:
				result = "Create a BPEL process from a service description";
				break;
			default:
				result = "";
			}

			return result;
		};


		/**
		 * @return a more detailed description
		 */
		public String getDescription() {

			String result;
			switch( this ) {
			case CREATE_NEW_BPEL:
				result = "This will generate a skeleton of BPEL process.\nThis skeleton is based on pre-defined templates.";
				break;

			case GENERATE_BPEL_FROM_WSDL:
				result = "This will generate a skeleton of BPEL process to implement a given WSDL contract.\n"
				+ "\t \u2666 \tThe resulting process starts with a pick activity.\n"
				+ "\t \u2666 \tMessage dispatching depends on the invoked operation.";
				break;
			default:
				result = "";
			}

			return result;
		}
	}
}
