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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.eclipse.ant.internal.ui.IAntUIHelpContextIds;
import org.eclipse.ant.internal.ui.model.AntModelContentProvider;
import org.eclipse.ant.internal.ui.model.AntModelLabelProvider;
import org.eclipse.ant.internal.ui.model.AntTargetNode;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
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.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.PlatformUI;

/**
 * Dialog to specify target execution order
 */
public class TargetOrderDialog extends Dialog implements ISelectionChangedListener {

	private Button fUp;
	private Button fDown;
	private TableViewer fViewer;
	private AntTargetNode[] fTargets;

	/**
	 * Constructs the dialog.
	 * 
	 * @param parentShell
	 */
	public TargetOrderDialog(Shell parentShell, AntTargetNode[] targets) {
		super(parentShell);
		fTargets = targets;
	}

	@Override
	protected Control createDialogArea(Composite parent) {
		getShell().setText(AntLaunchConfigurationMessages.TargetOrderDialog_Order_Targets_1);

		Composite comp = (Composite) super.createDialogArea(parent);
		((GridLayout) comp.getLayout()).numColumns = 2;
		Label label = new Label(comp, SWT.NONE);
		label.setText(AntLaunchConfigurationMessages.TargetOrderDialog__Specify_target_execution_order__2);
		label.setFont(comp.getFont());
		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
		gd.horizontalSpan = 2;
		label.setLayoutData(gd);

		createTargetList(comp);

		createButtons(comp);

		updateButtons();

		return comp;
	}

	/**
	 * Create button area &amp; buttons
	 * 
	 * @param parent
	 */
	private void createButtons(Composite parent) {
		Composite comp = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
		gd.verticalAlignment = GridData.BEGINNING;
		comp.setLayout(layout);
		comp.setLayoutData(gd);

		fUp = new Button(comp, SWT.PUSH);
		fUp.setFont(parent.getFont());
		fUp.setText(AntLaunchConfigurationMessages.TargetOrderDialog__Up_3);
		setButtonLayoutData(fUp);
		fUp.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				handleUpPressed();
			}
		});

		fDown = new Button(comp, SWT.PUSH);
		fDown.setFont(parent.getFont());
		fDown.setText(AntLaunchConfigurationMessages.TargetOrderDialog__Down_4);
		setButtonLayoutData(fDown);
		fDown.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent e) {
				handleDownPressed();
			}
		});
	}

	private void handleDownPressed() {
		List<AntTargetNode> targets = getOrderedSelection();
		if (targets.isEmpty()) {
			return;
		}
		List<AntTargetNode> list = new ArrayList<>(Arrays.asList(fTargets));
		int bottom = list.size() - 1;
		int index = 0;
		for (int i = targets.size() - 1; i >= 0; i--) {
			AntTargetNode target = targets.get(i);
			index = list.indexOf(target);
			if (index < bottom) {
				bottom = index + 1;
				AntTargetNode temp = list.get(bottom);
				list.set(bottom, target);
				list.set(index, temp);
			}
			bottom = index;
		}
		setEntries(list);
	}

	private void handleUpPressed() {
		List<AntTargetNode> targets = getOrderedSelection();
		if (targets.isEmpty()) {
			return;
		}
		int top = 0;
		int index = 0;
		List<AntTargetNode> list = new ArrayList<>(Arrays.asList(fTargets));
		Iterator<AntTargetNode> entries = targets.iterator();
		while (entries.hasNext()) {
			AntTargetNode target = entries.next();
			index = list.indexOf(target);
			if (index > top) {
				top = index - 1;
				AntTargetNode temp = list.get(top);
				list.set(top, target);
				list.set(index, temp);
			}
			top = index;
		}
		setEntries(list);
	}

	/**
	 * Updates the entries to the entries in the given list
	 */
	private void setEntries(List<AntTargetNode> list) {
		fTargets = list.toArray(new AntTargetNode[list.size()]);
		fViewer.setInput(fTargets);
		// update all selection listeners
		fViewer.setSelection(fViewer.getSelection());
	}

	/**
	 * Returns the selected items in the list, in the order they are displayed (not in the order they were selected).
	 * 
	 * @return targets for an action
	 */
	private List<AntTargetNode> getOrderedSelection() {
		List<AntTargetNode> targets = new ArrayList<>();
		List<?> selection = ((IStructuredSelection) fViewer.getSelection()).toList();
		for (AntTargetNode target : fTargets) {
			if (selection.contains(target)) {
				targets.add(target);
			}
		}
		return targets;
	}

	/**
	 * Creates a list viewer for the targets
	 * 
	 * @param comp
	 */
	private void createTargetList(Composite comp) {
		fViewer = new TableViewer(comp, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
		fViewer.setLabelProvider(new AntModelLabelProvider());

		fViewer.setContentProvider(new AntModelContentProvider());
		fViewer.setInput(fTargets);
		fViewer.addSelectionChangedListener(this);
		Table table = fViewer.getTable();
		GridData gd = new GridData(GridData.FILL_BOTH);
		gd.heightHint = 200;
		gd.widthHint = 250;
		table.setLayoutData(gd);
		table.setFont(comp.getFont());
	}

	/**
	 * Returns the ordered targets
	 */
	public Object[] getTargets() {
		return fTargets;
	}

	/**
	 * Update button enablement
	 * 
	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
	 */
	@Override
	public void selectionChanged(SelectionChangedEvent event) {
		updateButtons();
	}

	private void updateButtons() {
		int[] selections = fViewer.getTable().getSelectionIndices();
		int last = fTargets.length - 1;
		boolean up = true && selections.length > 0;
		boolean down = true && selections.length > 0;
		for (int selection : selections) {
			if (selection == 0) {
				up = false;
			}
			if (selection == last) {
				down = false;
			}
		}
		fUp.setEnabled(up);
		fDown.setEnabled(down);
	}

	@Override
	protected void configureShell(Shell shell) {
		super.configureShell(shell);
		PlatformUI.getWorkbench().getHelpSystem().setHelp(shell, IAntUIHelpContextIds.TARGET_ORDER_DIALOG);
	}
}
