package es.ejie.frmk.infraestructura.sms;

import java.io.Serializable;
import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;

import org.w3c.dom.Document;

import es.ejie.frmk.Q70Factoria;
import es.ejie.frmk.infraestructura.seguridad.Q70GestorSeguridad;
import es.ejie.frmk.infraestructura.traza.Q70TraceLevel;
import es.ejie.frmk.infraestructura.traza.Q70TrazaInterface;
import es.ejie.frmk.infraestructura.utilidades.xml.Q70UtilidadesXML;

/**
 * Clase base que representa una petición de envío de mensajes SMS.
 * Los atributos de la clase son:
 * <ul>
 * <li>Lista de Mensajes enviados en la petición </li>
 * <li>Pasarela de envío de SMS (URL). Si no se establece un valor, por defecto, se usará el valor definido en el 
 *     fichero de configuración del componente </li>
 * <li>Tipo de usuario que realiza la petición. 0 en caso de ser un cliente normal. 1 en case de ser una aplicación.
 *     Por defecto es 0. </li>
 * <li>Nombre del usuario emisor del mensaje. </li>
 * <li>Dirección de correo electrónico del emisor. Obligatorio en caso de tratarse de un usuario tipo 0. </li>
 * <li>n38sesion es una cadena XML que representa la sesión N38 de usuario. </l>
 * </ul>
 * @version 2.0   Fecha: 07-jun-06
 */
public class Q70SMSPeticion implements Serializable {
	
	private ArrayList listaMensajes=new ArrayList();
	private String urlPasarelaSMS=null;
	private Integer tipoRemitente=new Integer(0);
	private String nombreRemitente=null;
	private String mailRemitente = null;
	private String n38Sesion = null;
	
	/**
	 * Constructor de clase
	 */
	public Q70SMSPeticion() 
	{
		super();
	}

	/**
	 * Constructor de clase. Se inicializa con un mensaje a enviar y el nombre del remitente
	 * @param smsMessage
	 * @param nombreRemitente
	 */
	public Q70SMSPeticion (Q70SMSMessage smsMessage, String nombreRemitente)
	{
		this.addMensaje(smsMessage);
		this.nombreRemitente = nombreRemitente;
	}
	
	/**
	 * Constructor de clase. Se inicializa con una lista de mensajes a enviar y el nombre del remitente
	 * @param listaMensajes
	 * @param nombreRemitente
	 */
	public Q70SMSPeticion(ArrayList listaMensajes,String nombreRemitente) {
		this.listaMensajes = listaMensajes;
		this.nombreRemitente = nombreRemitente;
		
	}
	
	/**
	 * @return mail remitente
	 */
	public String getMailRemitente() {
		return mailRemitente;
	}
	
	/**
	 * @param mailRemitente
	 */
	public void setMailRemitente(String mailRemitente) {
		this.mailRemitente = mailRemitente;
	}
	
	/**
	 * @return nombre de remitente
	 */
	public String getNombreRemitente() {
		return nombreRemitente;
	}
	
	/**
	 * @param nombreRemitente
	 */
	public void setNombreRemitente(String nombreRemitente) {
		this.nombreRemitente = nombreRemitente;
	}

	/**
	 * @return URL pasarela SMS
	 */
	public String getUrlPasarelaSMS() {
		return urlPasarelaSMS;
	}
	
	/**
	 * @param urlPasarelaSMS
	 */
	public void setUrlPasarelaSMS(String urlPasarelaSMS) {
		this.urlPasarelaSMS = urlPasarelaSMS;
	}
	
	/**
	 * @param message
	 */
	public void addMensaje (Q70SMSMessage message) {
		this.listaMensajes.add(message);
	}

	/**
	 * @return lista mensajes
	 */
	public ArrayList getAllMensajes () {
		return this.listaMensajes;
	}

	/**
	 * Borrar la lista de mensajes
	 */
	public void removeAllMensajes() {
		this.listaMensajes.clear();
	}
	
	/**
	 * Configuracion de la sesion N38. Se coge como tipo de remitente el por defecto, el del cliente.
	 * @param request
	 * @throws Q70SMSException
	 */
	public void setN38Sesion(HttpServletRequest request) throws Q70SMSException {
		setN38Sesion(Q70Constantes.REMITENTE_NORMAL, request);
	}
	
	/**
	 * Configuracion de la sesion N38
	 * @param tipoRemitente
	 * @param request
	 * @throws Q70SMSException
	 */
	public void setN38Sesion(Integer tipoRemitente, HttpServletRequest request) throws Q70SMSException {
		Q70TrazaInterface traza = Q70Factoria.getTraza();
		if (Q70Constantes.REMITENTE_NORMAL.equals(tipoRemitente)) {
			this.setTipoRemitente(tipoRemitente);
			try {
				Document document = Q70GestorSeguridad.getSingleton().getSecurityUserDocument(request);
				this.n38Sesion = Q70UtilidadesXML.documentToString(document);
			} catch (Exception e) {
				if (traza.isTraceActive()) {
					traza.trace(Q70Constantes.ID_COMPONENTE, Q70TraceLevel.ERROR, "ERROR al leer el XML de seguridad de usuario de XL-Nets.");
				}					
				throw new Q70SMSException (this.getClass().getName(), "setN38Sesion", "ERROR al leer XML de seguridad de usuario de XL-Nets.", e);
			}
		} else if (Q70Constantes.REMITENTE_APLICACION.equals(tipoRemitente)) {
			this.setTipoRemitente(tipoRemitente);
			try {
				Document document = Q70GestorSeguridad.getSingleton().getSecurityApplicationDocument(request);
				this.n38Sesion = Q70UtilidadesXML.documentToString(document);
			} catch (Exception e) {
				if (traza.isTraceActive()) {
					traza.trace(Q70Constantes.ID_COMPONENTE, Q70TraceLevel.ERROR, "ERROR al leer el XML de seguridad de aplicación de XL-Nets.");
				}					
				throw new Q70SMSException (this.getClass().getName(), "setN38Sesion", "ERROR al leer XML de seguridad de aplicación de XL-Nets.", e);
			}
		}
	}

	/**
	 * @return Returns the n38Sesion.
	 */
	public String getN38Sesion() {
		return n38Sesion;
	}

	/**
	 * @return tipoRemitente.
	 */
	public Integer getTipoRemitente() {
		return tipoRemitente;
	}

	/**
	 * @param tipo de remitente
	 */
	protected void setTipoRemitente(Integer tipoRemitente) {
		this.tipoRemitente = tipoRemitente;
	}
}
