
package org.apache.taverna.activities.externaltool.views;
/*
 * 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.
 */

import java.awt.Frame;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import javax.swing.Action;

import org.apache.taverna.activities.externaltool.ExternalToolActivity;
import org.apache.taverna.activities.externaltool.ExternalToolActivityConfigurationBean;
import org.apache.taverna.activities.externaltool.actions.ExternalToolActivityConfigureAction;
import org.apache.taverna.activities.externaltool.servicedescriptions.ExternalToolActivityIcon;
import org.apache.taverna.workbench.activityicons.ActivityIconManager;
import org.apache.taverna.workbench.configuration.colour.ColourManager;
import org.apache.taverna.workbench.edits.EditManager;
import org.apache.taverna.workbench.file.FileManager;
import org.apache.taverna.workbench.ui.actions.activity.HTMLBasedActivityContextualView;
import org.apache.taverna.workflowmodel.processor.activity.Activity;
import org.apache.taverna.activities.externaltool.desc.ScriptInput;
import org.apache.taverna.activities.externaltool.desc.ScriptInputStatic;
import org.apache.taverna.activities.externaltool.desc.ScriptOutput;
import org.apache.taverna.activities.externaltool.desc.ToolDescription;

/**
 * ExternalToolActivityContextualView displays the use case information in a HTML table. Currently,
 * this is only the use case ID.
 *
 * @author Hajo Nils Krabbenhoeft
 */
public class ExternalToolActivityContextualView extends
		HTMLBasedActivityContextualView<ExternalToolActivityConfigurationBean> {
	private static final long serialVersionUID = 1L;
	private final EditManager editManager;
	private final FileManager fileManager;
	private final ActivityIconManager activityIconManager;

	public ExternalToolActivityContextualView(Activity<?> activity, EditManager editManager,
			FileManager fileManager, ColourManager colourManager, ActivityIconManager activityIconManager) {
		super(activity, colourManager);
		this.editManager = editManager;
		this.fileManager = fileManager;
		this.activityIconManager = activityIconManager;
	}

	@Override
	protected String getRawTableRowsHtml() {
		String html = "";
		ExternalToolActivityConfigurationBean bean = getConfigBean();
		String repositoryUrl = bean.getRepositoryUrl();
		if ((repositoryUrl == null) || repositoryUrl.isEmpty()) {
			repositoryUrl = "<b>Not specified</b>";
		}
		html += "<tr><td>Repository URL</td><td>" + repositoryUrl + "</td></tr>";

		String id = bean.getExternaltoolid();
		if ((id == null) || id.isEmpty()) {
			id = "<b>Not specified</b>";
		}
		html += "<tr><td>Id</td><td>" + id + "</td></tr>";

		ToolDescription useCaseDescription = bean.getUseCaseDescription();
		String name = useCaseDescription.getUsecaseid();
		if ((name == null) || name.isEmpty()) {
			name = "<b>Not specified</b>";
		}
		html += "<tr><td>Name</td><td>" + name + "</td></tr>";

		Map<String, ScriptInput> stringReplacements = new TreeMap<String, ScriptInput>();
		Map<String, ScriptInput> fileInputs = new TreeMap<String, ScriptInput>();

		for (Entry<String, ScriptInput> entry : useCaseDescription.getInputs().entrySet()) {
			String key = entry.getKey();
			ScriptInput value = entry.getValue();
			if (value.isFile()) {
				fileInputs.put(key, value);
			} else if (value.isTempFile()) {
				// Nothing
			} else {
				stringReplacements.put(key, value);
			}
		}

		if (!stringReplacements.isEmpty()) {
			html += "<tr><td colspan=2 align=center><b>String replacements</b></td></tr>";
			html += "<tr><td><b>Port name</b></td><td><b>Replaces</b></td></tr>";
			for (String siName : stringReplacements.keySet()) {
				html += "<tr><td>" + siName + "</td>";
				ScriptInput si = stringReplacements.get(siName);
				html += "<td>%%" + si.getTag() + "%%</td>";

				html += "</tr>";
			}
		}

		if (!fileInputs.isEmpty()) {
			html += "<tr><td colspan=2 align=center><b>File inputs</b></td></tr>";
			html += "<tr><td><b>Port name</b></td><td><b>To file</b></td></tr>";
			for (String siName : fileInputs.keySet()) {
				html += "<tr><td>" + siName + "</td>";
				ScriptInput si = fileInputs.get(siName);
				html += "<td>" + si.getTag() + "</td>";

				html += "</tr>";
			}
		}

		List<ScriptInputStatic> staticInputs = useCaseDescription.getStatic_inputs();
		if (!staticInputs.isEmpty()) {
			html += "<tr><td colspan=2 align=center><b>Static inputs</b></td></tr>";
			html += "<tr><td><b>Type</b></td><td><b>To file</b></td></tr>";
			for (ScriptInputStatic si : staticInputs) {
				if (si.getUrl() != null) {
					html += "<td><b>URL</b></td>";
				} else {
					html += "<td><b>Explicit content</b></td>";
				}
				if (si.isFile()) {
					html += "<td>" + si.getTag() + "</td>";
				}
				html += "</tr>";
			}
		}
		Map<String, ScriptOutput> outputs = useCaseDescription.getOutputs();
		if (!outputs.isEmpty()) {
			html += "<tr><td colspan=2 align=center><b>File outputs</b></td></tr>";
			html += "<tr><td><b>Port name</b></td><td><b>From file</b></td></tr>";
			for (String soName : outputs.keySet()) {
				html += "<tr><td>" + soName + "</td>";
				ScriptOutput so = outputs.get(soName);
				html += "<td>" + so.getPath() + "</td>";
				html += "</tr>";
			}
		}
		return html;
	}

	@Override
	public String getViewTitle() {
		return "Tool service";
	}

	@Override
	public Action getConfigureAction(final Frame owner) {
		return new ExternalToolActivityConfigureAction((ExternalToolActivity) getActivity(), owner,
				editManager, fileManager, activityIconManager);
	}

	public String getBackgroundColour() {

		return ExternalToolActivityIcon.getColourString();
	}

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

}
