/*******************************************************************************
 * 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.renderers;

import java.nio.file.Path;

import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.LookAndFeel;
import javax.swing.UIManager;

import org.apache.log4j.Logger;

import uk.org.taverna.databundle.DataBundles;
import cht.svista.SeqVISTA;

/**
 * Uses the SeqVista renderer to draw an EMBL or SwissProt sequence
 *
 * @author Ian Dunlop
 * @author anonymous from T1
 * @author Alex Nenadic
 */
public class SeqVistaRenderer implements Renderer {

	private Logger logger = Logger.getLogger(SeqVistaRenderer.class);

	private int MEGABYTE = 1024 * 1024;

	private String seqType = "fasta";
	// 0 = auto, 1 = nucleotide, 2 = protein
	private int np = 0;

	@Override
	public boolean canHandle(String mimeType) {
		if (mimeType.matches(".*chemical/x-swissprot.*")) {
			seqType = "embl";
			np = 2;
			return true;
		} else if (mimeType.matches(".*chemical/x-embl-dl-nucleotide.*")) {
			seqType = "embl";
			np = 1;
			return true;
		} else if (mimeType.matches(".*chemical/x-fasta.*")) {
			seqType = "fasta";
			np = 0;
			return true;
		} else if (mimeType.matches(".*chemical/x-ppd.*")) {
			seqType = "ppd";
			return true;
		} else if (mimeType.matches(".*chemical/seq-na-genbank.*")) {
			seqType = "auto";
			np = 1;
			return true;
		} else if (mimeType.matches(".*chemical/seq-aa-genpept.*")) {
			seqType = "auto";
			np = 2;
			return true;
		}
		return false;
	}

	@Override
	public String getType() {
		return "Seq Vista";
	}

	@SuppressWarnings("serial")
	public JComponent getComponent(Path path) throws RendererException {
		if (DataBundles.isValue(path) || DataBundles.isReference(path)) {
			long approximateSizeInBytes = 0;
			try {
				approximateSizeInBytes = RendererUtils.getSizeInBytes(path);
			} catch (Exception ex) {
				logger.error("Failed to get the size of the data", ex);
				return new JTextArea(
						"Failed to get the size of the data (see error log for more details): \n"
								+ ex.getMessage());
			}

			if (approximateSizeInBytes > MEGABYTE) {
				int response = JOptionPane
						.showConfirmDialog(
								null,
								"Result is approximately "
										+ bytesToMeg(approximateSizeInBytes)
										+ " MB in size, there could be issues with rendering this inside Taverna\nDo you want to continue?",
								"Render as sequence?", JOptionPane.YES_NO_OPTION);

				if (response != JOptionPane.YES_OPTION) {
					return new JTextArea(
							"Rendering cancelled due to size of data. Try saving and viewing in an external application.");
				}
			}

			String resolve = null;
			try {
				// Resolve it as a string
				resolve = RendererUtils.getString(path);
			} catch (Exception e) {
				logger.error("Reference Service failed to render data as string", e);
				return new JTextArea(
						"Reference Service failed to render data as string (see error log for more details): \n"
								+ e.getMessage());
			}
			// Save LAF as SeqVista is messing with it
			LookAndFeel currentLookAndFeel = UIManager.getLookAndFeel();
			SeqVISTA vista = new SeqVISTA() {
				@Override
				public java.awt.Dimension getPreferredSize() {
					return new java.awt.Dimension(100, 100);
				}
			};
			// Reset LAF messed up by SeqVista
			try {
				UIManager.setLookAndFeel(currentLookAndFeel);
			} catch (Exception e) {
				logger.info("Can't reset look and feel to " + currentLookAndFeel
						+ " after SeqVista renderer messed it up", e);
			}

			try {
				vista.loadFromText(resolve, false, seqType, np);
			} catch (Exception e) {
				logger.error("Failed to create Sequence Vista renderer", e);
				return new JTextArea(
						"Failed to create Sequence Vista renderer (see error log for more details): \n"
								+ e.getMessage());
			}
			return vista;
		} else {
			logger.error("Failed to obtain the data to render: data is not a value or reference");
			return new JTextArea(
					"Failed to obtain the data to render: data is not a value or reference");
		}
	}

	/**
	 * Work out size of file in megabytes to 1 decimal place
	 *
	 * @param bytes
	 * @return
	 */
	private int bytesToMeg(long bytes) {
		float f = bytes / MEGABYTE;
		return Math.round(f);
	}
}
