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

import java.io.IOException;
import java.io.PrintWriter;

import javax.mail.internet.AddressException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

import br.mp.mprj.portal.portlet.gestaomensagens.email.EnvioEmailTeste;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.Mensagem;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.json.JSONFactoryUtil;
import com.liferay.portal.kernel.json.JSONObject;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.util.bridges.mvc.MVCPortlet;

public class AdministracaoPortlet extends MVCPortlet {
	
	public String CHARSET_SERVICO = ContentTypes.APPLICATION_JSON + "; charset=UTF-8";
	
	@Override
	public void processAction(ActionRequest actionRequest,
			ActionResponse actionResponse) throws IOException, PortletException {
		super.processAction(actionRequest, actionResponse);
		
		//refedinir os principais parametros no retorno da requisicao com erro,
		//para exibir a pagina com formulario novamente, e nao redirecionar para outro local.
		if (!SessionErrors.isEmpty(actionRequest)) {
			String mvcPath = getPath(actionRequest);	
			if (Validator.isNotNull(mvcPath)) {
				//redefinir parametros necessarios para todos os modulos, caso esteja utilizando MvcPath
				actionResponse.setRenderParameter("rascunho", ParamUtil.getString(actionRequest, "rascunho"));
				actionResponse.setRenderParameter("mvcPath", ParamUtil.getString(actionRequest, "mvcPath"));
			}
		}else {
			sendRedirect(actionRequest, actionResponse);
		}
		
	}
	
	@Override
	public void serveResource(ResourceRequest req, ResourceResponse res) 
			throws IOException, PortletException {
		
		String resourceId = req.getResourceID();
		
		JSONObject jsonResposta = JSONFactoryUtil.createJSONObject();
		
		if (resourceId.equals("EnviarEmailMensagemTeste")) {
			Mensagem mensagem = (Mensagem)req.getPortletSession().getAttribute("mensagem");
			String emailTeste = ParamUtil.getString(req, "emailTeste");
			
			if (mensagem != null) {
				
				try {
				
					EnvioEmailTeste envio = new EnvioEmailTeste(mensagem);
					
					envio.setEmailTeste(emailTeste);
					envio.setRemetente("Teste de envio");
					envio.setDestinatario("Destinatário");
					envio.enviarEmail(1);
					jsonResposta.put("sucesso", true);
				}
				catch (AddressException adEx) {
					jsonResposta.put("mensagem", "E-mail inválido na mensagem, verifique.");
					jsonResposta.put("sucesso", false);
				}
				catch (PortalException|SystemException ex) {
					jsonResposta.put("mensagem", ex.getMessage());
					jsonResposta.put("sucesso", false);
				}
			}			
		}
		
		res.setContentType(CHARSET_SERVICO);
		
		try (PrintWriter pw = res.getWriter()) {
			pw.write(JSONFactoryUtil.looseSerialize(jsonResposta));
			pw.flush();
		}
		
	}
	
	
	/**
     * To by-pass authentication token for non-logged in user. 
     * Error: Invalid authentication token
     * @return
     */
    protected boolean isCheckMethodOnProcessAction() {
        return CHECK_METHOD_ON_PROCESS_ACTION;
    }
    private static final boolean CHECK_METHOD_ON_PROCESS_ACTION = false;
}
