
package br.mp.mprj.portal.portlet.gestaomensagens.email;

import com.liferay.portal.kernel.log.LogFactoryUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.workflow.StatusWorkflowEnum;
import br.mp.mprj.portal.portlet.gestaomensagens.enums.EstiloTemplateEnum;
import com.liferay.portal.kernel.util.StringBundler;
import javax.mail.internet.InternetAddress;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.liferay.portal.model.User;
import java.io.UnsupportedEncodingException;
import javax.mail.internet.AddressException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.exception.PortalException;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import com.liferay.mail.service.MailServiceUtil;
import com.liferay.mail.model.FileAttachment;
import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.AnexoMensagem;
import com.liferay.portal.kernel.mail.MailMessage;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.TemplateLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.Template;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.Mensagem;
import com.liferay.portal.kernel.log.Log;

public abstract class EnvioEmailMensagem
{
    private static final Log _log;
    protected final Mensagem mensagem;
    private Template template;
    
    public EnvioEmailMensagem(final Mensagem mensagem) {
        this.mensagem = mensagem;
        try {
            if (mensagem.getTemplateId() > 0L) {
                this.template = TemplateLocalServiceUtil.getTemplate(mensagem.getTemplateId());
            }
        }
        catch (Exception ex) {
            EnvioEmailMensagem._log.error((Object)"Problemas ao inicializar envio de Email", (Throwable)ex);
        }
    }
    
    public void enviarEmail(final int tipoEnvio) throws PortalException, SystemException, AddressException, UnsupportedEncodingException {
        final MailMessage mail = new MailMessage();
        mail.setHTMLFormat(true);
        mail.setFrom(this.getRemetente());
        final List<AnexoMensagem> anexos = this.getAnexos(this.mensagem.getMensagemId());
        if (anexos != null && anexos.size() > 0) {
            for (final AnexoMensagem anexo : anexos) {
                final File file = DLFileEntryLocalServiceUtil.getFile(anexo.getUserId(), anexo.getAnexoFileEntryId(), anexo.getVersao(), false);
                final FileAttachment fileAttachment = new FileAttachment(file, anexo.getFileName());
                mail.getFileAttachments().add(fileAttachment);
            }
        }
        mail.setBCC(this.getDestinatarios());
        mail.setSubject(this.getAssuntoEmail(tipoEnvio));
        mail.setBody(this.getHtmlCompleto());
        MailServiceUtil.sendEmail(mail);
    }
    
    protected User getUserCriador() throws PortalException, SystemException {
        return UserLocalServiceUtil.getUser(this.mensagem.getUserIdCriador());
    }
    
    protected abstract InternetAddress getRemetente() throws PortalException, SystemException, AddressException, UnsupportedEncodingException;
    
    protected abstract InternetAddress[] getDestinatarios() throws PortalException, SystemException, AddressException, UnsupportedEncodingException;
    
    protected abstract List<AnexoMensagem> getAnexos(final long p0) throws SystemException;
    
    protected String getHtmlCompleto() {
        final StringBundler sbHTML = new StringBundler();
        if (this.template != null) {
            if (this.template.getEstilo() == EstiloTemplateEnum.CABECALHO_RODAPE.getEstiloId()) {
                sbHTML.append(this.template.getCabecalho());
                sbHTML.append(this.mensagem.getConteudo());
                sbHTML.append(this.template.getRodape());
            }
            else {
                sbHTML.append(this.mensagem.getConteudo());
            }
        }
        else {
            sbHTML.append(this.mensagem.getConteudo());
        }
        return sbHTML.toString();
    }
    
    protected String getAssuntoEmail(final int tipoEnvio) {
        final StringBuilder assunto = new StringBuilder();
        if (tipoEnvio != 2) {
            if (tipoEnvio == 1) {
                assunto.append("TESTE - ");
            }
            else {
                if (this.mensagem.getStatusWorkflow() == StatusWorkflowEnum.PENDENTE_APROVACAO.getStatus()) {
                    assunto.append("PENDENTE DE APROVAÇÃO - ");
                }
                else if (this.mensagem.getStatusWorkflow() == StatusWorkflowEnum.APROVADO.getStatus()) {
                    assunto.append("APROVADA - ");
                }
                else if (this.mensagem.getStatusWorkflow() == StatusWorkflowEnum.REPROVADO.getStatus()) {
                    assunto.append("PENDENTE DE RETIFICAÇÃO - ");
                }
                assunto.append(this.mensagem.getCodigoMensagem() + " - ");
            }
        }
        assunto.append(this.mensagem.getAssunto());
        return assunto.toString();
    }
    
    static {
        _log = LogFactoryUtil.getLog((Class)EnvioEmailMensagem.class);
    }
}