package es.ejie.frmk.infraestructura.mail;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;

import javax.activation.DataSource;

/**
 * Representación conceptual de un fichero adjunto o incrustado (en HTML) en un
 * email. En el caso de ficheros adjuntos, el identificador del fichero se
 * representará con el nombre del fichero y la extensión. Para ficheros
 * incrustados se representara con el cid (identificativo del contenido). El
 * contenido del fichero sera representado mediante bytes.
 * @version 2.0 Fecha: 22-mar-06
 */
public class Q70MailFile implements Serializable, DataSource {

	private String idFichero;
	private byte[] contenidoFichero;
	private String contentType;

	/**
	 * Constructor de la clase Q70MailFile que asigna el nombre, tipo de
	 * fichero y su contenido.
	 * @param idFichero Identificativo del fichero
	 * @param contenidoFichero 
	 * @param contentType
	 */
	public Q70MailFile(String idFichero, byte[] contenidoFichero, String contentType) {
		super();
		setName(idFichero);
		setContenidoFichero(contenidoFichero);
		setContentType(contentType);
	}

	/**
	 * Constructor de la clase Q70MailFile que asigna el nombre, tipo de
	 * fichero y su contenido.
	 * Si el contenido viene en InputStream lo transforma en bytes;
	 * @param idFichero Identificativo del fichero
	 * @param fileInputStream
	 * @param contentType
	 * @throws IOException 
	 */
	public Q70MailFile(String idFichero, InputStream fileInputStream, String contentType) throws IOException {
		super();
		setName(idFichero);
		setContentType(contentType);
		setContenidoFichero(inputStreamToByte(fileInputStream));
	}

	/**
	 * Transforma un InputStream a un vector de bytes
	 * @param fileInputStream
	 * @return bytes[]
	 * @throws IOException
	 */
	private byte[] inputStreamToByte(InputStream fileInputStream) throws IOException {

		InputStream lectura = new BufferedInputStream(fileInputStream);
		ByteArrayOutputStream salida = new ByteArrayOutputStream();

		int finArchivo = -1;
		byte[] buffer = null;
		if (lectura.available() == 0) {
			buffer = new byte[1024];
		} else {
			buffer = new byte[lectura.available()];
		}

		// Cargamos los bytes recibidos
		while (lectura.read(buffer) != finArchivo) {
			salida.write(buffer);
		}
		lectura.close();
		salida.flush();
		salida.close();

		return salida.toByteArray();
	}

	/**
	 * @return InputStream
	 */
	public InputStream getInputStream() {
		return new ByteArrayInputStream(contenidoFichero);
	}

	/**
	 * @return null
	 */
	public OutputStream getOutputStream() {
		return null;
	}

	/**
	 * @return idFichero
	 */
	public String getName() {
		return idFichero;
	}

	/**
	 * @param idFichero
	 */
	public void setName(String idFichero) {
		this.idFichero = idFichero;
	}

	/**
	 * @param contenidoFichero
	 */
	public void setContenidoFichero(byte[] contenidoFichero) {
		this.contenidoFichero = contenidoFichero;
	}

	/**
	 * @return contenidoFichero
	 */
	public byte[] getContenidoFichero() {
		return contenidoFichero;
	}

	/**
	 * @param contentType
	 */
	public void setContentType(String contentType) {
		this.contentType = contentType;
	}

	/**
	 * @return contentType
	 */
	public String getContentType() {
		return contentType;
	}
}
