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

import br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.GrupoDestinatarioImpl;
import com.liferay.portal.kernel.search.ParseException;
import com.liferay.portal.kernel.exception.NestableException;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.BooleanQuery;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.search.SearchException;
import br.mp.mprj.portal.portlet.gestaomensagens.util.GestaoMensagensUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.GrupoDestinatarioLocalServiceUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.search.SearchEngineUtil;
import java.util.HashMap;
import java.util.Date;
import br.mp.mprj.portal.portlet.gestaomensagens.util.SearchUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.search.Query;
import com.liferay.portal.kernel.search.BooleanClauseOccur;
import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
import com.liferay.portal.kernel.search.SortFactoryUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.search.indexer.GrupoDestinatarioIndexer;
import com.liferay.portal.kernel.search.SearchContextFactory;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.theme.ThemeDisplay;
import java.util.ArrayList;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.GrupoDestinatario;
import java.util.List;
import java.util.Map;
import javax.portlet.PortletRequest;
import com.liferay.portal.kernel.search.Sort;

public class GrupoDestinatarioSearch
{
    private static final Sort[] SORT_PADRAO;
    
    public static Map<Integer, List<GrupoDestinatario>> pesquisar(final PortletRequest req, final long companyId, final int posicaoInicial, final int tamanho, final String ordem, final boolean agrupamento) throws ParseException, SearchException {
        final List<GrupoDestinatario> list = new ArrayList<GrupoDestinatario>();
        String tipoLista = "";
        Sort[] ordenacao = null;
        String nome = "";
        final ThemeDisplay themeDisplay = (ThemeDisplay)req.getAttribute("LIFERAY_SHARED_THEME_DISPLAY");
        final long groupId = themeDisplay.getScopeGroupId();
        final String groupIdStr = String.valueOf(groupId);
        if (!"".equals(ParamUtil.getString(req, "tipoLista"))) {
            tipoLista = ParamUtil.getString(req, "tipoLista");
        }
        else if ("".equals(ParamUtil.getString(req, "operacao")) && !"".equals(ParamUtil.getString(req, "tipoListaParam")) && !"-1".equals(ParamUtil.getString(req, "tipoListaParam"))) {
            tipoLista = ParamUtil.getString(req, "tipoListaParam");
        }
        if (!"".equals(ParamUtil.getString(req, "nomeListaDestinatarioSearch"))) {
            nome = ParamUtil.getString(req, "nomeListaDestinatarioSearch");
        }
        else if ("".equals(ParamUtil.getString(req, "operacao")) && !"".equals(ParamUtil.getString(req, "nome"))) {
            nome = ParamUtil.getString(req, "nome");
        }
        final SearchContext sc = SearchContextFactory.getInstance(PortalUtil.getHttpServletRequest(req));
        sc.setAndSearch(true);
        sc.setEntryClassNames(GrupoDestinatarioIndexer.CLASS_NAMES);
        if (ordem == null || "".equals(ordem)) {
            ordenacao = GrupoDestinatarioSearch.SORT_PADRAO;
        }
        else {
            final Sort[] temp = ordenacao = new Sort[] { SortFactoryUtil.create(ordem, "desc".equals(ParamUtil.getString(req, "orderByType"))) };
        }
        sc.setSorts(ordenacao);
        final BooleanQuery query = BooleanQueryFactoryUtil.create(sc);
        final BooleanQuery bqEntryClassName = BooleanQueryFactoryUtil.create(sc);
        bqEntryClassName.addExactTerm("entryClassName", GrupoDestinatario.class.getName());
        query.add((Query)bqEntryClassName, BooleanClauseOccur.MUST);
        if (Validator.isNotNull(nome)) {
            query.addTerm("+nome", nome, true);
        }
        if (Validator.isNotNull(tipoLista)) {
            query.addTerm("+tipoLista", tipoLista);
        }
        query.addTerm("+groupId", groupIdStr, true);
        query.addTerm("+ativo", "true", true);
        if (agrupamento) {
            final BooleanQuery criterioDataTemporaria = BooleanQueryFactoryUtil.create(sc);
            criterioDataTemporaria.addTerm("+dataFinalListaTemporaria", "[ " + SearchUtil.getDateFormat().format(new Date()) + " TO " + "* ]", true);
            criterioDataTemporaria.addTerm("+listaTemporaria", "true", true);
            final BooleanQuery criterioListaTemporariaFalsa = BooleanQueryFactoryUtil.create(sc);
            criterioListaTemporariaFalsa.addTerm("+listaTemporaria", "false", true);
            final BooleanQuery agrupadorTemporario = BooleanQueryFactoryUtil.create(sc);
            agrupadorTemporario.add((Query)criterioDataTemporaria, BooleanClauseOccur.SHOULD);
            agrupadorTemporario.add((Query)criterioListaTemporariaFalsa, BooleanClauseOccur.SHOULD);
            query.add((Query)agrupadorTemporario, BooleanClauseOccur.MUST);
        }
        final Map<Integer, List<GrupoDestinatario>> retorno = new HashMap<Integer, List<GrupoDestinatario>>();
        final Hits hits = SearchEngineUtil.search(sc.getSearchEngineId(), companyId, (Query)query, ordenacao, posicaoInicial, tamanho);
        for (final Document doc : hits.getDocs()) {
            try {
                final GrupoDestinatario grupoDestinatario = GrupoDestinatarioLocalServiceUtil.getGrupoDestinatario(GetterUtil.getLong(doc.get("entryClassPK")));
                if (grupoDestinatario.getAtivo()) {
                    list.add(grupoDestinatario);
                }
            }
            catch (SystemException | PortalException ex3) {
                final NestableException ex2 = null;
                final NestableException ex = ex2;
                GestaoMensagensUtil.descartarRascunhos(req);
                throw new SearchException((Throwable)ex);
            }
        }
        retorno.put(hits.getLength(), list);
        return retorno;
    }
    
    public static List<GrupoDestinatario> pesquisar(final PortletRequest req, final long companyId, final int tipoLista, final boolean agrupamento) throws ParseException, SearchException {
        final List<GrupoDestinatario> list = new ArrayList<GrupoDestinatario>();
        final SearchContext sc = SearchContextFactory.getInstance(PortalUtil.getHttpServletRequest(req));
        final ThemeDisplay themeDisplay = (ThemeDisplay)req.getAttribute("LIFERAY_SHARED_THEME_DISPLAY");
        final long groupId = themeDisplay.getScopeGroupId();
        final String groupIdStr = String.valueOf(groupId);
        sc.setAndSearch(true);
        sc.setEntryClassNames(GrupoDestinatarioIndexer.CLASS_NAMES);
        sc.setSorts(GrupoDestinatarioSearch.SORT_PADRAO);
        final BooleanQuery query = BooleanQueryFactoryUtil.create(sc);
        final BooleanQuery bqEntryClassName = BooleanQueryFactoryUtil.create(sc);
        bqEntryClassName.addExactTerm("entryClassName", GrupoDestinatario.class.getName());
        query.add((Query)bqEntryClassName, BooleanClauseOccur.MUST);
        if (Validator.isNotNull((Object)tipoLista)) {
            query.addTerm("+tipoLista", (long)tipoLista);
        }
        query.addTerm("+ativo", "true", true);
        query.addTerm("+groupId", groupIdStr, true);
        if (agrupamento) {
            final BooleanQuery criterioDataTemporaria = BooleanQueryFactoryUtil.create(sc);
          
            criterioDataTemporaria.addTerm("+dataFinalListaTemporaria", "[ " + SearchUtil.getDateFormat().format(new Date()) + " TO " + "* ]", true);
            criterioDataTemporaria.addTerm("+listaTemporaria", "true", true);
            final BooleanQuery criterioListaTemporariaFalsa = BooleanQueryFactoryUtil.create(sc);
            criterioListaTemporariaFalsa.addTerm("+listaTemporaria", "false", true);
            final BooleanQuery agrupadorTemporario = BooleanQueryFactoryUtil.create(sc);
            agrupadorTemporario.add((Query)criterioDataTemporaria, BooleanClauseOccur.SHOULD);
            agrupadorTemporario.add((Query)criterioListaTemporariaFalsa, BooleanClauseOccur.SHOULD);
            query.add((Query)agrupadorTemporario, BooleanClauseOccur.MUST);
        }
        final Hits hits = SearchEngineUtil.search(sc, (Query)query);
        for (final Document doc : hits.getDocs()) {
            final GrupoDestinatario grupo = (GrupoDestinatario)new GrupoDestinatarioImpl();
            grupo.setGrupoDestinatarioId(GetterUtil.getLong(doc.get("entryClassPK")));
            grupo.setNome(doc.get("nome"));
            grupo.setFinalidade(doc.get("finalidade"));
            grupo.setCompanyId(GetterUtil.getLong(doc.get("companyId")));
            grupo.setTipoLista(GetterUtil.getInteger(doc.get("tipoLista")));
            list.add(grupo);
        }
        return list;
    }
    
    static {
        SORT_PADRAO = new Sort[] { SortFactoryUtil.create("nome_sortable", false) };
    }
}