package cat.aoc.pci;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.util.ByteArrayDataSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.dom.DOMSource;

import net.gencat.scsp.esquemes.peticion.Fichero;
import net.gencat.scsp.esquemes.peticion.Ficheros;
import net.gencat.scsp.esquemes.peticion.Peticion;
import net.gencat.scsp.esquemes.peticion.SolicitudTransmision;

import org.w3c.dom.Document;

import cat.aoc.pci.utils.Util;


public class PCIPeticio {

	// peticio 
	private Peticion peticio;
	// bool q indica si a la petició hi ha attachments
	private boolean isMtom = false;


	/**
	 * Constructor que rep el path de la petició a enviar a la pci, i encarna l'xml
	 * @param requestPath
	 * @throws Exception 
	 */
	public PCIPeticio(String requestPath) throws Exception{

		// encarnem el xml a partir del path on es troba la petició
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		dbf.setNamespaceAware(true);
		DocumentBuilder db;	
		db = dbf.newDocumentBuilder();
		// generem el document
		InputStream is = PCIPeticio.class.getClassLoader().getResourceAsStream(requestPath);
		if(is == null){
			is = new FileInputStream(requestPath);
		}
		Document doc = db.parse(is);
		// fem un marshalling de la petició per a poder treballar més comodament en cas d'attachments
		peticio = Util.unserializeXML(new DOMSource(doc), Peticion.class);
	}

	/**
	 * Mètode per a afegir els fitxers a la petició en format d'attachment MTOM. El paràmetre "nombreFichero"
	 * ha d'estar contingut a la petició, quan es trobi aquest nom és posarà com a contingut el del paràmetre
	 * "contenido".
	 * @param nombreFichero
	 * @param contenido
  	 *
	 * @throws IOException 
	 */
	public void addAttachement(String id, InputStream contenido) throws IOException{
		// recuperem les solicituds de transmissió
		List<SolicitudTransmision> solicitudTransmision = peticio.getSolicitudes().getSolicitudTransmision();
		
		// per a cada solicitud
		for(SolicitudTransmision sT : solicitudTransmision){
			// recuperem els <ficheros> de les dades generiques
			Ficheros files = sT.getDatosGenericos().getFicheros();
			if(files != null){
				List<Fichero> fileList = files.getFichero();
				// per a cadascun dels fitxers
				for(Fichero file : fileList){
					if(id.equals(file.getId())){
						DataSource ds = new ByteArrayDataSource(contenido, "application/octet-stream");
						file.setContenido(new DataHandler(ds));
						isMtom = true;
					}
				}
			}
		}
	}

	// GETTERS *********************************************************
	
	public Peticion getPeticio() {
		return peticio;
	}

	public boolean isMtom() {
		return isMtom;
	}
	
	
	
	
}
