/*******************************************************************************
 * Copyright (C) 2007 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.workbench.ui.actions.activity;

import java.util.List;
import java.util.WeakHashMap;

import javax.swing.AbstractAction;
import javax.swing.JDialog;

import net.sf.taverna.t2.lang.observer.Observable;
import net.sf.taverna.t2.lang.observer.Observer;
import net.sf.taverna.t2.servicedescriptions.ServiceDescription;
import net.sf.taverna.t2.servicedescriptions.ServiceDescriptionRegistry;
import net.sf.taverna.t2.workbench.activityicons.ActivityIconManager;
import net.sf.taverna.t2.workbench.file.FileManager;
import net.sf.taverna.t2.workbench.file.events.ClosingDataflowEvent;
import net.sf.taverna.t2.workbench.file.events.FileManagerEvent;
import net.sf.taverna.t2.workbench.ui.views.contextualviews.activity.ActivityConfigurationDialog;
import uk.org.taverna.scufl2.api.activity.Activity;
import uk.org.taverna.scufl2.api.common.Scufl2Tools;
import uk.org.taverna.scufl2.api.container.WorkflowBundle;
import uk.org.taverna.scufl2.api.core.Processor;
import uk.org.taverna.scufl2.api.core.Workflow;
import uk.org.taverna.scufl2.api.profiles.ProcessorBinding;
import uk.org.taverna.scufl2.api.profiles.Profile;

@SuppressWarnings("serial")
public abstract class ActivityConfigurationAction extends AbstractAction {
	private static WeakHashMap<Activity, ActivityConfigurationDialog> configurationDialogs = new WeakHashMap<>();
	private static DataflowCloseListener listener;

	protected Activity activity;
	private final ServiceDescriptionRegistry serviceDescriptionRegistry;

	public ActivityConfigurationAction(Activity activity,
			ActivityIconManager activityIconManager,
			ServiceDescriptionRegistry serviceDescriptionRegistry) {
		this.activity = activity;
		this.serviceDescriptionRegistry = serviceDescriptionRegistry;
		putValue(SMALL_ICON,
				activityIconManager.iconForActivity(activity.getType()));
	}

	protected Activity getActivity() {
		return activity;
	}

	protected ServiceDescription getServiceDescription() {
		return serviceDescriptionRegistry.getServiceDescription(activity
				.getType());
	}

	protected static void setDialog(Activity activity,
			ActivityConfigurationDialog dialog, FileManager fileManager) {
		if (listener == null) {
			listener = new DataflowCloseListener();
			/*
			 * Ensure that the DataflowCloseListener is the first notified
			 * listener. Otherwise you cannot save the configurations.
			 */
			List<Observer<FileManagerEvent>> existingListeners = fileManager
					.getObservers();
			fileManager.addObserver(listener);
			for (Observer<FileManagerEvent> observer : existingListeners)
				if (!observer.equals(listener)) {
					fileManager.removeObserver(observer);
					fileManager.addObserver(observer);
				}
		}
		if (configurationDialogs.containsKey(activity)) {
			ActivityConfigurationDialog currentDialog = configurationDialogs
					.get(activity);
			if (!currentDialog.equals(dialog) && currentDialog.isVisible())
				currentDialog.setVisible(false);
		}
		configurationDialogs.put(activity, dialog);
		dialog.setVisible(true);
	}

	public static void clearDialog(Activity activity) {
		if (configurationDialogs.containsKey(activity)) {
			ActivityConfigurationDialog currentDialog = configurationDialogs
					.get(activity);
			if (currentDialog.isVisible())
				currentDialog.setVisible(false);
			configurationDialogs.remove(activity);
			currentDialog.dispose();
		}
	}

	protected static void clearDialog(JDialog dialog) {
		if (configurationDialogs.containsValue(dialog)) {
			if (dialog.isVisible())
				dialog.setVisible(false);
			for (Activity activity : configurationDialogs.keySet())
				if (configurationDialogs.get(activity).equals(dialog))
					configurationDialogs.remove(activity);
			dialog.dispose();
		}
	}

	public static boolean closeDialog(Activity activity) {
		boolean closeIt = true;
		if (configurationDialogs.containsKey(activity)) {
			ActivityConfigurationDialog currentDialog = configurationDialogs
					.get(activity);
			if (currentDialog.isVisible())
				closeIt = currentDialog.closeDialog();
			if (closeIt)
				configurationDialogs.remove(activity);
		}
		return closeIt;
	}

	public static ActivityConfigurationDialog getDialog(Activity activity) {
		return configurationDialogs.get(activity);
	}

	private static class DataflowCloseListener implements
			Observer<FileManagerEvent> {
		private Scufl2Tools scufl2Tools = new Scufl2Tools();

		@Override
		public void notify(Observable<FileManagerEvent> sender,
				FileManagerEvent message) throws Exception {
			if (message instanceof ClosingDataflowEvent) {
				ClosingDataflowEvent closingDataflowEvent = (ClosingDataflowEvent) message;
				if (closingDataflowEvent.isAbortClose())
					return;
				closingDataflow(closingDataflowEvent,
						((ClosingDataflowEvent) message).getDataflow());
			}
		}

		private void closingDataflow(ClosingDataflowEvent event,
				WorkflowBundle bundle) {
			Profile profile = bundle.getMainProfile();
			for (Workflow workflow : bundle.getWorkflows())
				for (Processor p : workflow.getProcessors()) {
					ProcessorBinding processorBinding = scufl2Tools
							.processorBindingForProcessor(p, profile);
					Activity activity = processorBinding.getBoundActivity();
					if (!closeDialog(activity))
						event.setAbortClose(true);
				}
		}
	}
}
