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

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

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

import br.mp.mprj.portal.portlet.gestaomensagens.service.model.EmailDestinatario;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.GrupoDestinatario;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.EmailDestinatarioLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.GrupoDestinatarioLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.util.Constantes;
import br.mp.mprj.portal.portlet.gestaomensagens.util.GestaoMensagensUtil;

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.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.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.util.bridges.mvc.ActionCommand;

/**
 * Classe Controller do fluxo de inclusao de um grupo de destinatario.
 * @author caiello
 *
 */
public class GrupoDestinatarioAlterarIncluirActionCommand implements ActionCommand  {
	
	private static final Log _log = LogFactoryUtil.getLog(GrupoDestinatarioAlterarIncluirActionCommand.class);
	
	@Override
	public boolean processCommand(PortletRequest portletRequest,
			PortletResponse portletResponse) throws PortletException {
				
			try {
				
				if (!validarIntegridade(portletRequest)){
					return false;
				}
				
				ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);

				long groupId = themeDisplay.getScopeGroupId();
				long companyId = themeDisplay.getCompanyId();
				long userId = themeDisplay.getUserId();
				
				final GrupoDestinatario grupoDestinatario = loadGrupoDestinatario(userId , companyId , groupId , portletRequest);
				final List<EmailDestinatario> listaEmails = loadEmailsDestinatario(grupoDestinatario.getGrupoDestinatarioId() 
						, portletRequest);
				
				if (identificaOperacaoInclusao(portletRequest)){
					//GrupoDestinatarioLocalServiceUtil.inserirGrupoDestinatario(grupoDestinatario, listaEmails);
					
					GrupoDestinatarioLocalServiceUtil.updateGrupoDestinatario(grupoDestinatario);
					
					for (EmailDestinatario email : listaEmails){			
						EmailDestinatarioLocalServiceUtil.updateEmailDestinatario(email);
					}
					
					SessionMessages.add(portletRequest, "destinatario.sucesso-gravar");
				}else{
				//	GrupoDestinatarioLocalServiceUtil.atualizarGrupoDestinatario(grupoDestinatario, listaEmails);
					EmailDestinatarioLocalServiceUtil.removeByGrupoDestinatarioId(grupoDestinatario.getGrupoDestinatarioId());
					GrupoDestinatarioLocalServiceUtil.updateGrupoDestinatario(grupoDestinatario);
					
					for (EmailDestinatario email : listaEmails){			
						EmailDestinatarioLocalServiceUtil.updateEmailDestinatario(email);
					}
					SessionMessages.add(portletRequest, "destinatario.sucesso-atualizar");
				}
				
				Thread.sleep(3000);
				return true;			}
			catch (Exception ex) {
				_log.error("Problemas ao gravar:", ex);
				SessionErrors.add(portletRequest, "erro-gravar");;
				GestaoMensagensUtil.descartarRascunhos(portletRequest);	
				return false;
			}
		
	}
	
	private boolean identificaOperacaoInclusao(PortletRequest portletRequest){
		
		return (ParamUtil.getString(portletRequest, "grupoDestinatarioId") == null || 
				"".equals(ParamUtil.getString(portletRequest, "grupoDestinatarioId")));
	}
	
	/**
	 * Carrega a lista de emails dos destinarios
	 */
	private List<EmailDestinatario> loadEmailsDestinatario(final long grupoDestinatarioId , final PortletRequest req) throws SystemException {
		
		List<EmailDestinatario> emails = new ArrayList<EmailDestinatario>();
		
		String [] listaDestinatarios = getEmails(req);
		
		if (listaDestinatarios != null){
			
			for (String email : listaDestinatarios){
				
				EmailDestinatario emailDestinatario = EmailDestinatarioLocalServiceUtil.
						createEmailDestinatario(CounterLocalServiceUtil.increment());
				
				emailDestinatario.setGrupoDestinatarioId(grupoDestinatarioId);			
				emailDestinatario.setEmail(email);
				
				emails.add(emailDestinatario);
				
			}
		}

		return emails;
	}
	
	private String [] getEmails(final PortletRequest req){
		
		if (Validator.isNotNull(ParamUtil.getString(req, "emailDestinatariosPrimaryKeys"))){
			return ParamUtil.getParameterValues(req, "emailDestinatariosPrimaryKeys");
		}
		return null;
	}
	/** 
	 * Carrega o Grupo de Destinatario. 
	 */
	private GrupoDestinatario loadGrupoDestinatario(final long userId ,
			final long companyId,final long groupId ,final PortletRequest portletRequest) throws SystemException, PortalException{
		
		GrupoDestinatario grupoDestinatario = null;
		
		if (identificaOperacaoInclusao(portletRequest)){
			grupoDestinatario = 
					GrupoDestinatarioLocalServiceUtil.createGrupoDestinatario(CounterLocalServiceUtil.increment());
		} else {
			
			long id = Long.valueOf(ParamUtil.getString(portletRequest, "grupoDestinatarioId"));
			grupoDestinatario = GrupoDestinatarioLocalServiceUtil.getGrupoDestinatario(id);
		}
		
		grupoDestinatario.setNome(ParamUtil.getString(portletRequest, "nome"));
		grupoDestinatario.setFinalidade(ParamUtil.getString(portletRequest, "finalidade"));
		
		if (Validator.isNotNull(ParamUtil.getString(portletRequest, "userResponsaveisPrimaryKeys"))){
			grupoDestinatario.setUserIdResponsaveis(GestaoMensagensUtil.parseArrayString(portletRequest, "userResponsaveisPrimaryKeys"));
		}else {
			grupoDestinatario.setUserIdResponsaveis("");
		}
		
		
		if ("0".equals(ParamUtil.getString(portletRequest, Constantes.TIPO_LISTA))){
			
			grupoDestinatario.setTipoLista(0);
		} else if ("1".equals(ParamUtil.getString(portletRequest, Constantes.TIPO_LISTA))){
			grupoDestinatario.setTipoLista(1);
		}
		
		grupoDestinatario.setAtivo(true);
		
		if (Constantes.OPCAO_SIM.equals(ParamUtil.getString(portletRequest, Constantes.RADIO_TEMPORARIA))){
			
			grupoDestinatario.setListaTemporaria(true);
			final Calendar c = Calendar.getInstance(); 
			int dayParam = Integer.parseInt(ParamUtil.getString(portletRequest,"d1"));
			int monthParam = Integer.parseInt(ParamUtil.getString(portletRequest, "m1"));
			int yearParam = Integer.parseInt(ParamUtil.getString(portletRequest,"y1"));
			
			c.set(yearParam, monthParam, dayParam);
			
			grupoDestinatario.setDataFinalListaTemporaria(c.getTime());
		} else {
			grupoDestinatario.setListaTemporaria(false);
			grupoDestinatario.setDataFinalListaTemporaria(null);
		}
	
		if (Constantes.OPCAO_SIM.equals(ParamUtil.getString(portletRequest, Constantes.RADIO_MODERADA))){
		
			
			if (Validator.isNotNull(ParamUtil.getString(portletRequest, "userModeracaoPrimaryKeys"))){
				grupoDestinatario.setUserIdListaModerada(GestaoMensagensUtil.parseArrayString(portletRequest, "userModeracaoPrimaryKeys"));
				grupoDestinatario.setListaModerada(true);
			}else{
				grupoDestinatario.setListaModerada(false);
				grupoDestinatario.setUserIdListaModerada("");
			}
		}else{
			grupoDestinatario.setListaModerada(false);
			grupoDestinatario.setUserIdListaModerada("");
		}
		
		if (Constantes.OPCAO_SIM.equals(ParamUtil.getString(portletRequest, Constantes.RADIO_EM_NOME))){
		
			
			if (Validator.isNotNull(ParamUtil.getString(portletRequest, "userEmNomePrimaryKeys"))){
				grupoDestinatario.setUserIdNomesLista(GestaoMensagensUtil.parseArrayString(portletRequest, "userEmNomePrimaryKeys"));
				grupoDestinatario.setEnvioEmNomeLista(true);
			} else {
				grupoDestinatario.setEnvioEmNomeLista(false);
				grupoDestinatario.setUserIdNomesLista("");
			}
		} else {
			grupoDestinatario.setEnvioEmNomeLista(false);
			grupoDestinatario.setUserIdNomesLista("");
		}
						 
		grupoDestinatario.setUserId(userId);
		grupoDestinatario.setCompanyId(companyId);
		grupoDestinatario.setGroupId(groupId);
				
		return grupoDestinatario;		
	}

	
	
	/**
	 * Metodo privado responsavel em validar 
	 * a integridade das informacoes referentes
	 * ao registro de um grupo de destinatarios.
	 */
	private boolean validarIntegridade(final PortletRequest request){
		
		boolean integro = true;
		
		if (Validator.isNull(ParamUtil.getString(request, "nome"))) {
			SessionErrors.add(request, "conteudo-obrigatorio");
			integro = false;
		}
		
		if (Validator.isNull(ParamUtil.getString(request, "finalidade"))) {
			SessionErrors.add(request, "conteudo-obrigatorio");
			integro = false;
		}
		
		
		if (Validator.isNull(ParamUtil.getString(request, "emailDestinatariosPrimaryKeys"))) {
			SessionErrors.add(request, "conteudo-obrigatorio");
			integro = false;
		}
		
		
		return integro;
	}
	
}
