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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.sql.DataSource;

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.Bandbox;
import org.zkoss.zul.Button;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.enums.TypeEventListener;
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.RenderPersonalizado;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioGenericoPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioGenericoPuntoVentaSel;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioGenericoEmpresasSel;

@Controller("relatorioIntegracaoAntiFraudeController")
@Scope("prototype")
public class RelatorioIntegracaoAntiFraudeController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	public static final String TITULO_RELATORIO = "indexController.mniRelatorioIntegracaoAntiFraude.label";

	@Autowired
	private DataSource dataSource;

	private Datebox dtInicial;
	private Datebox dtFinal;

	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;
	private MyTextbox txtNombrePuntoVenta;
	private Bandbox bbPesquisaPuntoVenta;
	private Paging pagingPuntoVenta;
	private MyListbox puntoVentaList;
	private MyListbox puntoVentaSelList;

	@Autowired
	private transient PagedListWrapper<Empresa> plwEmpresa;
	private Paging pagingEmpresa;
	private MyListbox empresaList;
	private MyListbox empresaSelList;
	private Textbox txtNombreEmpresa;

	private List<EStatusKondutoTotalBus> lsStatusKondutoTotalBus;
	private List<EStatusKonduto> lsStatusKonduto;
	private List<EStatusKondutoEnvio> lsStatusKondutoEnvio;
	private MyListbox kondutoList;
	private MyListbox kondutoTotalBusList;
	private MyListbox kondutoEnvioList;

	private Button btnExecutarRelatorio;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		kondutoList.setItemRenderer(new RenderPersonalizado<EStatusKonduto>(Arrays.asList("descricao")));
		kondutoList.setData(Arrays.asList(EStatusKonduto.values()));
		kondutoList.selectAll();

		kondutoTotalBusList.setItemRenderer(new RenderPersonalizado<EStatusKondutoTotalBus>(Arrays.asList("descricao")));
		kondutoTotalBusList.setData(Arrays.asList(EStatusKondutoTotalBus.values()));
		kondutoTotalBusList.selectAll();

		kondutoEnvioList.setItemRenderer(new RenderPersonalizado<EStatusKondutoEnvio>(Arrays.asList("descricao")));
		kondutoEnvioList.setData(Arrays.asList(EStatusKondutoEnvio.values()));
		kondutoEnvioList.selectAll();

		puntoVentaList.setItemRenderer(new RenderRelatorioGenericoPuntoVenta());
		puntoVentaSelList.setItemRenderer(new RenderRelatorioGenericoPuntoVentaSel());

		empresaList.setItemRenderer(new RenderRelatorioGenericoEmpresasSel());
		empresaSelList.setItemRenderer(new RenderRelatorioGenericoEmpresasSel());

		configuraEventosExecucaoRelatorio();
	}

	private void configuraEventosExecucaoRelatorio() {
		btnExecutarRelatorio.addEventListener(TypeEventListener.ON_CLICK.getEvent(),
				new EventListenerExecutarRelatorioIntegracaoAntiFraude(this));
	}

	public Datebox getDtInicial() {
		return dtInicial;
	}

	public Datebox getDtFinal() {
		return dtFinal;
	}

	public MyListbox getKondutoList() {
		return kondutoList;
	}

	public DataSource getDataSource() {
		return dataSource;
	}

	public List<EStatusKonduto> getLsStatusKonduto() {
		return lsStatusKonduto;
	}

	public List<EStatusKondutoTotalBus> getLsStatusKondutoTotalBus() {
		return lsStatusKondutoTotalBus;
	}

	public List<EStatusKondutoEnvio> getLsStatusKondutoEnvio() {
		return lsStatusKondutoEnvio;
	}

	public MyListbox getKondutoTotalBusList() {
		return kondutoTotalBusList;
	}

	public MyListbox getKondutoEnvioList() {
		return kondutoEnvioList;
	}

	private void executarPesquisaPuntoVenta() {
		HibernateSearchObject<PuntoVenta> puntoVentaBusqueda = new HibernateSearchObject<PuntoVenta>(PuntoVenta.class, pagingPuntoVenta.getPageSize());

		puntoVentaBusqueda.addFilterILike("nombpuntoventa", "%" + txtNombrePuntoVenta.getValue() + "%");
		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);
		puntoVentaBusqueda.addFilterNotEqual("puntoventaId", -1);
		puntoVentaBusqueda.addSortAsc("nombpuntoventa");
		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);
		plwPuntoVenta.init(puntoVentaBusqueda, puntoVentaList, pagingPuntoVenta);

		if (puntoVentaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioVendasBilheteiroController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}

	public void onClick$btnPesquisaEmpresa(Event ev) {
		executarPesquisaEmpresa();
	}

	public void onDoubleClick$puntoVentaSelList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaSelList.getSelected();
		puntoVentaSelList.removeItem(puntoVenta);
	}

	public void onDoubleClick$puntoVentaList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaList.getSelected();
		if (!puntoVentaSelList.getListData().contains(puntoVenta)) {
			puntoVentaSelList.addItemNovo(puntoVenta);
		}
	}

	public void onClick$btnLimpar(Event ev) {
		puntoVentaList.setData(new ArrayList<PuntoVenta>());
		bbPesquisaPuntoVenta.setText("");
	}

	private void executarPesquisaEmpresa() {
		HibernateSearchObject<Empresa> empresaBusqueda = new HibernateSearchObject<Empresa>(Empresa.class, pagingEmpresa.getPageSize());

		empresaBusqueda.addFilterILike("nombempresa", "%" + txtNombreEmpresa.getValue() + "%");
		empresaBusqueda.addFilterEqual("activo", Boolean.TRUE);
		empresaBusqueda.addFilterNotEqual("empresaId", -1);

		empresaBusqueda.addSortAsc("nombempresa");

		plwEmpresa.init(empresaBusqueda, empresaList, pagingEmpresa);

		if (empresaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioDescontosController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}

	public void onClick$btnPesquisa(Event ev) {
		executarPesquisaPuntoVenta();
	}

	public void onClick$btnLimparEmpresa(Event ev) {
		empresaList.setData(new ArrayList<Empresa>());
		txtNombreEmpresa.setText("");
	}

	public void onDoubleClick$empresaList(Event ev) {
		Empresa empresa = (Empresa) empresaList.getSelected();
		if (!empresaSelList.getListData().contains(empresa)) {
			empresaSelList.addItemNovo(empresa);
		}
	}

	public void onDoubleClick$empresaSelList(Event ev) {
		Empresa empresa = (Empresa) empresaSelList.getSelected();
		empresaSelList.removeItem(empresa);
	}

	public MyListbox getPuntoVentaSelList() {
		return puntoVentaSelList;
	}

	public void setPuntoVentaSelList(MyListbox puntoVentaSelList) {
		this.puntoVentaSelList = puntoVentaSelList;
	}

	public MyListbox getEmpresaList() {
		return empresaList;
	}

	public void setEmpresaList(MyListbox empresaList) {
		this.empresaList = empresaList;
	}

	public MyListbox getEmpresaSelList() {
		return empresaSelList;
	}

	public void setEmpresaSelList(MyListbox empresaSelList) {
		this.empresaSelList = empresaSelList;
	}

}
