package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.eventos;

import java.util.List;

import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zkplus.spring.SpringUtil;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.PagedListGenerico;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;

public abstract class EventListenerBtnPesquisar<T, U> implements EventListener {

	private T service;
	private MyTextbox textoDePesquisa;
	private MyListbox listBox;
	private String tituloRelatorio;
	private Boolean possuiOpcaoTodos;
	
	@SuppressWarnings("unchecked")
	public EventListenerBtnPesquisar(String beanService, MyListbox listBox, MyTextbox textoDePesquisa,
			String tituloRelatorio) {
		service = (T)SpringUtil.getBean(beanService);
		this.textoDePesquisa = textoDePesquisa;
		this.listBox = listBox;
		this.tituloRelatorio = tituloRelatorio;
		this.possuiOpcaoTodos = false;
	}
	
	@Override
	public void onEvent(Event arg0) throws Exception {
		listBox.setData(obtemRegistrosPesquisa(service, textoDePesquisa.getText()));
		PagedListGenerico.validarPagedListSemRegistro(listBox, tituloRelatorio);
	}

	protected List<U> obtemRegistrosPesquisa(T service, String valorAPesquisar) {
		List<U> retorno = buscaRegistros(service, valorAPesquisar);
		if (possuiOpcaoTodos && "TODOS".contains(valorAPesquisar.toUpperCase())) {
			retorno.add(incluiTodos(-1, "TODOS"));		
		}
		return retorno;
	}

	protected abstract U incluiTodos(int valorPk, String valorDescricao);

	protected abstract List<U> buscaRegistros(T service, String valorAPesquisar);

	public T getService() {
		return service;
	}

	public MyTextbox getTextoDePesquisa() {
		return textoDePesquisa;
	}

	public MyListbox getListBox() {
		return listBox;
	}
	
	public String getTituloRelatorio() {
		return tituloRelatorio;
	}

	public Boolean possuiOpcaoTodos() {
		return possuiOpcaoTodos;
	}

	public EventListenerBtnPesquisar<T, U> comIncluiOpcaoTodos(Boolean possuiOpcaoTodos) {
		this.possuiOpcaoTodos = possuiOpcaoTodos;
		return this;
	}

}
