package com.softgraf.vendas.model.xml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
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 org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

// Pacotes javax.xml, org.w3c.dom e org.xml
public class GravadorXml {

	// fábrica de documentos
	private DocumentBuilderFactory fabrica;
	// construtor de documentos
	private DocumentBuilder docBuilder;
	// fábrica de transformador
	private TransformerFactory tf;
	// transformador de dados
	private Transformer transformer;	


	public GravadorXml() throws ParserConfigurationException, TransformerConfigurationException {
		fabrica = DocumentBuilderFactory.newInstance();
		docBuilder = fabrica.newDocumentBuilder();
		tf = TransformerFactory.newInstance();
		transformer = tf.newTransformer();
		// acrescenta caractere \n
		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
	}
	
	public void processar (String arquivoXml, String tagRaiz, String tagPrincipal, List<String> listaTags, List<List<String>> listaValores) throws FileNotFoundException, TransformerException{
		// documento DOM (Document Object Model)
		Document doc = docBuilder.newDocument();
		
		// tag <clientes>
		Element elementoRaiz = doc.createElement(tagRaiz);
		doc.appendChild(elementoRaiz);
		
		for (List<String> valores : listaValores) {
			
			// tag <cliente>
			Element elementoPrincipal = doc.createElement(tagPrincipal);
			elementoRaiz.appendChild(elementoPrincipal);
			
			// para cada tag
			for (int i=0; i < listaTags.size(); i++){
				String tag = listaTags.get(i);
				String  valor = valores.get(i);
				Element elementoTag = doc.createElement(tag);
				Text elementoValor = doc.createTextNode(valor);
				elementoTag.appendChild(elementoValor);
				elementoPrincipal.appendChild(elementoTag);
			}
		}
		
		// origem dos dados xml a serem gravados
		DOMSource xmlSource = new DOMSource(doc);
		// define nome do arquivo xml
		File arquivo = new File(arquivoXml);
		// fluxo de saida de bytes
		FileOutputStream saida = new FileOutputStream(arquivo);
		// fluxo de saida  de dados xml
		StreamResult outputTarget = new StreamResult(saida);
		// converte dados xml em arquivo xml
		transformer.transform(xmlSource, outputTarget);
	}
}
