/*******************************************************************************
 * Copyright (c) 2000, 2018 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.ui.macbundler;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class BundleWizardPage1 extends BundleWizardBasePage {

	static String[] JVMS = { "1.3+", //$NON-NLS-1$
			"1.3*", //$NON-NLS-1$
			"1.4.2", //$NON-NLS-1$
			"1.4+", //$NON-NLS-1$
			"1.4*", //$NON-NLS-1$
			"1.5+", //$NON-NLS-1$
			"1.5*", //$NON-NLS-1$
			"1.6+", //$NON-NLS-1$
			"1.6*" //$NON-NLS-1$
	};

	ILaunchConfiguration[] fConfigurations = new ILaunchConfiguration[0];
	Combo fLocation;
	Combo fLaunchConfigs;
	Combo fJVMVersion;
	Text fAppName;
	Text fMainClass;
	Text fArguments;
	Text fIconFileName;
	Button fUseSWT;

	public BundleWizardPage1(BundleDescription bd) {
		super("page1", bd); //$NON-NLS-1$
	}

	@Override
	public void createContents(Composite c) {

		final Shell shell = c.getShell();

		Composite c1 = createComposite(c, 2);
		createLabel(c1, Util.getString("page1.launchConfig.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$

		fLaunchConfigs = new Combo(c1, SWT.READ_ONLY);
		fillCombo(fLaunchConfigs);
		fLaunchConfigs.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				int ix = fLaunchConfigs.getSelectionIndex();
				if (ix > 0 && ix < fConfigurations.length) {
					fBundleDescription.clear();
					fBundleDescription.inititialize(fConfigurations[ix]);
				}
			}
		});

		Group c2 = createGroup(c, "Main", 2); //$NON-NLS-1$
		createLabel(c2, Util.getString("page1.mainClass.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
		Composite c7a = createHBox(c2);

		fMainClass = createText(c7a, MAINCLASS, 1);
		Button b1 = createButton(c7a, SWT.NONE, Util.getString("page1.mainClass.chooseButton.label")); //$NON-NLS-1$
		b1.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				MessageBox mb = new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
				mb.setMessage(Util.getString("page1.mainClass.dialog.message")); //$NON-NLS-1$
				mb.setText(Util.getString("page1.mainClass.dialog.title")); //$NON-NLS-1$
				mb.open();
			}
		});

		createLabel(c2, Util.getString("page1.arguments.label"), GridData.VERTICAL_ALIGN_BEGINNING); //$NON-NLS-1$
		fArguments = createText(c2, ARGUMENTS, 2);

		Group c5 = createGroup(c, "Destination", 2); //$NON-NLS-1$
		createLabel(c5, Util.getString("page1.appName.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
		fAppName = createText(c5, APPNAME, 1);

		createLabel(c5, Util.getString("page1.appFolder.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
		Composite c3a = createHBox(c5);

		fLocation = createCombo(c3a, DESTINATIONDIRECTORY);

		final Button browse = createButton(c3a, SWT.NONE, Util.getString("page1.appFolder.browseButton.label")); //$NON-NLS-1$
		browse.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				DirectoryDialog dd = new DirectoryDialog(browse.getShell(), SWT.SAVE | SWT.SHEET);
				dd.setMessage(Util.getString("page1.appFolder.browseDialog.message")); //$NON-NLS-1$
				dd.setText(Util.getString("page1.appFolder.browseDialog.title")); //$NON-NLS-1$
				String name = dd.open();
				if (name != null) {
					fLocation.setText(name);
				}
			}
		});

		Group g6 = createGroup(c, "Options", 2); //$NON-NLS-1$

		createLabel(g6, Util.getString("page1.jvm.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$

		Composite c8 = createComposite(g6, 4);

		fJVMVersion = new Combo(c8, SWT.READ_ONLY);
		for (int i = 0; i < JVMS.length; i++) {
			fJVMVersion.add(JVMS[i]);
		}
		fJVMVersion.setText(JVMS[4]);
		hookField(fJVMVersion, JVMVERSION);
		createLabel(c8, "      ", GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
		createLabel(c8, Util.getString("page1.useSWT.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
		fUseSWT = createButton(c8, SWT.CHECK, null);
		hookButton(fUseSWT, USES_SWT);

		createLabel(g6, Util.getString("page1.appIcon.label"), GridData.VERTICAL_ALIGN_CENTER); //$NON-NLS-1$
		Composite c7 = createComposite(g6, 2);
		fIconFileName = createText(c7, ICONFILE, 1);
		final Button b = createButton(c7, SWT.NONE, Util.getString("page1.appIcon.chooseButton.label")); //$NON-NLS-1$
		b.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				FileDialog fd = new FileDialog(b.getShell(), SWT.OPEN | SWT.SHEET);
				fd.setText(Util.getString("page1.appIcon.chooseDialog.title")); //$NON-NLS-1$
				fd.setFilterExtensions(new String[] { "icns" }); //$NON-NLS-1$
				String name = fd.open();
				if (name != null) {
					fIconFileName.setText(name);
				}
			}
		});

	}

	@Override
	void enterPage() {
		super.enterPage();
		initCombo(fLaunchConfigs);
	}

	@Override
	public void propertyChange(PropertyChangeEvent event) {
		if (fAppName != null) {
			fAppName.setText(fBundleDescription.get(APPNAME, "")); //$NON-NLS-1$
		}
		if (fMainClass != null) {
			fMainClass.setText(fBundleDescription.get(MAINCLASS, "")); //$NON-NLS-1$
		}
		if (fJVMVersion != null) {
			fJVMVersion.setText(fBundleDescription.get(JVMVERSION, "")); //$NON-NLS-1$
		}
		if (fUseSWT != null) {
			fUseSWT.setSelection(fBundleDescription.get(USES_SWT, false));
		}
	}

	@Override
	public boolean isPageComplete() {
		return fAppName != null && fAppName.getText().length() > 0 && fLocation.getText().length() > 0;
	}

	// private stuff

	private void collectLaunchConfigs() {
		ArrayList<ILaunchConfiguration> configs = new ArrayList<ILaunchConfiguration>();
		ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
		ILaunchConfigurationType type = manager.getLaunchConfigurationType(IJavaLaunchConfigurationConstants.ID_JAVA_APPLICATION);
		try {
			ILaunchConfiguration[] configurations = manager.getLaunchConfigurations(type);
			for (int i = 0; i < configurations.length; i++) {
				ILaunchConfiguration configuration = configurations[i];
				if (BundleDescription.verify(configuration)) {
					configs.add(configuration);
				}
			}
		}
		catch (CoreException e) {
			//
		}
		fConfigurations = configs.toArray(new ILaunchConfiguration[configs.size()]);
		Arrays.sort(fConfigurations, new Comparator<Object>() {
			@Override
			public int compare(Object o1, Object o2) {
				ILaunchConfiguration lc1 = (ILaunchConfiguration) o1;
				ILaunchConfiguration lc2 = (ILaunchConfiguration) o2;
				return lc1.getName().compareTo(lc2.getName());
			}

			@Override
			public boolean equals(Object obj) {
				return false;
			}
		});
	}

	private void fillCombo(Combo c) {
		collectLaunchConfigs();
		for (int i = 0; i < fConfigurations.length; i++) {
			ILaunchConfiguration configuration = fConfigurations[i];
			c.add(configuration.getName());
		}
	}

	private void initCombo(Combo c) {
		IStructuredSelection sel = ((MacBundleWizard) getWizard()).getSelection();
		Object o = sel.getFirstElement();
		if (o instanceof IJavaElement) {
			IJavaProject project = ((IJavaElement) o).getJavaProject();
			if (project != null) {
				for (int i = 0; i < fConfigurations.length; i++) {
					ILaunchConfiguration configuration = fConfigurations[i];
					if (BundleDescription.matches(configuration, project)) {
						c.setText(configuration.getName());
						fBundleDescription.inititialize(configuration);
						return;
					}
				}
			}
		}
	}
}
