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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.Estacion;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioVendasPercurso;
import com.rjconsultores.ventaboletos.service.EstacionService;
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;

@Controller("relatorioVendasPercursoController")
@Scope("prototype")
public class RelatorioVendasPercursoController extends MyGenericForwardComposer {
	
	private static final long serialVersionUID = 143203038399530349L;
	
	private MyTextbox txtNombrePuntoVenta;
	private Paging pagingPuntoVenta;
	private MyListbox puntoVentaList;	
	private MyListbox puntoVentaSelList;
	
	private Datebox fecInicio;
	private Datebox fecFinal;
	
	private Combobox cmbEstacion;
	private List<Estacion> lsEstacion;
	
	private Intbox txtIdCorrida;
	
	@Autowired
	private DataSource dataSourceRead;
	
	@Autowired
	private EstacionService estacionService;
	
	@Autowired
	private transient PagedListWrapper<PuntoVenta> plwPuntoVenta;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEstacion = new ArrayList<Estacion>();		
		super.doAfterCompose(comp);
	}
	
	@SuppressWarnings("unchecked")
	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		
		Estacion estacion = (Estacion) cmbEstacion.getSelectedItem().getValue();
		List<PuntoVenta> lsPuntoVenta = (List<PuntoVenta>) (Object) puntoVentaSelList.getListData();
		Integer corridaId = txtIdCorrida.getValue();
		
		RelatorioVendasPercurso relatorio = new RelatorioVendasPercurso(dataSourceRead.getConnection(), lsPuntoVenta, fecInicio.getValue(), fecFinal.getValue(), estacion, corridaId);
		
		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

		openWindow("/component/reportView.zul",
				   Labels.getLabel("indexController.mniRelatorioVendasComissao.label"), args, MODAL);
		
	}

	public void onClick$btnPesquisa(Event ev) {
		HibernateSearchObject<PuntoVenta> puntoVentaBusqueda =
				new HibernateSearchObject<PuntoVenta>(PuntoVenta.class, pagingPuntoVenta.getPageSize());

		puntoVentaBusqueda.addFilterILike("nombpuntoventa", "%" + txtNombrePuntoVenta.getValue() + "%");
		puntoVentaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		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("relatorioVendasPercursoController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
	}
	
	public void onClick$btnLimpar(Event ev) {
		puntoVentaList.setData(new ArrayList<PuntoVenta>());
		txtNombrePuntoVenta.setText("");
	}
	
	public void onDoubleClick$puntoVentaSelList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaSelList.getSelected();
		puntoVentaSelList.removeItem(puntoVenta);
		updateLsEstacion();
	}

	public void onDoubleClick$puntoVentaList(Event ev) {
		PuntoVenta puntoVenta = (PuntoVenta) puntoVentaList.getSelected();
		puntoVentaSelList.addItemNovo(puntoVenta);
		updateLsEstacion();
	}
	
	@SuppressWarnings("unchecked")
	public void updateLsEstacion() {
		lsEstacion = estacionService.buscarEstaciones(puntoVentaSelList.getListData());
		cmbEstacion.setSelectedIndex(-1);
		cmbEstacion.setModel(new BindingListModelList(lsEstacion, true));			
	}

	public List<Estacion> getLsEstacion() {
		return lsEstacion;
	}
	
}