package br.mp.mprj.portal.portlet.gestaomensagens.email;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

import br.mp.mprj.portal.portlet.gestaomensagens.service.model.AnexoMensagem;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.EmailDestinatario;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.GrupoDestinatario;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.Mensagem;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.AnexoMensagemLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.EmailDestinatarioLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.GrupoDestinatarioLocalServiceUtil;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.GetterUtil;

/**
 * Classe que tem como finalidade em enviar os emails agendados.
 */
public class EnvioEmailAgendado extends EnvioEmailMensagem{

	public EnvioEmailAgendado(Mensagem mensagem) {
		super(mensagem);
	}

	@Override
	protected InternetAddress getRemetente() throws PortalException,
			SystemException, AddressException, UnsupportedEncodingException {
		 
		 final EmailDestinatario contaSaida = getContaSaida();
		 if (contaSaida == null) return null;
		
		 final InternetAddress address = new InternetAddress(contaSaida.getEmail());
		 final GrupoDestinatario grupoDestinatario = GrupoDestinatarioLocalServiceUtil.getGrupoDestinatario(contaSaida.getGrupoDestinatarioId());
		
		if (grupoDestinatario != null && grupoDestinatario.getNome() != null && !"".equals(grupoDestinatario.getNome())) {
			address.setPersonal(grupoDestinatario.getNome());
		}
		
		return address;
	}

	@Override
	protected InternetAddress[] getDestinatarios() throws PortalException,
			SystemException, AddressException {
		
		final List<EmailDestinatario> emailsDestinatarios = getEmailsDestinatarios();
		if (emailsDestinatarios == null || emailsDestinatarios.size() == 0) return null;
		final InternetAddress[] enderecoEmailsDestinatarios = new InternetAddress[emailsDestinatarios.size()];
		
		for (int i = 0 ; i < emailsDestinatarios.size(); i++){
			enderecoEmailsDestinatarios[i] =  new InternetAddress(emailsDestinatarios.get(i).getEmail());
		}
			
		return enderecoEmailsDestinatarios;
	}
	
	/**
	 * Metodo responsavel pelo retorno da conta remetente do Grupo de Envio.
	 * @return GrupoDestinatario - retorna uma conta de envio.
	 * @throws PortalException - Em caso de falha.
	 * @throws SystemException - Em caso de falha.
	 */
	private EmailDestinatario getContaSaida() throws PortalException, SystemException{
		
		final List<EmailDestinatario> emails = EmailDestinatarioLocalServiceUtil.findByGrupoDestinatarioId(mensagem.getContaSaidaId());
		if (emails == null  || emails.size() == 0) return null;
		
		return emails.get(0);
	}
	
	/**
	 * Metodo resposnavel pelo retorno dos emails de destino do Grupo de Envio.
	 * @return List<EmailDestinatario> - retorna uma lista com os emails de destino.
	 * @throws SystemException - Em caso de falha.
	 */
	private List<EmailDestinatario> getEmailsDestinatarios() throws SystemException{
		
		final long[] grupoDestinatarioIds = GetterUtil.getLongValues(mensagem.getGrupoDestinatarioIds().split("\\s"));
		final List<EmailDestinatario> destinatarios = new ArrayList<EmailDestinatario>();
		List<EmailDestinatario> emails = null;
			
		for (long id : grupoDestinatarioIds) {
		    emails = EmailDestinatarioLocalServiceUtil.findByGrupoDestinatarioId(id);
			destinatarios.addAll( destinatarios.size() == 0 ? 0 : destinatarios.size() - 1 , emails);
		}
		
		return destinatarios;
	}

	@Override
	protected List<AnexoMensagem> getAnexos(long mensagemId)  throws SystemException{
		return AnexoMensagemLocalServiceUtil.recuperaAnexosPorMensagem(mensagemId);
	}


}
