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

import java.text.DateFormat;
import java.util.List;
import java.util.Locale;

import javax.portlet.PortletURL;

import br.mp.mprj.portal.portlet.gestaomensagens.enums.TipoAgendamentoEnum;
import br.mp.mprj.portal.portlet.gestaomensagens.search.ConstantesSearch;
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.AgendamentoLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.MensagemLocalServiceUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.persistence.MensagemActionableDynamicQuery;
import br.mp.mprj.portal.portlet.gestaomensagens.util.SearchUtil;
import br.mp.mprj.portal.portlet.gestaomensagens.workflow.StatusWorkflowEnum;

import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.search.BaseIndexer;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.SearchEngineUtil;
import com.liferay.portal.kernel.search.Summary;
import com.liferay.portal.kernel.util.GetterUtil;

public class MensagemIndexer extends BaseIndexer {
	
	private static final String ENTRY_CLASS_NAME = Mensagem.class.getName();
	public static final String[] CLASS_NAMES = {ENTRY_CLASS_NAME};
	private static final int[] TIPO_AGENDAMENTO_INDEXAVEL = {TipoAgendamentoEnum.CALENDARIO.ordinal(), 
															TipoAgendamentoEnum.RECORRENCIA_GERADA.ordinal()};

	@Override
	public String[] getClassNames() {
		return CLASS_NAMES;
	}

	@Override
	public String getPortletId() {
		return ConstantesSearch.PORTLET_ID_MENSAGEM;
	}

	@Override
	protected void doDelete(Object obj) throws Exception {
		Mensagem mensagem = (Mensagem) obj;
		deleteDocument(mensagem.getCompanyId(), mensagem.getMensagemId());
	}

	@Override
	protected Document doGetDocument(Object obj) throws Exception {
		Mensagem entry = (Mensagem) obj;
		
		Document document = getBaseModelDocument(getPortletId(), entry);
		
		document.addKeyword(Field.COMPANY_ID, entry.getCompanyId());
		document.addKeyword(Field.GROUP_ID, entry.getGroupId());
		document.addDate(Field.MODIFIED_DATE, entry.getDataAlteracao());
		document.addDate(Field.CREATE_DATE, entry.getDataSolicitacao());
		
		document.addKeyword("nomeSolicitante", entry.getNomeSolicitante());
		document.addKeyword("assunto", entry.getAssunto());
		document.addKeyword("assunto_sortable", entry.getAssunto());
		document.addKeyword("statusWorkflow", entry.getStatusWorkflow());
		document.addKeyword("status_workflow_sortable", StatusWorkflowEnum.getDescricao(entry.getStatusWorkflow()));
		//document.addText("assuntoDescricao", entry.getAssunto());
		
		document.addText("conteudo", entry.getConteudo());
		document.addKeyword("prioridade", entry.getPrioridade());
		document.addKeyword("ativo", entry.getAtivo());
		document.addKeyword("tipoEnvio", entry.getTipoEnvio());
		document.addKeyword("situacaoEnvio", entry.getSituacaoEnvio());
		document.addKeyword("userIdCriador", entry.getUserIdCriador());
		document.addKeyword("contaSaidaId", entry.getContaSaidaId());
		document.addKeyword("codigoMensagem", entry.getCodigoMensagem());

		document.addKeyword("rascunho", entry.getRascunho());
		document.addDate("dataUltimoEnvio", entry.getDataUltimoEnvio());
		document.addKeyword("templateId", entry.getTemplateId());
		
		//indexar o agendamento, buscando apenas os tipos que serao indexados
		List<Agendamento> agendamentos = AgendamentoLocalServiceUtil
											.findByMensagemTipoAgendamentoMultiplos(
													entry.getMensagemId(), 
													TIPO_AGENDAMENTO_INDEXAVEL);
		if (agendamentos.size() > 0) {
			DateFormat dfData = SearchUtil.getDateFormat();
			
			String[] datas = new String[agendamentos.size()];
			for (int i = 0; i < agendamentos.size(); i++) {
				Agendamento ag = agendamentos.get(i);
				datas[i] = dfData.format(ag.getDataInicio());
			}
			document.addKeyword("agendamento", datas);
		}
		else {
			document.remove("agendamento");
		}
		
		
		return document;
	}

	@Override
	protected Summary doGetSummary(Document document, Locale locale,
			String snippet, PortletURL portletURL) throws Exception {
		return null;
	}

	@Override
	protected void doReindex(Object obj) throws Exception {
		Mensagem mensagem = (Mensagem) obj;
		SearchEngineUtil.updateDocument(getSearchEngineId(), 
				mensagem.getCompanyId(), 
				doGetDocument(mensagem), 
				false);
	}

	@Override
	protected void doReindex(String className, long classPK) throws Exception {
		if (className.equals(ENTRY_CLASS_NAME)) {
			doReindex(MensagemLocalServiceUtil.getMensagem(classPK));
		}
	}

	@Override
	protected void doReindex(String[] ids) throws Exception {
		long companyId = GetterUtil.getLong(ids[0]);

		//define uma actionableQuery customizada para a entidade, gerado pelo ServiceBuilder.
		//possui metodo onde eh possivel definir condicoes p/ query: addCriteria.
		ActionableDynamicQuery actionableQuery = new MensagemActionableDynamicQuery() {
			@Override
			protected void performAction(Object object) throws PortalException,
					SystemException {
				Mensagem entry = (Mensagem) object;
				Document document = getDocument(entry);
				addDocument(document);
			}
		};
		
		actionableQuery.setCompanyId(companyId);
		actionableQuery.setSearchEngineId(getSearchEngineId());
		actionableQuery.performActions();
	}

	@Override
	protected String getPortletId(SearchContext searchContext) {
		return getPortletId();
	}

}
