package com.rjconsultores.ventaboletos.web.gui.controladores.seguridad;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.LogAuditoria;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLogAuditoria;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.LogAuditoriaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderLogAuditoria;
import com.trg.search.Filter;

import br.com.rjconsultores.auditador.enums.AuditadorTipoAlteracao;

@Controller("busquedaLogAuditoriaController")
@Scope("prototype")
public class BusquedaLogAuditoriaController extends MyGenericForwardComposer {
	
	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(BusquedaLogAuditoriaController.class);
	
	@Autowired
	private LogAuditoriaService logAuditoriaService;
	
	@Autowired
	private transient PagedListWrapper<LogAuditoria> plwLogAuditoria;	
	
	private MyListbox logAuditoriaList;
	private Paging pagingLogAuditoria;
	
	private List<Empresa> lsEmpresa;
	private List<String> lsTela;
	
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbTela;
	private MyComboboxEstandar cmbTipoAlteracao;
	
	private Datebox dtInicio;
	private Datebox dtFim;
	
	private MyTextbox txtCampoAlterado;
	private MyTextbox txtCveUsuario;
	private MyTextbox txtValorNovo;
	private MyTextbox txtValorAnterior;
	private MyTextbox txtIdAuditado;
	@Autowired
	private DataSource dataSourceRead;
	private Map<String, String> nomeTelas;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = new ArrayList<Empresa>();
		lsEmpresa.add(new Empresa(-1, "TODAS"));
		lsEmpresa.addAll(UsuarioLogado.getUsuarioLogado().getEmpresa());
		lsTela = recuperarChavesClasse(logAuditoriaService.listarTodasAsTelas());
		super.doAfterCompose(comp);
		
		logAuditoriaList.setItemRenderer(new RenderLogAuditoria());
	}

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}
	
	private void refreshLista(boolean isGerarRelatorio) throws Exception {
		HibernateSearchObject<LogAuditoria> sistemaBusqueda = new HibernateSearchObject<LogAuditoria>(LogAuditoria.class, pagingLogAuditoria.getPageSize());
		
		Date dataInicio = dtInicio.getValue();
		Date dataFim = dtFim.getValue();
		
		sistemaBusqueda.addFilterGreaterOrEqual("fecmodif", DateUtil.inicioFecha(dataInicio));
		sistemaBusqueda.addFilterLessOrEqual("fecmodif", DateUtil.fimFecha(dataFim));

		String campoAlterado = txtCampoAlterado.getText();
		if (StringUtils.isNotBlank(campoAlterado)) {
			sistemaBusqueda.addFilterLike("campoAlterado", "%" + campoAlterado.trim().concat("%"));
		}
		
		String valorNovo = txtValorNovo.getText();
		if (StringUtils.isNotBlank(valorNovo)) {
			sistemaBusqueda.addFilterLike("valorNovo", "%" + valorNovo.trim().concat("%"));
		}
		
		String valorAnterior = txtValorAnterior.getText();
		if (StringUtils.isNotBlank(valorAnterior)) {
			sistemaBusqueda.addFilterLike("valorAnterior", "%" + valorAnterior.trim().concat("%"));
		}
		
		String idAuditado = txtIdAuditado.getValue();
		if (StringUtils.isNotBlank(idAuditado)) {
			sistemaBusqueda.addFilterLike("idAuditado", idAuditado + "%");
		}
		
		String cveUsuario = txtCveUsuario.getText();
		if (StringUtils.isNotBlank(cveUsuario)) {
			sistemaBusqueda.addFilterLike("usuario.claveUsuario", "%" + cveUsuario.trim().concat("%"));
		}
		
		Empresa empresa = cmbEmpresa.getSelectedItem() != null ? (Empresa) cmbEmpresa.getSelectedItem().getValue() : null;
		if(empresa != null && empresa.getEmpresaId() > -1) {
			sistemaBusqueda.addFilterEqual("empresa.empresaId", empresa.getEmpresaId());
		} else {
			sistemaBusqueda.addFilterOr(Filter.in("empresa", lsEmpresa), Filter.isNull("empresa"));
		}
		
		String tela = cmbTela.getSelectedItem() != null ? cmbTela.getSelectedItem().getValue().toString() : null;
		if(tela != null) {
			sistemaBusqueda.addFilterEqual("tela", recuperarChaveNomeTela(tela));
		}
		
		AuditadorTipoAlteracao tipoAlteracao = cmbTipoAlteracao.getSelectedItem() != null ? (AuditadorTipoAlteracao) cmbTipoAlteracao.getSelectedItem().getValue() : null;
		if(tipoAlteracao != null) {
			sistemaBusqueda.addFilterEqual("tipoAlteracao", tipoAlteracao.toString());
		}

		sistemaBusqueda.addSortAsc("fecmodif");
		sistemaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		plwLogAuditoria.init(sistemaBusqueda, logAuditoriaList, pagingLogAuditoria);
		
		if (logAuditoriaList.getData().length == 0) {
			if(isGerarRelatorio){
				throw new Exception(Labels.getLabel("MSG.ningunRegistroRelatorio"));
			}else{
				try {
					Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),Labels.getLabel("busquedaLogAuditoriaController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
				} catch (InterruptedException ex) {
					log.error("", ex);
				}
			}
		}else {
			configurarNomesTelas();
		}
	}
	
	public void onClick$btnPesquisa(Event ev) throws Exception {
		refreshLista(false);
	}
	@SuppressWarnings("unchecked")
	public void onClick$btnGerarRelatorio(Event ev) throws Exception {
		
		try {
			refreshLista(true);
		} catch (Exception e) {
			Messagebox.show(e.getMessage(), Labels.getLabel("busquedaLogAuditoriaController.window.title"),	Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		
		
		Map<String, Object> parametros = new HashMap<String, Object>();
		StringBuilder filtro = new StringBuilder();


		parametros.put("DATA_INICIAL", (java.util.Date) dtInicio.getValue());
		parametros.put("DATA_FINAL", (java.util.Date) dtFim.getValue());
		parametros.put("NOME_RELATORIO", Labels.getLabel("busquedaLogAuditoriaController.window.title"));
		parametros.put("USUARIO_ID", UsuarioLogado.getUsuarioLogado().getUsuarioId().toString());
		parametros.put("NOME_USUARIO", UsuarioLogado.getUsuarioLogado().getNombusuario());


		
		filtro.append("Empresa: ");
		Comboitem item = null;
	
		if (cmbEmpresa.getSelectedItem() != null) {
			 item = cmbEmpresa.getSelectedItem();
			if (item != null) {
				Empresa empresa = (Empresa) item.getValue();
				filtro.append(empresa.getNombempresa()).append(";");	
			}
		} else {
			filtro.append(" Todas; ");
		}
		if (cmbTela.getSelectedItem() != null) {
			 item = cmbTela.getSelectedItem();
			if (item != null) {
				filtro.append(cmbTela.getValue()).append(";");	
			}
		} else {
			filtro.append(" Todas; ");
		}
		
		if (cmbTipoAlteracao.getSelectedItem() != null) {
			 item = cmbTipoAlteracao.getSelectedItem();
			if (item != null) {
				filtro.append(cmbTipoAlteracao.getValue()).append(";");	
			}
		} else {
			filtro.append(" Todas; ");
		}
		
		
		parametros.put("FILTROS", filtro.toString());
		
		Relatorio relatorio = null;
		relatorio = new RelatorioLogAuditoria(parametros, dataSourceRead.getConnection(), logAuditoriaList.getListData());


		@SuppressWarnings("rawtypes")
		Map args = new HashMap();
		args.put("relatorio", relatorio);

		openWindow("/component/reportView.zul",	Labels.getLabel("busquedaLogAuditoriaController.window.title"), args, MODAL);

	}
	
	public List<AuditadorTipoAlteracao> getTipoAlteracaoList() {
		return AuditadorTipoAlteracao.getList();
	}

	public List<String> getLsTela() {
		return lsTela;
	}

	private List<String> recuperarChavesClasse(List<String> lsTela) {
		
		nomeTelas = new HashMap<String, String>();
		List<String> lsTelasAux = new ArrayList<String>();
		
		for (String tela : lsTela) {
			lsTelasAux.add(Labels.getLabel(tela, tela));
			nomeTelas.put(tela, Labels.getLabel(tela, tela));
		}
		Collections.sort(lsTelasAux);
		return lsTelasAux;
	}
	
	private String recuperarChaveNomeTela(String tela) {
		
		String chave = null;
		for (Entry<String, String> entry : nomeTelas.entrySet()) {
            if (entry.getValue().equals(tela)) {
            	chave =  entry.getKey();
            }
        }
		return chave;
	}
	
	@SuppressWarnings("unchecked")
	private void configurarNomesTelas() {
		
		List<LogAuditoria> lista = logAuditoriaList.getListData();
		for (LogAuditoria logAuditoria : lista) {
			logAuditoria.setTela(nomeTelas.get(logAuditoria.getTela()));
        }
	}
}
