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

import static java.awt.Font.PLAIN;
import static java.lang.String.format;
import static javax.swing.JOptionPane.NO_OPTION;
import static javax.swing.JOptionPane.QUESTION_MESSAGE;
import static javax.swing.JOptionPane.YES_NO_CANCEL_OPTION;
import static javax.swing.JOptionPane.YES_OPTION;
import static javax.swing.JOptionPane.showOptionDialog;
import static net.sf.taverna.t2.renderers.RendererUtils.getInputStream;
import static net.sf.taverna.t2.renderers.RendererUtils.getString;
import static net.sf.taverna.t2.renderers.impl.RendererConstants.CANCELLED_MSG;
import static net.sf.taverna.t2.renderers.impl.RendererConstants.SEE_LOG_MSG;

import java.awt.Font;
import java.io.InputStream;
import java.nio.file.Path;
import java.util.regex.Pattern;

import javax.swing.JComponent;
import javax.swing.JTextArea;

import net.sf.taverna.t2.lang.ui.DialogTextArea;
import net.sf.taverna.t2.renderers.RendererException;

/**
 * Renderer for mime type text/*
 * 
 * @author Ian Dunlop
 * @author Alex Nenadic
 * @author David Withers
 */
public class TextRenderer extends AbstractRenderer {
	private static final String UNREADABLE_MSG = "Reference Service failed to render data "
			+ SEE_LOG_MSG;
	private static final String RENDERER_FAILED_MSG = "Failed to create text renderer "
			+ SEE_LOG_MSG;
	private static final String QUERY_MSG = "Result is approximately %d MB "
			+ "in size, there could be issues with rendering this inside "
			+ "Taverna\nDo you want to cancel, render all of the result, "
			+ "or only the first part?";
	private static final Pattern pattern = Pattern.compile(".*text/.*");

	@Override
	public boolean canHandle(String mimeType) {
		return pattern.matcher(mimeType).matches();
	}

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

	private JComponent textRender(String text) {
		DialogTextArea theTextArea = new DialogTextArea();
		theTextArea.setWrapStyleWord(true);
		theTextArea.setEditable(false);
		theTextArea.setText(text);
		theTextArea.setFont(new Font("Monospaced", PLAIN, 12));
		theTextArea.setCaretPosition(0);
		return theTextArea;
	}

	private static final Object[] SIZE_OPTIONS = { "Continue rendering",
			"Render partial", "Cancel" };

	@Override
	protected JComponent sizeCheck(Path path, int approximateSizeInMB) {
		// allow partial rendering of text files
		int response = showOptionDialog(null,
				format(QUERY_MSG, approximateSizeInMB),
				"Rendering large result", YES_NO_CANCEL_OPTION,
				QUESTION_MESSAGE, null, SIZE_OPTIONS, SIZE_OPTIONS[2]);
		if (response == YES_OPTION)
			return null;
		else if (response != NO_OPTION)
			// if (response == CANCEL_OPTION) or ESCAPE key pressed
			return new JTextArea(CANCELLED_MSG);

		// Construct a partial result.
		byte[] smallStringBytes = new byte[1048576];
		try (InputStream inputStream = getInputStream(path)) {
			// just copy the first MEGABYTE
			inputStream.read(smallStringBytes);
		} catch (Exception ex) {
			logger.error("unrenderable: Reference Service failed "
					+ "to render data as byte array", ex);
			return new JTextArea(UNREADABLE_MSG + ex.getMessage());
		}
		try {
			// TODO beware of encoding problems!
			return textRender(new String(smallStringBytes));
		} catch (Exception e1) {
			logger.error("Failed to create text renderer", e1);
			return new JTextArea(RENDERER_FAILED_MSG + e1.getMessage());
		}
	}

	@Override
	public JComponent getRendererComponent(Path path) throws RendererException {
		String resolve;
		try {
			// Resolve it as a string
			resolve = getString(path);
		} catch (Exception e) {
			logger.error("unrenderable: Reference Service failed "
					+ "to render data as string", e);
			return new JTextArea(UNREADABLE_MSG + e.getMessage());
		}
		try {
			return textRender(resolve);
		} catch (Exception e1) {
			logger.error("Failed to create text renderer", e1);
			return new JTextArea(RENDERER_FAILED_MSG + e1.getMessage());
		}
	}
}
