/*******************************************************************************
 * Copyright (c) 2011, 2016 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.help.ui.internal.preferences;


import java.util.List;

import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Table;

public class ICButtons implements SelectionListener{

	private final HelpContentPreferencePage page;

	private final Button addIC;
	private final Button editIC;
	private final Button removeIC;
	private final Button moveUp;
	private final Button moveDown;
	private final Button testIC;
	private final Button enableIC;

	private boolean enabled = true;

	public ICButtons(Composite parent,HelpContentPreferencePage page)
	{
		this.page = page;

		Composite container = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		container.setLayout(layout);
		container.setLayoutData(new GridData(GridData.FILL_VERTICAL));
		container.setFont(parent.getFont());

		addIC = createPushButton(container, Messages.HelpContentBlock_addICTitle);
		editIC = createPushButton(container, Messages.HelpContentBlock_editICTitle);
		removeIC = createPushButton(container, Messages.HelpContentBlock_removeICTitle);
		testIC = createPushButton(container, Messages.HelpContentBlock_testConnectionTitle);

		String enableTitle = Messages.HelpContentBlock_3.length() > Messages.HelpContentBlock_4.length() ?
				Messages.HelpContentBlock_3 : Messages.HelpContentBlock_4;
		enableIC = createPushButton(container, enableTitle);
		moveUp = createPushButton(container, Messages.HelpContentBlock_upTitle);
		moveDown = createPushButton(container, Messages.HelpContentBlock_downTitle);

		page.getTable().getTable().addSelectionListener(this);


		updateButtonStates();
	}

	public void setEnabled(boolean enabled)
	{
		this.enabled  = enabled;
		updateButtonStates();
	}

	public Button createPushButton(Composite parent, String buttonText) {
		Button button = new Button(parent, SWT.PUSH);
		button.setFont(parent.getFont());
		button.setText(buttonText);
		button.addSelectionListener(this);
		page.setButtonLayoutData(button);
		return button;
	}

	@Override
	public void widgetSelected(SelectionEvent e) {
		if (e.getSource() instanceof Button)
		{
			if (e.getSource()==addIC)
				addIC();
			else if (e.getSource()==editIC)
				editIC();
			else if (e.getSource()==removeIC)
				removeIC();
			else if (e.getSource()==testIC)
				testIC();
			else if (e.getSource()==enableIC)
				enableIC();
			else if (e.getSource()==moveUp)
				move(-1);
			else if (e.getSource()==moveDown)
				move(1);
		}
		else if (e.getSource() instanceof Table)
			updateButtonStates();
	}

	@Override
	public void widgetDefaultSelected(SelectionEvent e) {
		if (e.getSource() instanceof Table)
			editIC();
	}

	public void addIC()
	{
		ICDialog dialog = new ICDialog(page.getShell());
		if (dialog.open() == Window.OK) {
			page.getTable().addIC(dialog.getIC());
			updateButtonStates();
		}
	}

	public void editIC()
	{
		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
		IC ic = (IC)selection.getFirstElement();
		if (ic==null)
			return;

		ICDialog dialog = new ICDialog(page.getShell(),ic);

		if (dialog.open() == Window.OK) {
			page.getTable().editIC(dialog.getIC());
			updateButtonStates();
		}
	}

	public void removeIC()
	{
		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
		List<IC> ics = selection.toList();
		String remove = ""; //$NON-NLS-1$

		for (int i=0;i<ics.size();i++)
		{
			remove+="\n"+ics.get(i); //$NON-NLS-1$
		}

		boolean shouldRemove =
			  MessageDialog.openQuestion(
				page.getShell(),
				NLS.bind(Messages.HelpContentBlock_rmvTitle ,""), //$NON-NLS-1$
				NLS.bind(Messages.HelpContentBlock_rmvLabel ,remove));

		if (shouldRemove)
		{
			for (int i=0;i<ics.size();i++)
				page.getTable().removeIC(ics.get(i));
			updateButtonStates();
		}
	}

	public void testIC()
	{
		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
		IC ic = (IC)selection.getFirstElement();
		if (ic==null)
			return;

		ICDialog dialog = new ICDialog(page.getShell(),ic,true);

		if (dialog.open() == Window.OK) {
			page.getTable().editIC(dialog.getIC());
			updateButtonStates();
		}


/*		boolean connected = TestConnectionUtility.testConnection(ic.getHost(),
					ic.getPort()+"", ic.getPath(),ic.getProtocol());
		TestICDialog dialog = new TestICDialog(page.getShell(),ic);
		dialog.setConnectionStatus(connected);
		dialog.open();
*/
	}

	public void enableIC()
	{
		int indexes[] = page.getTable().getTable().getSelectionIndices();
		IStructuredSelection selection = (IStructuredSelection)page.getTable().getSelection();
		List<IC> ics = selection.toList();

		boolean enable = enableIC.getText().equals(Messages.HelpContentBlock_4);

		for (int i=0;i<ics.size();i++)
		{
			ics.get(i).setEnabled(enable);
			page.getTable().getTableViewer().replace(ics.get(i), indexes[i]);
		}
		page.getTable().refresh();

		updateButtonStates();
	}

	public void move(int offset)
	{
		int index = page.getTable().getTable().getSelectionIndices()[0];

		List<IC> ics = page.getTable().getICs();
		IC x = ics.get(index);
		IC y = ics.get(index + offset);

		ics.set(index+offset,x);
		ics.set(index,y);


		page.getTable().getTableViewer().getContentProvider().inputChanged(
				page.getTable().getTableViewer(), null, ics);

		page.getTable().getTableViewer().replace(x,index+offset);
		page.getTable().getTableViewer().replace(y,index);
		page.getTable().refresh();

		page.getTable().getTable().deselectAll();
		page.getTable().getTable().select(index+offset);
		updateButtonStates();

	}

	public void updateButtonStates()
	{
		if (!enabled)
		{
			editIC.setEnabled(false);
			testIC.setEnabled(false);
			moveUp.setEnabled(false);
			moveDown.setEnabled(false);
			enableIC.setEnabled(false);
			addIC.setEnabled(false);
			removeIC.setEnabled(false);
			return;
		}

		addIC.setEnabled(true);

		IC firstIC = (IC)(((IStructuredSelection)page.getTable().getSelection()).getFirstElement());
		if (firstIC!=null)
		{
			int index = page.getTable().getTable().getSelectionIndices()[0];
			enableIC.setText(firstIC.isEnabled() ? Messages.HelpContentBlock_3 : Messages.HelpContentBlock_4);

			if (page.getTable().getTable().getSelectionIndices().length==1)
			{
				editIC.setEnabled(true);
				testIC.setEnabled(true);
				moveUp.setEnabled(index!=0);
				moveDown.setEnabled(index!=page.getTable().getICs().size()-1);
			}
			else
			{
				editIC.setEnabled(false);
				testIC.setEnabled(false);
				moveUp.setEnabled(false);
				moveDown.setEnabled(false);
			}
			removeIC.setEnabled(true);
			enableIC.setEnabled(true);
		}
		else
		{
			editIC.setEnabled(false);
			testIC.setEnabled(false);
			moveUp.setEnabled(false);
			moveDown.setEnabled(false);
			removeIC.setEnabled(false);
			enableIC.setEnabled(false);
		}
	}
}
