/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package org.apache.taverna.workbench.ui.views.contextualviews.annotated;

import static javax.swing.BoxLayout.Y_AXIS;

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.regex.Pattern;

import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

import org.apache.taverna.annotation.Annotated;
import org.apache.taverna.annotation.AnnotationBeanSPI;
import org.apache.taverna.lang.ui.DialogTextArea;
import org.apache.taverna.workbench.edits.CompoundEdit;
import org.apache.taverna.workbench.edits.Edit;
import org.apache.taverna.workbench.edits.EditException;
import org.apache.taverna.workbench.edits.EditManager;
import org.apache.taverna.workbench.selection.SelectionManager;
import org.apache.taverna.workbench.ui.views.contextualviews.ContextualView;
import org.apache.taverna.workbench.ui.views.contextualviews.impl.ContextualViewComponent;

import org.apache.log4j.Logger;

import org.apache.taverna.scufl2.api.container.WorkflowBundle;

/**
 * This is a ContextualView that should be able to display and allow editing of
 * Annotation information for any Annotated. At the moment it is only used for
 * Dataflow.
 * 
 * @author Alan R Williams
 */
@SuppressWarnings("serial")
public class AnnotatedContextualView extends ContextualView {
	private static final int WORKFLOW_NAME_LENGTH = 20;
	public static final String VIEW_TITLE = "Annotations";
	private final static String MISSING_VALUE = "Type here to give details";
	private final static int DEFAULT_AREA_WIDTH = 60;
	private final static int DEFAULT_AREA_ROWS = 8;

	private static Logger logger = Logger
			.getLogger(AnnotatedContextualView.class);
	private static PropertyResourceBundle prb = (PropertyResourceBundle) ResourceBundle
			.getBundle("annotatedcontextualview");

	// TODO convert to scufl2
	// private static AnnotationTools annotationTools = new AnnotationTools();

	/**
	 * The object to which the Annotations apply
	 */
	private Annotated<?> annotated;
	private SelectionManager selectionManager;
	private EditManager editManager;
	private boolean isStandalone = false;
	private JPanel panel;
	@SuppressWarnings("unused")
	private final List<AnnotationBeanSPI> annotationBeans;

	public AnnotatedContextualView(Annotated<?> annotated,
			EditManager editManager, SelectionManager selectionManager,
			List<AnnotationBeanSPI> annotationBeans) {
		super();
		this.editManager = editManager;
		this.selectionManager = selectionManager;
		this.annotationBeans = annotationBeans;
		this.annotated = annotated;

		initialise();
		initView();
	}

	@Override
	public void refreshView() {
		initialise();
	}

	private void initialise() {
		if (panel == null) {
			panel = new JPanel();
			panel.setLayout(new BoxLayout(panel, Y_AXIS));
		} else
			panel.removeAll();
		populatePanel();
		revalidate();
	}

	@Override
	public JComponent getMainFrame() {
		return panel;
	}

	@Override
	public String getViewTitle() {
		return VIEW_TITLE;
	}

	private Map<String,String> getAnnotations() {
		// TODO convert to scufl2
		Map<String, String> result = new HashMap<>();
		//for (Class<?> c : annotationTools.getAnnotatingClasses(annotated)) {
		// String name = "";
		// try {
		// name = prb.getString(c.getCanonicalName());
		// } catch (MissingResourceException e) {
		// name = c.getCanonicalName();
		// }
		// String value = annotationTools.getAnnotationString(annotated, c,
		// MISSING_VALUE);
		// result.put(name,value);
		//}
		return result;
	}
	public void populatePanel() {
		JPanel scrollPanel = new JPanel();
		scrollPanel.setLayout(new BoxLayout(scrollPanel, Y_AXIS));
		panel.setBorder(new EmptyBorder(5, 5, 5, 5));
		Map<String,String>annotations = getAnnotations();
		for (String name : annotations.keySet()) {
			JPanel subPanel = new JPanel();
			subPanel.setBorder(new TitledBorder(name));
			subPanel.add(createTextArea(String.class, annotations.get(name)));
			scrollPanel.add(subPanel);
		}
		JScrollPane scrollPane = new JScrollPane(scrollPanel);
		panel.add(scrollPane);
	}

	private JScrollPane createTextArea(Class<?> c, String value) {
		DialogTextArea area = new DialogTextArea(value);
		area.setFocusable(true);
		area.addFocusListener(new TextAreaFocusListener(area, c));
		area.setColumns(DEFAULT_AREA_WIDTH);
		area.setRows(DEFAULT_AREA_ROWS);
		area.setLineWrap(true);
		area.setWrapStyleWord(true);

		return new JScrollPane(area);
	}

	private class TextAreaFocusListener implements FocusListener {
		String oldValue = null;
		Class<?> annotationClass;
		DialogTextArea area = null;

		public TextAreaFocusListener(DialogTextArea area, Class<?> c) {
			annotationClass = c;
			oldValue = area.getText();
			this.area = area;
		}

		@Override
		public void focusGained(FocusEvent e) {
			if (area.getText().equals(MISSING_VALUE))
				area.setText("");
		}

		@Override
		public void focusLost(FocusEvent e) {
			String currentValue = area.getText();
			if (currentValue.isEmpty() || currentValue.equals(MISSING_VALUE)) {
				currentValue = MISSING_VALUE;
				area.setText(currentValue);
			}
			if (!currentValue.equals(oldValue)) {
				if (currentValue == MISSING_VALUE)
					currentValue = "";
				try {
					WorkflowBundle currentDataflow = selectionManager
							.getSelectedWorkflowBundle();
					List<Edit<?>> editList = new ArrayList<>();
					addWorkflowNameEdits(currentValue, currentDataflow,
							editList);
					if (!isStandalone)
						ContextualViewComponent.selfGenerated = true;
					editManager.doDataflowEdit(currentDataflow,
							new CompoundEdit(editList));
					ContextualViewComponent.selfGenerated = false;
				} catch (EditException e1) {
					logger.warn("Can't set annotation", e1);
				}
				oldValue = area.getText();
			}
		}

		private boolean isTitleAnnotation() {
			// TODO convert to scufl2
			return prb.getString(annotationClass.getCanonicalName()).equals(
					"Title");
		}

		// TODO convert to scufl2
		private void addWorkflowNameEdits(String currentValue,
				WorkflowBundle currentDataflow, List<Edit<?>> editList) {
			//editList.add(annotationTools.setAnnotationString(annotated,
			//		annotationClass, currentValue, edits));
			if (annotated == currentDataflow && isTitleAnnotation()
					&& !currentValue.isEmpty()) {
				@SuppressWarnings("unused")
				String sanitised = sanitiseName(currentValue);
				//editList.add(edits.getUpdateDataflowNameEdit(currentDataflow,
				//		sanitised));
			}
		}
	}

	/**
	 * Checks that the name does not have any characters that are invalid for a
	 * processor name.
	 * <p>
	 * The resulting name must contain only the chars [A-Za-z_0-9].
	 * 
	 * @param name
	 *            the original name
	 * @return the sanitised name
	 */
	private static String sanitiseName(String name) {
		if (name.length() > WORKFLOW_NAME_LENGTH)
			name = name.substring(0, WORKFLOW_NAME_LENGTH);
		if (Pattern.matches("\\w++", name))
			return name;
		StringBuilder temp = new StringBuilder();
		for (char c : name.toCharArray())
			temp.append(Character.isLetterOrDigit(c) || c == '_' ? c : '_');
		return temp.toString();
	}

	@Override
	public int getPreferredPosition() {
		return 500;
	}
}
