/*******************************************************************************
 * Copyright (C) 2012 The University of Manchester
 *
 *  Modifications to the initial code base are copyright of their
 *  respective authors, or their employers as appropriate.
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2.1 of
 *  the License, or (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ******************************************************************************/
package net.sf.taverna.t2.activities.beanshell.views;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import net.sf.taverna.t2.lang.ui.EditorKeySetUtil;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ActivityPortConfiguration;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.DependencyConfigurationPanel;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ListConfigurationComponent;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.MultiPageActivityConfigurationPanel;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ScriptConfigurationComponent;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ValidatingTextField;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ValidatingTextGroup;
import uk.org.taverna.configuration.app.ApplicationConfiguration;
import uk.org.taverna.scufl2.api.activity.Activity;
import uk.org.taverna.scufl2.api.port.InputActivityPort;
import uk.org.taverna.scufl2.api.port.OutputActivityPort;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;

/**
 * Component for configuring a Beanshell activity.
 *
 * @author David Withers
 */
@SuppressWarnings("serial")
public class BeanshellConfigurationPanel extends MultiPageActivityConfigurationPanel {

	private ScriptConfigurationComponent scriptConfigurationComponent;
	private ValidatingTextGroup inputTextGroup, outputTextGroup;
	private DependencyConfigurationPanel dependencyConfigurationPanel;
	private File libDir;

	public BeanshellConfigurationPanel(Activity activity,
			ApplicationConfiguration applicationConfiguration) {
		super(activity);
		libDir = new File(applicationConfiguration.getApplicationHomeDir(), "lib");
		if (!libDir.exists()) {
			libDir.mkdir();
		}
		initialise();
	}

	@Override
	protected void initialise() {
		super.initialise();
		removeAllPages();
		addPage("Script", createScriptEditPanel());
		addPage("Input ports", createInputPanel());
		addPage("Output ports", createOutputPanel());
		addPage("Dependencies", createDependenciesPanel());
		setPreferredSize(new Dimension(600, 500));
	}

	@Override
	public void noteConfiguration() {
		setProperty("script", scriptConfigurationComponent.getScript());
		setProperty("classLoaderSharing", dependencyConfigurationPanel.getClassLoaderSharing());
		List<String> localDependencies = dependencyConfigurationPanel.getLocalDependencies();
		if (localDependencies == null || localDependencies.isEmpty()) {
			getJson().remove("localDependency");
		} else {
			ArrayNode localDependenciesArray = getJson().arrayNode();
			for (String localDependency : localDependencies) {
				localDependenciesArray.add(localDependency);
			}
			getJson().put("localDependency", localDependenciesArray);
		}
	}

	@Override
	public boolean checkValues() {
		return true;
	}

	private Component createScriptEditPanel() {
		Set<String> keywords = EditorKeySetUtil.loadKeySet(getClass().getResourceAsStream(
				"keys.txt"));
		Set<String> ports = new HashSet<>();
		for (InputActivityPort ip : getActivity().getInputPorts()) {
			ports.add(ip.getName());
		}
		for (OutputActivityPort op : getActivity().getOutputPorts()) {
			ports.add(op.getName());
		}
		scriptConfigurationComponent = new ScriptConfigurationComponent(getProperty("script"),
				keywords, ports, "Beanshell", ".bsh");
		return scriptConfigurationComponent;
	}

	private Component createInputPanel() {
		inputTextGroup = new ValidatingTextGroup();
		ListConfigurationComponent<ActivityPortConfiguration> inputPanel = new ListConfigurationComponent<ActivityPortConfiguration>(
				"Input Port", getInputPorts()) {
			@Override
			protected Component createItemComponent(ActivityPortConfiguration port) {
				return new PortComponent(port, inputTextGroup);
			}

			@Override
			protected ActivityPortConfiguration createDefaultItem() {
				return new ActivityPortConfiguration("in", 0);
			}
		};
		return inputPanel;
	}

	private Component createOutputPanel() {
		outputTextGroup = new ValidatingTextGroup();
		ListConfigurationComponent<ActivityPortConfiguration> inputPanel = new ListConfigurationComponent<ActivityPortConfiguration>(
				"Output Port", getOutputPorts()) {
			@Override
			protected Component createItemComponent(ActivityPortConfiguration port) {
				return new PortComponent(port, outputTextGroup);
			}

			@Override
			protected ActivityPortConfiguration createDefaultItem() {
				return new ActivityPortConfiguration("out", 0);
			}
		};
		return inputPanel;
	}

	private Component createDependenciesPanel() {
		String classLoaderSharing = getProperty("classLoaderSharing");
		List<String> localDependencies = new ArrayList<>();
		if (getJson().has("localDependency")) {
			for (JsonNode localDependency : getJson().get("localDependency")) {
				localDependencies.add(localDependency.textValue());
			}
		}
		dependencyConfigurationPanel = new DependencyConfigurationPanel(classLoaderSharing,
				localDependencies, libDir);
		return dependencyConfigurationPanel;
	}

	class PortComponent extends JPanel {

		private ValidatingTextField nameField;
		private SpinnerNumberModel depthModel;
		private final ValidatingTextGroup validatingTextGroup;

		public PortComponent(final ActivityPortConfiguration portConfiguration,
				ValidatingTextGroup validatingTextGroup) {
			this.validatingTextGroup = validatingTextGroup;

			nameField = new ValidatingTextField(portConfiguration.getName());
			nameField.getDocument().addDocumentListener(new DocumentListener() {
				@Override
				public void removeUpdate(DocumentEvent e) {
					portConfiguration.setName(nameField.getText());
				}

				@Override
				public void insertUpdate(DocumentEvent e) {
					portConfiguration.setName(nameField.getText());
				}

				@Override
				public void changedUpdate(DocumentEvent e) {
					portConfiguration.setName(nameField.getText());
				}
			});
			validatingTextGroup.addValidTextComponent(nameField);
			depthModel = new SpinnerNumberModel(portConfiguration.getDepth(), 0, 100, 1);
			depthModel.addChangeListener(new ChangeListener() {
				@Override
				public void stateChanged(ChangeEvent e) {
					portConfiguration.setDepth(depthModel.getNumber().intValue());
				}
			});

			setLayout(new GridBagLayout());
			GridBagConstraints c = new GridBagConstraints();
			c.anchor = GridBagConstraints.WEST;
			add(new JLabel("Name"), c);
			c.fill = GridBagConstraints.HORIZONTAL;
			c.weightx = 1;
			add(nameField, c);
			c.fill = GridBagConstraints.NONE;
			c.weightx = 0;
			add(new JLabel("Depth"), c);
			add(new JSpinner(depthModel), c);

		}

		public void removeNotify() {
			validatingTextGroup.removeTextComponent(nameField);
		}

	}

}
