package br.mp.mprj.portal.portlet.gestaomensagens.service.service.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import br.mp.mprj.portal.portlet.gestaomensagens.enums.SituacaoEnvioEnum;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.Agendamento;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.Mensagem;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.base.MensagemServiceBaseImpl;
import br.mp.mprj.portal.portlet.gestaomensagens.workflow.StatusWorkflowEnum;
import br.mp.mprj.portal.portlet.gestaomensagens.ws.vo.MensagemRetorno;

import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.jsonwebservice.JSONWebService;
import com.liferay.portal.model.User;
import com.liferay.portal.util.PortalUtil;

/**
 * The implementation of the mensagem remote service.
 *
 * <p>
 * All custom service methods should be put in this class. Whenever methods are added, rerun ServiceBuilder to copy their definitions into the {@link br.mp.mprj.portal.portlet.gestaomensagens.service.service.MensagemService} interface.
 *
 * <p>
 * This is a remote service. Methods of this service are expected to have security checks based on the propagated JAAS credentials because this service can be accessed remotely.
 * </p>
 *
 * @author Henrique Simoes
 * @see br.mp.mprj.portal.portlet.gestaomensagens.service.service.base.MensagemServiceBaseImpl
 * @see br.mp.mprj.portal.portlet.gestaomensagens.service.service.MensagemServiceUtil
 */
public class MensagemServiceImpl extends MensagemServiceBaseImpl {
    /*
     * NOTE FOR DEVELOPERS:
     *
     * Never reference this interface directly. Always use {@link br.mp.mprj.portal.portlet.gestaomensagens.service.service.MensagemServiceUtil} to access the mensagem remote service.
     */
	 private final String HTML_LITERAL_AGENDAMENTO = "<strong>A mensagem foi configurada para ser enviada imediatamente.</strong>";
	
	/**
	 * Servico responsavel por criar e enviar uma mensagem.
	 * @param assunto - Assunto da mensagem.
	 * @param conteudo - HTML ou texto da mensagem.
	 * @param nomeSolicitante - Nome do responsavel pela solicitacao da mensagem.
	 * @param emailSolicitante - Email do solicitante.
	 * @param contaDeSaidaId - Indetificador da Conta de Saida.
	 * @param prioridade - Prioridade da Mensagem.
	 * @param listaDestinatarioIds - Identificadores das listas de Destinatarios.
	 * @param userId - Identificador do usuario no Liferay.
	 * @param groupId - Identificador do Grupo do Usuario no Liferay.
	 * @param companyId - Identificador da Empresa no Liferay.
	 * @throws SystemException - Em caso de falha.
	 * Url de chamada do envia-mensagem WS : http://servidor/api/jsonws/invoke
	 */
	@JSONWebService(value = "envia-mensagem", method = "POST")
	public MensagemRetorno enviaMensagem(
			String assunto,
			String conteudo,
			String nomeSolicitante , 
			String emailSolicitante,
			//long templateId,
			long contaDeSaidaId,
			int prioridade,
			String listaDestinatarioIds, 
			String dataHoraEnvio /* dd/MM/yyyy HH:mm*/
			){
		
		
		MensagemRetorno wsReturn = new MensagemRetorno();
		SimpleDateFormat dataFormat = new SimpleDateFormat("ddMMyyyyHHmm");
		
		if (!mensagemValida(assunto, conteudo, nomeSolicitante, emailSolicitante, contaDeSaidaId, listaDestinatarioIds, dataHoraEnvio 
				)){
			wsReturn.setError("[Gestão de Mensagens] - Favor informar todos os parâmetros para o envio da mensagem.");
		}
		
		try {
			long [] userInfo = getUserInfo(emailSolicitante);
			
			//Criando uma nova mensagem
			final Mensagem mensagem = mensagemPersistence.create(CounterLocalServiceUtil.increment());
			
			//Configurando uma nova mensagem a partir dos parametros recebidos
			mensagem.setUserIdCriador(userInfo[2]);
			mensagem.setGroupId(userInfo[1]);
			mensagem.setCompanyId(userInfo[0]);
			mensagem.setRascunho(false);
			mensagem.setSituacaoEnvio(0);
			mensagem.setDataSolicitacao(new Date());
			mensagem.setAtivo(true);
			mensagem.setNomeSolicitante(nomeSolicitante);
			mensagem.setAssunto(assunto);
			mensagem.setConteudo(conteudo);
			//mensagem.setTemplateId(templateId);
			mensagem.setContaSaidaId(contaDeSaidaId);
			mensagem.setGrupoDestinatarioIds(listaDestinatarioIds.replaceAll("-", " "));
			mensagem.setNomeSolicitante(nomeSolicitante);
			mensagem.setPrioridade(prioridade);
			mensagem.setService(true);
			
			//Essa mensagem ja se encontra aprovada por padrao 
			mensagem.setStatusWorkflow(StatusWorkflowEnum.APROVADO.getStatus());
			mensagem.setLiteralAgendamento(HTML_LITERAL_AGENDAMENTO);
			
			//Atualiza a mensagem
			mensagemPersistence.update(mensagem);
			
			String [] datasEnvio = dataHoraEnvio.split("-");
			
			for (int d = 0 ; d < datasEnvio.length ; d++){
				
				//Cria uma novo Agendamento configurado para envio imediato
				Agendamento agendamento = agendamentoPersistence.create(CounterLocalServiceUtil.increment());
				agendamento.setMensagemId(mensagem.getMensagemId());
				agendamento.setDataInicio(dataFormat.parse(datasEnvio[d]));
							
				agendamento.setGroupId(userInfo[1]);
				agendamento.setCompanyId(userInfo[0]);
				agendamento.setSituacaoEnvio(SituacaoEnvioEnum.PENDENTE.ordinal()); 
			
				//Atualiza o Agendamento
				agendamentoPersistence.update(agendamento);
			}
			
			wsReturn.setMensagemId(String.valueOf(mensagem.getMensagemId()));
			wsReturn.setAssunto(mensagem.getAssunto());
			wsReturn.setSucesso("O envio da mensagem foi agendado com sucesso.");
			
		} catch (SystemException | ParseException | PortalException e) {
			wsReturn.setError("[Gestão de Mensagens] - Ocorreu uma falha inexperada -> " + e);
		}
		
		return wsReturn;
			
	}
	
	private boolean mensagemValida(String assunto,
			String conteudo,
			String nomeSolicitante , 
			String emailSolicitante,
			long contaDeSaidaId,
			String listaDestinatarioIds, 
			String dataHoraEnvio){
		
		boolean mensagemValida = true;
		
		if ("".equals(assunto) || "".equals(conteudo) || "".equals(nomeSolicitante) || "".equals(emailSolicitante) 
				|| "".equals(listaDestinatarioIds)  || "".equals(dataHoraEnvio)
			|| contaDeSaidaId == 0){
			mensagemValida = false;
		}
		
		
		return mensagemValida;
	}
	
	
	private  long [] getUserInfo(String emailSolicitante)
			  throws PortalException, SystemException {
		
		  long [] userInfo = new long[3];
		
		  User user = userLocalService.getUserByEmailAddress(PortalUtil.getDefaultCompanyId(), emailSolicitante);
		  
		  userInfo[0] = PortalUtil.getDefaultCompanyId();
		  userInfo[1] = user.getGroupIds()[0];
		  userInfo[2] = user.getUserId();
		  
		  return userInfo;
		 
		}
}
