/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * 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:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.wizard.ui.basic;

import java.lang.reflect.InvocationTargetException;
import java.net.URI;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.dialogs.WorkingSetGroup;
import org.eclipse.ui.internal.ide.IDEWorkbenchMessages;
import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
import org.eclipse.ui.internal.ide.dialogs.ProjectContentsLocationArea;
import org.eclipse.xtext.ui.wizard.IProjectCreator;
import org.eclipse.xtext.ui.wizard.IProjectInfo;

import com.axelerator.studio.rc.util.ui.ImageCombo;

public abstract class BasicNewProjectWizard extends org.eclipse.xtext.ui.wizard.XtextNewProjectWizard {

	public final CommonProjectWizardTranslator translator;

	public BasicNewProjectWizard(IProjectCreator creator, CommonProjectWizardTranslator translator) {
		super(creator);
		this.translator = translator;
//		try {
//	        ImageDescriptor desc = IDEWorkbenchPlugin.imageDescriptorFromPlugin(
//	        		"org.eclipse.osbp.wizard.ui", 
//	        		"/icons/osbp-logo-156x66.png");//$NON-NLS-1$
//		    setDefaultPageImageDescriptor(desc);
//		}
//		catch (Exception e) {} // NOP
	}
	
	@Override
	protected void doFinish(final IProjectInfo projectInfo, final IProgressMonitor monitor) {
		try {
			getCreator().setProjectInfo(projectInfo);
			getCreator().run(monitor);
//			fileOpener.selectAndReveal(creator.getResult());
//			fileOpener.openFileToEdit(getShell(), creator.getResult());
		}
		catch (final InvocationTargetException e) {
//			logger.error(e.getMessage(), e);
		}
		catch (final InterruptedException e) {
			// cancelled by user, ok
			return;
		}
	}

	/**
	 * Use this method to add pages to the wizard.
	 * The one-time generated version of this class will add a default new project page to the wizard.
	 */
	public abstract void addPages();
	
    @Override
	public void createPageControls(Composite pageContainer) {
    	super.createPageControls(pageContainer);
		addListenerToComponents();
    }

	/**
	 * Use this method to read the project settings from the wizard pages and feed them into the project info class.
	 */
	@Override
	protected abstract IProjectInfo getProjectInfo();
	
	public BasicProjectInfo projectInfo;

	protected String initialProjectFieldValue;
	
    // widgets
	protected Text vendor;
	public ImageCombo topLevelDomain;
	public Text companyDomain;
	public Text projectNameField;
	public Combo masterTemplate;
	public Text businessBundle;
	public Text bundleName;
    
	public Set<Listener> projectNameChanges = new HashSet<Listener>();
	
    public Listener nameModifyListener = new Listener() {
        public void handleEvent(Event e) {
        	setLocationForSelection();
        	IWizardPage current = BasicNewProjectWizard.this.getContainer().getCurrentPage();
        	if	(current instanceof WizardPage) {
        		((WizardPage) current).setPageComplete(validatePage((WizardPage) current));
        	}
        }
    };

    /**
     * Set the location to the default location if we are set to useDefaults.
     */
    protected void setLocationForSelection() {
    	locationArea.updateProjectName(getProjectNameFieldValue());
    }

    /**
     * Returns the current project name as entered by the user, or its anticipated
     * initial value.
     *
     * @return the project name, its anticipated initial value, or <code>null</code>
     *   if no project name is known
     */
    public String getProjectName() {
        if (projectNameField == null) {
			return initialProjectFieldValue;
		}

        return getProjectNameFieldValue();
    }

    /**
     * Returns the value of the project name field
     * with leading and trailing spaces removed.
     * 
     * @return the project name in the field
     */
    protected String getProjectNameFieldValue() {
        if (projectNameField == null) {
			return ""; //$NON-NLS-1$
		}

        return projectNameField.getText().trim();
    }

    protected Listener vendorChanges = new Listener() {
        public void handleEvent(Event e) {
        	projectInfo.setVendor(vendor.getText());
        }
    };

    protected Listener masterTemplateChanges = new Listener() {
    	public void handleEvent(Event e) {
    		projectInfo.setMasterTemplate(masterTemplate.getItem(masterTemplate.getSelectionIndex()));
    		businessBundle.setText(projectInfo.getBusinessBundle());
    	}
    };
    
    protected ProjectContentsLocationArea locationArea;

    protected WorkingSetGroup workingSetGroup;
    
    /**
	 * Create a working set group for this page. This method can only be called
	 * once.
	 * 
	 * @param composite
	 *            the composite in which to create the group
	 * @param selection
	 *            the current workbench selection
	 * @param supportedWorkingSetTypes
	 *            an array of working set type IDs that will restrict what types
	 *            of working sets can be chosen in this group
	 * @return the created group. If this method has been called previously the
	 *         original group will be returned.
	 * @since 3.4
	 */
	public WorkingSetGroup createWorkingSetGroup(Composite composite,
			IStructuredSelection selection, String[] supportedWorkingSetTypes) {
		if (workingSetGroup != null)
			return workingSetGroup;
		workingSetGroup = new WorkingSetGroup(composite, selection,
				supportedWorkingSetTypes);
		return workingSetGroup;
	}

	protected void addListenerToComponents() {
		if	(vendor != null) {
			vendor.addListener(SWT.Modify, vendorChanges);
		}
		for	(Listener projectNameChange : projectNameChanges) {
			if	(topLevelDomain != null) {
				topLevelDomain.addListener(SWT.Selection, projectNameChange);
			}
			if	(companyDomain != null) {
				companyDomain.addListener(SWT.Modify, projectNameChange);
			}
		}
		if	(masterTemplate != null) {
			masterTemplate.addListener(SWT.Selection, masterTemplateChanges);
		}
	}
	
    /**
     * Returns the current project location path as entered by 
     * the user, or its anticipated initial value.
     * Note that if the default has been returned the path
     * in a project description used to create a project
     * should not be set.
     *
     * @return the project location path or its anticipated initial value.
     */
    public IPath getLocationPath() {
        return new Path(locationArea.getProjectLocation());
    }
    
    /**
    /**
     * Returns the current project location URI as entered by 
     * the user, or <code>null</code> if a valid project location
     * has not been entered.
     *
     * @return the project location URI, or <code>null</code>
     * @since 3.2
     */
    public URI getLocationURI() {
    	return locationArea.getProjectLocationURI();
    }

    /**
	 * Creates a project resource handle for the current project name field
	 * value. The project handle is created relative to the workspace root.
	 * <p>
	 * This method does not create the project resource; this is the
	 * responsibility of <code>IProject::create</code> invoked by the new
	 * project resource wizard.
	 * </p>
	 * 
	 * @return the new project resource handle
	 */
    public IProject getProjectHandle() {
        return ResourcesPlugin.getWorkspace().getRoot().getProject(
                getProjectName());
    }

    /**
     * Sets the initial project name that this page will use when
     * created. The name is ignored if the createControl(Composite)
     * method has already been called. Leading and trailing spaces
     * in the name are ignored.
     * Providing the name of an existing project will not necessarily 
     * cause the wizard to warn the user.  Callers of this method 
     * should first check if the project name passed already exists 
     * in the workspace.
     * 
     * @param name initial project name for this page
     * 
     * @see IWorkspace#validateName(String, int)
     * 
     */
    public void setInitialProjectName(String name) {
        if (name == null) {
			initialProjectFieldValue = null;
		} else {
            initialProjectFieldValue = name.trim();
            if(locationArea != null) {
				locationArea.updateProjectName(name.trim());
			}
        }
    }

    /**
     * Returns whether this page's controls currently all contain valid 
     * values.
     *
     * @return <code>true</code> if all controls are valid, and
     *   <code>false</code> if at least one is invalid
     */
    protected boolean validatePage(WizardPage wizardPage) {
    	if	(wizardPage instanceof BasicNewProjectEclipsePage) {
	        IWorkspace workspace = IDEWorkbenchPlugin.getPluginWorkspace();
	
	        String projectFieldContents = getProjectNameFieldValue();
	        if (projectFieldContents.equals("")) { //$NON-NLS-1$
	        	wizardPage.setErrorMessage(null);
	        	wizardPage.setMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectNameEmpty);
	            return false;
	        }
	
	        IStatus nameStatus = workspace.validateName(projectFieldContents,
	                IResource.PROJECT);
	        if (!nameStatus.isOK()) {
	        	wizardPage.setErrorMessage(nameStatus.getMessage());
	            return false;
	        }
	
	        IProject handle = getProjectHandle();
	        if (handle.exists()) {
	        	wizardPage.setErrorMessage(IDEWorkbenchMessages.WizardNewProjectCreationPage_projectExistsMessage);
	            return false;
	        }
	                
	        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(
					getProjectNameFieldValue());
			locationArea.setExistingProject(project);
			
			String validLocationMessage = locationArea.checkValidLocation();
			if (validLocationMessage != null) { // there is no destination location given
				wizardPage.setErrorMessage(validLocationMessage);
				return false;
			}
    	}
		wizardPage.setErrorMessage(null);
		wizardPage.setMessage(null);
        return true;
    }

    /**
	 * Return the selected working sets, if any. If this page is not configured
	 * to interact with working sets this will be an empty array.
	 * 
	 * @return the selected working sets
	 * @since 3.4
	 */
	public IWorkingSet[] getSelectedWorkingSets() {
		return workingSetGroup == null ? new IWorkingSet[0] : workingSetGroup
				.getSelectedWorkingSets();
	}
	
}
