package org.omg.lsae.notifications;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class StepEvent extends AnalysisEvent {

	private int totalSteps = 0;

	private int completedSteps = 0;

	public StepEvent() {

	}

	/**
	 * @return the completedSteps
	 */
	public int getCompletedSteps() {
		return completedSteps;
	}

	/**
	 * @param completedSteps
	 *            the completedSteps to set
	 */
	public void setCompletedSteps(int completedSteps) {
		if (completedSteps < 0)
			completedSteps = 0;

		this.completedSteps = completedSteps;
	}

	/**
	 * @return the totalSteps
	 */
	public int getTotalSteps() {
		return totalSteps;
	}

	/**
	 * @param totalSteps
	 *            the totalSteps to set
	 */
	public void setTotalSteps(int totalSteps) {
		if (totalSteps < 0)
			totalSteps = 0;
		this.totalSteps = totalSteps;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.omg.lsae.notifications.AnalysisEvent#isCompleted()
	 */
	public boolean isCompleted() {
		return completedSteps >= totalSteps;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.omg.lsae.notifications.AnalysisEvent#toString()
	 */
	@Override
	public String toString() {
		return "Step Progress Event (" + getCompletedSteps() + "/"
				+ getTotalSteps() + ") - " + getMessage();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.omg.lsae.notifications.AnalysisEvent#toXMLString()
	 */
	@Override
	public String toXMLString() {

		Document doc = createDomDocument();

		Element root = doc.createElement("analysis_event");
		root.setAttribute("timestamp", getTimestamp());
		root.setAttribute("id", getQueryId());

		Element msg = doc.createElement("message");
		msg.setTextContent(getMessage());
		root.appendChild(msg);

		msg = doc.createElement("step_progress");
		msg.setAttribute("total_steps", "" + getTotalSteps());
		msg.setAttribute("steps_completed", "" + getCompletedSteps());
		root.appendChild(msg);

		ByteArrayOutputStream buf = new ByteArrayOutputStream();
		TransformerFactory tFactory = TransformerFactory.newInstance();
		Transformer transformer;
		StreamSource stylesource = new StreamSource(new ByteArrayInputStream(
				new String(XSLT).getBytes()));
		try {
			transformer = tFactory.newTransformer(stylesource);
			DOMSource source = new DOMSource(root);
			StreamResult result = new StreamResult(buf);
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,
					"yes");
			transformer.transform(source, result);
		} catch (TransformerConfigurationException e1) {
			System.err.println("Couldnt print out DOM "
					+ e1.getLocalizedMessage());
		} catch (TransformerException e) {
			System.err.println("Couldnt print out DOM "
					+ e.getLocalizedMessage());
		}
		return buf.toString();
	}
}
