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

import java.io.Serializable;
import java.util.Date;
import java.util.Locale;
import java.util.Map;

import br.mp.mprj.portal.portlet.gestaomensagens.email.EnvioEmailMensagem;
import br.mp.mprj.portal.portlet.gestaomensagens.email.EnvioEmailWorkflow;
import br.mp.mprj.portal.portlet.gestaomensagens.enums.TipoEnvioEnum;
import br.mp.mprj.portal.portlet.gestaomensagens.job.AgendamentoJobUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.Mensagem;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.MensagemLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.MensagemWorkflowLocalServiceUtil;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.workflow.BaseWorkflowHandler;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.service.ServiceContext;
import com.liferay.util.portlet.PortletProps;

public class MensagemWorkflowHandler extends BaseWorkflowHandler {

	private static final Log _log = LogFactoryUtil.getLog(MensagemWorkflowHandler.class);
	
	private final String TYPE = "Mensagens";
	
	@Override
	public String getClassName() {
		return Mensagem.class.getName();
	}

	@Override
	public String getType(Locale locale) {
		return TYPE;
	}

	@Override
	public Object updateStatus(int status,
			Map<String, Serializable> workflowContext) throws PortalException,
			SystemException {
		
		long userId = GetterUtil.getLong(workflowContext.get(WorkflowConstants.CONTEXT_USER_ID));
		
		long resourcePrimKey = GetterUtil.getLong(workflowContext.get(WorkflowConstants.CONTEXT_ENTRY_CLASS_PK));
		
		Mensagem mensagem = MensagemLocalServiceUtil.getMensagem(resourcePrimKey);
		mensagem.setStatusWorkflow(status);
		mensagem.setUserIdWorkflow(userId);
		mensagem.setDataStatusWorkflow(new Date());
		mensagem.setComentarioWorkflow(GetterUtil.getString(workflowContext.get(WorkflowConstants.CONTEXT_TASK_COMMENTS)));
		
		mensagem = MensagemLocalServiceUtil.updateMensagem(mensagem);
		
		MensagemWorkflowLocalServiceUtil.gravarHistoricoWorkflow(mensagem);
		
		//se foi reprovado, colocar novamente para revisao
		if (status == WorkflowConstants.STATUS_DENIED) {
			try {
				ServiceContext serviceContext = (ServiceContext)workflowContext.get(WorkflowConstants.CONTEXT_SERVICE_CONTEXT);
				
				WorkflowUtil.atualizarStatusWorkflow(mensagem, AcaoWorkflowEnum.REVISAR, 
						GetterUtil.getString(PortletProps.get("workflow.texto-padrao.revisao")), userId, 
						serviceContext);

				WorkflowUtil.inicializarWorkflowMensagem(mensagem, serviceContext);
			
			}
			catch (Exception ex) {
				_log.error("Problemas ao definir revisao:", ex);
			}
		}
		
		//envio de email
		if (status == WorkflowConstants.STATUS_DENIED 
				|| status == WorkflowConstants.STATUS_APPROVED
				|| status == WorkflowConstants.STATUS_INACTIVE) {
			try {
				//enviar notificacao de mensagem aprovada
				EnvioEmailMensagem envio = new EnvioEmailWorkflow(mensagem);
				envio.enviarEmail(0);
				
				//enviar e-mail para os destinatarios, caso seja de envio imediato
				if (status == WorkflowConstants.STATUS_APPROVED 
						&& mensagem.getTipoEnvio() == TipoEnvioEnum.IMEDIATO.ordinal()) {
					AgendamentoJobUtil.enviaMensagemImediato(mensagem.getMensagemId());
				}
			}
			catch (Exception ex) {
				_log.error("Problemas ao enviar e-mail do status do workflow:", ex);
			}
		}
		
		return mensagem;
	}
	
	@Override
	public String getTitle(long classPK, Locale locale) {
		String titlePadrao = super.getTitle(classPK, locale);
		if (Validator.isNull(titlePadrao)) {
			try {
				return MensagemLocalServiceUtil.getMensagem(classPK).getAssunto();
			}
			catch (PortalException|SystemException ex) {
				return StringPool.BLANK;
			}
		}
		return titlePadrao;
	}
	
	@Override
	public void startWorkflowInstance(long companyId, long groupId,
			long userId, long classPK, Object model,
			Map<String, Serializable> workflowContext) throws PortalException,
			SystemException {

		super.startWorkflowInstance(companyId, groupId, userId, classPK, model,
				workflowContext);

		/*try {
			WorkflowUtil.atribuirWorkflowRole(Mensagem.class.getName(), companyId, 
					groupId, classPK, 
					userId, WorkflowUtil.getWorkflowRoleId(companyId),
					GetterUtil.getString(PortletProps.get("workflow.texto-padrao.atribuicao.role")));		
		}
		catch (Exception ex) {
			_log.error("Problemas ao inicializar o workflow da Mensagem ID: " + classPK, ex);
		}*/
	}

}
