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

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

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.zk.ui.event.EventListener;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.ConfiguracionProducto;
import com.rjconsultores.ventaboletos.entidad.TipoEventoExtra;
import com.rjconsultores.ventaboletos.service.TipoEventoExtraService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionProducto;

/**
*
* @author Luis Espina
*/
@Controller("busquedaConfiguracionProductosController")
@Scope("prototype")
public class BusquedaConfiguracionProductosController extends MyGenericForwardComposer{

	private static final long serialVersionUID = 1L;
	
	@Autowired
	private TipoEventoExtraService tipoEventoExtraService;
	@Autowired
	private transient PagedListWrapper<ConfiguracionProducto> plwConfiguracionProducto;
	
	private Combobox cmbTipoEventoExtra;
	private List<TipoEventoExtra> lsTipoEventoExtra;
	private TipoEventoExtra tipoEventoExtra;
	private Datebox fecInicio;
    private Datebox fecFinal;
    private Paging pagingConfiguracionProductos;
	private MyListbox configuracionProductoList;
	private BusquedaConfiguracionProductosController bcp;

	
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		bcp = this;
		lsTipoEventoExtra = tipoEventoExtraService.obtenerTodos();
		
		configuracionProductoList.setItemRenderer(new RenderConfiguracionProducto());
		configuracionProductoList.addEventListener("onDoubleClick", new EventListener() {
			
			@Override
			public void onEvent(Event event) throws Exception {
				ConfiguracionProducto configuracionProducto = (ConfiguracionProducto) configuracionProductoList.getSelected();
				verConfiguracionProducto(configuracionProducto);
			}
		});
		refreshLista();
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void verConfiguracionProducto(ConfiguracionProducto configuracionProducto) {
		if (configuracionProducto == null) {
			return;
		}

		Map args = new HashMap();
		args.put("configuracionProducto", configuracionProducto);
		args.put("principal", bcp);
		args.put("lsTipoEventoExtra", lsTipoEventoExtra);
		args.put("configuracionProductoList", configuracionProductoList);

		openWindow("/gui/configuraciones_comerciales/editarConfiguracionProductos.zul",
				Labels.getLabel("editarConfiguracionProductosController.window.title"), args, MODAL);
	}
	
	private void refreshLista() {
		
		HibernateSearchObject<ConfiguracionProducto> configuracionProductoBusqueda =
				new HibernateSearchObject<ConfiguracionProducto>(ConfiguracionProducto.class, pagingConfiguracionProductos.getPageSize());
			
		configuracionProductoBusqueda.addFilterEqual("activo", Boolean.TRUE);
		TipoEventoExtra tipoEventoExtra = (TipoEventoExtra)(cmbTipoEventoExtra.getSelectedItem() != null ? cmbTipoEventoExtra.getSelectedItem().getValue() : null);
	
		if (tipoEventoExtra != null) {
			configuracionProductoBusqueda.addFilterEqual("tipoeventoextra", tipoEventoExtra);
		}
		if (fecInicio.getValue() != null) {
			Date inicio = DateUtil.inicioFecha(fecInicio.getValue());
			configuracionProductoBusqueda.addFilterGreaterOrEqual("fecVigenciaInicial", inicio);
		}
		if (fecFinal.getValue() != null) {
			Date fin = DateUtil.fimFecha(fecFinal.getValue());
			configuracionProductoBusqueda.addFilterLessOrEqual("fecVigenciaFinal", fin);
		}
		plwConfiguracionProducto.init(configuracionProductoBusqueda, configuracionProductoList, pagingConfiguracionProductos);
		if (configuracionProductoList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("busquedaConfiguracionProductosController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}
	
	public void onClick$btnPesquisa(Event ev) throws InterruptedException {

		if (fecInicio.getValue() != null && fecFinal.getValue() != null) {
            if (fecInicio.getValue().after(fecFinal.getValue())) {
                Messagebox.show(
                        Labels.getLabel("busquedaConfiguracionProductosController.MSG.busquedaPeriodo"),
                        Labels.getLabel("busquedaConfiguracionProductosController.window.title"),
                        Messagebox.OK, Messagebox.INFORMATION);
            } else {
                refreshLista();
            }
        } else {
            refreshLista();
        }

        refreshLista();

        fecInicio.focus();
	}

	public void onClick$btnRefresh(Event ev) {
		refreshLista();
	}

	public void onClick$btnNovo(Event ev) {
		verConfiguracionProducto(new ConfiguracionProducto());
	}

	public Combobox getCmbTipoEventoExtra() {
		return cmbTipoEventoExtra;
	}

	public void setCmbTipoEventoExtra(Combobox cmbTipoEventoExtra) {
		this.cmbTipoEventoExtra = cmbTipoEventoExtra;
	}

	public List<TipoEventoExtra> getLsTipoEventoExtra() {
		return lsTipoEventoExtra;
	}

	public void setLsTipoEventoExtra(List<TipoEventoExtra> lsTipoEventoExtra) {
		this.lsTipoEventoExtra = lsTipoEventoExtra;
	}

	public Datebox getFecInicio() {
		return fecInicio;
	}

	public void setFecInicio(Datebox fecInicio) {
		this.fecInicio = fecInicio;
	}

	public Datebox getFecFinal() {
		return fecFinal;
	}

	public void setFecFinal(Datebox fecFinal) {
		this.fecFinal = fecFinal;
	}

	public TipoEventoExtra getTipoEventoExtra() {
		return tipoEventoExtra;
	}

	public void setTipoEventoExtra(TipoEventoExtra tipoEventoExtra) {
		this.tipoEventoExtra = tipoEventoExtra;
	}

	public MyListbox getConfiguracionProductoList() {
		return configuracionProductoList;
	}

	public void setConfiguracionProductoList(MyListbox configuracionProductoList) {
		this.configuracionProductoList = configuracionProductoList;
	}
	
}
