package com.ejie.ab39a.util;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ejie.ab39a.model.MailModel;
import com.ejie.ab39a.service.PlanEstrategicoServiceImpl;

/**
 * Agrupa utilidades genericas.
 * 
 *  
 * 
 */
public class Utilidades {
	
	private static final Logger logger= LoggerFactory.getLogger(PlanEstrategicoServiceImpl.class); 
	
	
	private static String mailhost=null;
	private static String sender=null;
	private static String protocolo=null;
	private static String requiereAutorizacion=null;
	private static String puerto=null;
	
	
	
	
	
	static{
		Utilidades.mailhost = PropertiesUtil.getProperty(Constantes.MAILHOST);
		Utilidades.sender = PropertiesUtil.getProperty(Constantes.SENDER);
		Utilidades.protocolo = PropertiesUtil.getProperty(Constantes.PROTOCOLO_MAIL);
		Utilidades.requiereAutorizacion = PropertiesUtil.getProperty(Constantes.REQUIERE_AUTORIZACION);
		Utilidades.puerto = PropertiesUtil.getProperty(Constantes.PUERTO);
		
		
	}
	
	/**
	 * Contructor privado
	 */
	private Utilidades() {
		
	}
	
	/**
	 * Devuelve true en caso de que la cadena sea: <li><b>null</b></li><li>
	 * <b>length == 0</b></li>.<br>
	 * 
	 * @param cadena
	 *            String
	 * @return Boolean
	 */
	public static Boolean isEmpty(String cadena) {
		return cadena == null || cadena.trim().length() == 0;
	}

	/**
	 * Devuelve el string pasado con el Translate(UPPER()))) pero en java
	 * 
	 * @param texto
	 *            String
	 * @return String
	 */
	public static String upperTranslateString(String texto) {
		return Utilidades.isEmpty(texto) ? texto : texto.toUpperCase()
				.replaceAll("\u00c1", "A").replaceAll("\u00c9", "E")
				.replaceAll("\u00cd", "I").replaceAll("\u00d3", "O")
				.replaceAll("\u00da", "U").replaceAll("\u00dc", "U");
	}
	
	
	/**
     * Envia un mensaje de correo electronico
     * @param host servidor de correo
     * @param from remitente
     * @param to destinatario
     * @param subject asunto
     * @param bodyText texto del mensaje
     * @throws P16Exception en caso de que se produzca un error al enviar el mensaje
     */
     public static void sendEmail(MailModel model) throws Exception{
    	 Utilidades.logger.debug("Entrando en envio de correo");
 			String from = Utilidades.sender;
            String to = model.getDestinatario();
            String subject = model.getAsuntoFormateado();
            String bodyText =model.getMensajeFormateado();
            boolean bmasDe1Destinatario=false;
            
           
            // Get system properties
            Properties props = System.getProperties();
            // Setup mail server
            props.put("mail.smtp.host", Utilidades.mailhost);
            props.put("mail.host", Utilidades.mailhost);
           

            props.put("mail.transport.protocol", Utilidades.protocolo);
            props.put("mail.smtp.port", Utilidades.puerto);
            props.put("mail.smtp.mail.sender", from);
            props.put("mail.smtp.auth", Utilidades.requiereAutorizacion);
            
            
            Utilidades.logger.debug("Envio de correo: propiedades asignadas");
            // si hay mas de un destinatario hay que enviar mas de un recipient
            if (to!=null && to.trim().length()>0 && to.indexOf(",")>0 ){
                  bmasDe1Destinatario=true;
            }
           
            // Get session
            Session session = Session.getInstance(props);
            // Define message
            MimeMessage message = new MimeMessage(session);
            try{
                message.setFrom(new InternetAddress(from));
                if (!bmasDe1Destinatario){
                      message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
                }else{
                      String[] listaTo = to.split(",");
                      for (int i =0; i<listaTo.length;i++){
                          message.addRecipient(Message.RecipientType.TO,new InternetAddress(listaTo[i]));
                      }
                }
                Utilidades.logger.debug("Envio de correo: destinatarios incluidos");
                               
                message.setSubject(subject); 
                message.setContent(bodyText, "text/html");
                // Send message
                Transport.send(message);
                Utilidades.logger.debug("Enviado correo");
            } catch (MessagingException me){
                   throw new Exception("No se ha podido enviar el mensaje de correo electronico", me);
            }
     }
	
}
