package net.ihe.xcpd.resp.tools;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringBufferInputStream;
import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
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 net.ihe.gazelle.simulator.common.model.ApplicationConfiguration;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
 
 
/**
 *
 * @author abderrazek boufahja
 */
public class XmlFormatter
{
    
    /** Creates a new instance of Main */
    public XmlFormatter()
    {
        
    }
    
    @SuppressWarnings("deprecation")
	public static String format(String xmlString) throws DocumentException, IOException{
    	StringBufferInputStream is = new StringBufferInputStream(xmlString);
    	 SAXReader reader = new SAXReader();
    	 Document document = reader.read(is);
    	 return formatDocument(document);
    }
        
    
    public static String formatPath(String xmlpath) throws IOException, DocumentException{
    	SAXReader reader = new SAXReader();
    	Document document = reader.read(xmlpath);
    	return formatDocument(document);
    }
    
    
    public static String formatDocument(Document document) throws IOException
    {
        // Pretty print the document to System.out
        OutputFormat format = OutputFormat.createPrettyPrint();
        StringWriter w = new StringWriter();
        XMLWriter writer = new XMLWriter( w, format );
        writer.write( document );
        writer.close();
        return w.getBuffer().toString();
    }
    
    public static String formatDocument(Node document) throws IOException
    {
        // Pretty print the document to System.out
        OutputFormat format = OutputFormat.createPrettyPrint();
        StringWriter w = new StringWriter();
        XMLWriter writer = new XMLWriter( w, format );
        writer.write( document );
        writer.close();
        return w.getBuffer().toString();
    }
    
    public static String prettyFormat(String input, int indent) {
	    try {
	        Source xmlInput = new StreamSource(new StringReader(input));
	        StringWriter stringWriter = new StringWriter();
	        StreamResult xmlOutput = new StreamResult(stringWriter);
	        Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
	        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
	        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", String.valueOf(indent));
	        transformer.transform(xmlInput, xmlOutput);
	        return xmlOutput.getWriter().toString();
	    } catch (Exception e) {
	    		return input;
	    }
	}
    
    //*
    public static String transformXMLToHTML(String inFilePath)
    {
        try {
            TransformerFactory tFactory = TransformerFactory.newInstance();
            ByteArrayInputStream bais = new ByteArrayInputStream(inFilePath.getBytes());
            Transformer transformer = tFactory.newTransformer(new javax.xml.transform.stream.StreamSource(ApplicationConfiguration.getValueOfVariable("gazelle_bin")+ File.separatorChar + "xsl" +  File.separatorChar + "xmlverbatim.xsl"));
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            StreamResult out = new StreamResult(baos);
            transformer.transform(new javax.xml.transform.stream.StreamSource(bais), out);
            String tmp = new String (baos.toByteArray()) ;
            return tmp;
        } catch (Exception e) {
            e.printStackTrace( );
            return null;
        }
    }
    
    public static String formatNode(Node document) throws IOException, TransformerException
    {
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();
        StringWriter sw = new StringWriter();
        trans.transform(new DOMSource(document), new StreamResult(sw));
        String theAnswer = sw.toString();
        return theAnswer;
    }
    //*/
    
}
