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

import java.util.Date;

import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;

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.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.service.ServiceContextFactory;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.util.bridges.mvc.ActionCommand;

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.util.EmailUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.util.GestaoMensagensUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.workflow.AcaoWorkflowEnum;
import br.mp.mprj.portal.portlet.gestaomensagens.workflow.StatusWorkflowEnum;
import br.mp.mprj.portal.portlet.gestaomensagens.workflow.WorkflowUtil;


/**
 * Classe Controller do fluxo do workflow de mensagem.
 * @author caiello
 *
 */
public class MensagemWorkFlowActionCommand  implements ActionCommand {

	private static final Log _log = LogFactoryUtil.getLog(MensagemWorkFlowActionCommand.class);

	@Override
	public boolean processCommand(PortletRequest portletRequest,
			PortletResponse portletResponse) throws PortletException {
	
		String acao = ParamUtil.getString(portletRequest, "acao");
		
		try {
			if (AcaoWorkflowEnum.APROVAR.toString().equals(acao)) {
				processarWorkflowMensagem(portletRequest, AcaoWorkflowEnum.APROVAR.toString());
				SessionMessages.add(portletRequest, "mensagem.sucesso-aprovar");
			} else if (AcaoWorkflowEnum.CANCELAR.toString().equals(acao)) {
				processarWorkflowMensagem(portletRequest, AcaoWorkflowEnum.CANCELAR.toString());
				SessionMessages.add(portletRequest, "mensagem.sucesso-cancelar");
			} else if (AcaoWorkflowEnum.REPROVAR.toString().equals(acao)) {
				processarWorkflowMensagem(portletRequest, AcaoWorkflowEnum.REPROVAR.toString());
				SessionMessages.add(portletRequest, "mensagem.sucesso-reprovar");
			}
			
			Thread.sleep(3000);
			return true;
		}
		catch (PortletException | InterruptedException ex) {
			_log.error("Problemas ao gravar workflow da mensagem: ", ex);
			SessionErrors.add(portletRequest, "mensagem.erro-workflow");
			GestaoMensagensUtil.descartarRascunhos(portletRequest);
			return true;
		}
	}
	
	private void processarWorkflowMensagem(PortletRequest portletRequest, String acao)
			throws PortletException {
		try {
			ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);

			long mensagemId = ParamUtil.getLong(portletRequest, "mensagemId");
			
			Mensagem mensagem = MensagemLocalServiceUtil.getMensagem(mensagemId);
			
			if (AcaoWorkflowEnum.APROVAR.toString().equals(acao)){
				mensagem.setPrioridade(ParamUtil.getInteger(portletRequest, "prioridadeId"));
				mensagem.setStatusWorkflow(StatusWorkflowEnum.APROVADO.getStatus());
				mensagem.setUserIdAprovador(themeDisplay.getUserId());
			} else if (AcaoWorkflowEnum.REPROVAR.toString().equals(acao)) {
				mensagem.setStatusWorkflow(StatusWorkflowEnum.PENDENTE_REVISAO.getStatus());
				mensagem.setUserIdReprovador(themeDisplay.getUserId());
			} else if (AcaoWorkflowEnum.CANCELAR.toString().equals(acao)) {
				try {
					mensagem.setAtivo(false);
					mensagem.setUserIdCancel(themeDisplay.getUserId());
					mensagem.setStatusWorkflow(StatusWorkflowEnum.CANCELADO.getStatus());
					mensagem.setDataCancel(new Date());
					MensagemLocalServiceUtil.cancelarMensagem(mensagemId);
				} catch (SystemException e) {
					GestaoMensagensUtil.descartarRascunhos(portletRequest);
					throw new PortletException(e);
				} catch (PortalException e) {
					GestaoMensagensUtil.descartarRascunhos(portletRequest);
					throw new PortletException(e);
				}
			}
			
			mensagem.setComentarioWorkflow(ParamUtil.getString(portletRequest, "motivo"));
			
			if (ParamUtil.getString(portletRequest, "conteudo") != null && !"".equals(ParamUtil.getString(portletRequest, "conteudo"))){
				mensagem.setConteudo(EmailUtil.definirUrlAbsoluta(portletRequest, ParamUtil.getString(portletRequest, "conteudo")));
			}
			
			MensagemLocalServiceUtil.updateMensagem(mensagem);
			
			WorkflowUtil.atualizarStatusWorkflow(mensagem, 
												AcaoWorkflowEnum.getAcao(acao), 
												mensagem.getComentarioWorkflow(), 
												themeDisplay.getUserId(),
												ServiceContextFactory.getInstance(portletRequest));
		}
		catch (PortalException|SystemException ex) {
			GestaoMensagensUtil.descartarRascunhos(portletRequest);
			throw new PortletException(ex);
		}
	}

}
