/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.pricing;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PricingEspecifico;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MonedaService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
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.RenderPricingEspecifico;
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 org.zkoss.zul.Textbox;

/**
 * 
 * @author Cássio Rocha
 */
@Controller("busquedaPricingEspecificoController")
@Scope("prototype")
public class BusquedaPricingEspecificoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private MonedaService monedaService;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private ParadaService paradaService;
	@Autowired
	private TipoPuntoVentaService puntoVentaService;
	private List<Marca> lsMarca;
	private List<Moneda> lsMoneda;
	private List<Categoria> lsCategoria;
	private List<ClaseServicio> lsClaseServicio;
	private List<TipoPuntoVenta> lsPtovata;
	private MyListbox pricingList;
	private Paging pagingPricing;
	@Autowired
	private transient PagedListWrapper<PricingEspecifico> plwPricingEspecifico;
	private Combobox cmbMarca;
	private Combobox cmbMoneda;
	private Combobox cmbTipoPassageiro;
	private Combobox cmbTipoServicio;
	private Combobox cmbPtovta;
	private Combobox cmbOrigem;
	private Combobox cmbDestino;
	private Datebox fechaInicio;
	private Datebox fechaFin;
	private Textbox txtNombrePricing;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsMarca = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());
		lsMoneda = monedaService.obtenerTodos();
		lsCategoria = categoriaService.obtenerTodos();
		lsClaseServicio = claseServicioService.obtenerTodos();
		lsPtovata = puntoVentaService.obtenerTodos();

		super.doAfterCompose(comp);

		pricingList.setItemRenderer(new RenderPricingEspecifico());
		pricingList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				PricingEspecifico pricingEspecifico = (PricingEspecifico) pricingList.getSelected();
				verPricing(pricingEspecifico);
			}
		});

		txtNombrePricing.focus();
		refreshLista();
	}

	public void onClick$btnPesquisa(Event ev) throws InterruptedException {
		refreshLista();
	}

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

	public void onClick$btnNovo(Event ev) {
		verPricing(new PricingEspecifico());
	}

	private void refreshLista() {
		HibernateSearchObject<PricingEspecifico> pricingSearch =
				new HibernateSearchObject<PricingEspecifico>(PricingEspecifico.class, pagingPricing.getPageSize());
		pricingSearch.addFilterEqual("activo", Boolean.TRUE);

		Marca marca = (Marca) (cmbMarca.getSelectedItem() != null ? cmbMarca.getSelectedItem().getValue() : null);
		Moneda moneda = (Moneda) (cmbMoneda.getSelectedItem() != null ? cmbMoneda.getSelectedItem().getValue() : null);
		Categoria categoria = (Categoria) (cmbTipoPassageiro.getSelectedItem() != null ? cmbTipoPassageiro.getSelectedItem().getValue() : null);
		ClaseServicio claseServicio = (ClaseServicio) (cmbTipoServicio.getSelectedItem() != null ? cmbTipoServicio.getSelectedItem().getValue() : null);
		TipoPuntoVenta tipoPuntoVenta = (TipoPuntoVenta) (cmbPtovta.getSelectedItem() != null ? cmbPtovta.getSelectedItem().getValue() : null);
		Parada parada = (Parada) (cmbOrigem.getSelectedItem() != null ? cmbOrigem.getSelectedItem().getValue() : null);
		Parada parada1 = (Parada) (cmbDestino.getSelectedItem() != null ? cmbDestino.getSelectedItem().getValue() : null);

		if (fechaInicio.getValue() != null) {
			pricingSearch.addFilterGreaterOrEqual("fechorinicio", fechaInicio.getValue());
		}

		if (fechaFin.getValue() != null) {
			pricingSearch.addFilterLessOrEqual("fechorfin", fechaFin.getValue());
		}

		if (parada != null) {
			pricingSearch.addFilterEqual("parada", parada);
		}

		if (parada1 != null) {
			pricingSearch.addFilterEqual("parada1", parada1);
		}

		if (tipoPuntoVenta != null) {
			pricingSearch.addFilterEqual("tipoPtovta", tipoPuntoVenta);
		}

		if (marca != null) {
			pricingSearch.addFilterEqual("marca", marca);
		} else {
			pricingSearch.addFilterIn("marca", lsMarca);
		}
		if (moneda != null) {
			pricingSearch.addFilterEqual("moneda", moneda);
		}
		if (categoria != null) {
			pricingSearch.addFilterEqual("categoria", categoria);
		}
		if (claseServicio != null) {
			pricingSearch.addFilterEqual("claseServicio", claseServicio);
		}

		String nomePricing = txtNombrePricing.getText().trim();
		if (!nomePricing.isEmpty()) {
			pricingSearch.addFilterILike("nombPricing", "%" + nomePricing + "%");
		}

		pricingSearch.addSortAsc("nombPricing");

		plwPricingEspecifico.init(pricingSearch, pricingList, pagingPricing);

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

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void verPricing(PricingEspecifico pricingEspecifico) {
		if (pricingEspecifico == null) {
			return;
		}

		Map args = new HashMap();
		args.put("pricingEspecifico", pricingEspecifico);
		args.put("pricingList", pricingList);

		openWindow("/gui/pricing/editarPricingEspecifico.zul",
				Labels.getLabel("busquedaPricingEspecificoController.window.title"), args, MODAL);
	}

	/**
	 * @return the lsMarca
	 */
	public List<Marca> getLsMarca() {
		return lsMarca;
	}

	/**
	 * @param lsMarca
	 *            the lsMarca to set
	 */
	public void setLsMarca(List<Marca> lsMarca) {
		this.lsMarca = lsMarca;
	}

	/**
	 * @return the lsMoneda
	 */
	public List<Moneda> getLsMoneda() {
		return lsMoneda;
	}

	/**
	 * @param lsMoneda
	 *            the lsMoneda to set
	 */
	public void setLsMoneda(List<Moneda> lsMoneda) {
		this.lsMoneda = lsMoneda;
	}

	/**
	 * @return the pricingList
	 */
	public MyListbox getPricingList() {
		return pricingList;
	}

	/**
	 * @param pricingList
	 *            the pricingList to set
	 */
	public void setPricingList(MyListbox pricingList) {
		this.pricingList = pricingList;
	}

	/**
	 * @return the pagingPricing
	 */
	public Paging getPagingPricing() {
		return pagingPricing;
	}

	/**
	 * @param pagingPricing
	 *            the pagingPricing to set
	 */
	public void setPagingPricing(Paging pagingPricing) {
		this.pagingPricing = pagingPricing;
	}

	/**
	 * @return the marcaService
	 */
	public MarcaService getMarcaService() {
		return marcaService;
	}

	/**
	 * @param marcaService
	 *            the marcaService to set
	 */
	public void setMarcaService(MarcaService marcaService) {
		this.marcaService = marcaService;
	}

	/**
	 * @return the monedaService
	 */
	public MonedaService getMonedaService() {
		return monedaService;
	}

	/**
	 * @param monedaService
	 *            the monedaService to set
	 */
	public void setMonedaService(MonedaService monedaService) {
		this.monedaService = monedaService;
	}

	/**
	 * @return the plwPricingEspecifico
	 */
	public PagedListWrapper<PricingEspecifico> getPlwPricingEspecifico() {
		return plwPricingEspecifico;
	}

	/**
	 * @param plwPricingEspecifico
	 *            the plwPricingEspecifico to set
	 */
	public void setPlwPricingEspecifico(PagedListWrapper<PricingEspecifico> plwPricingEspecifico) {
		this.plwPricingEspecifico = plwPricingEspecifico;
	}

	/**
	 * @return the lsCategoria
	 */
	public List<Categoria> getLsCategoria() {
		return lsCategoria;
	}

	/**
	 * @param lsCategoria
	 *            the lsCategoria to set
	 */
	public void setLsCategoria(List<Categoria> lsCategoria) {
		this.lsCategoria = lsCategoria;
	}

	/**
	 * @return the lsClaseServicio
	 */
	public List<ClaseServicio> getLsClaseServicio() {
		return lsClaseServicio;
	}

	/**
	 * @param lsClaseServicio
	 *            the lsClaseServicio to set
	 */
	public void setLsClaseServicio(List<ClaseServicio> lsClaseServicio) {
		this.lsClaseServicio = lsClaseServicio;
	}

	/**
	 * @return the categoriaService
	 */
	public CategoriaService getCategoriaService() {
		return categoriaService;
	}

	/**
	 * @param categoriaService
	 *            the categoriaService to set
	 */
	public void setCategoriaService(CategoriaService categoriaService) {
		this.categoriaService = categoriaService;
	}

	/**
	 * @return the claseServicioService
	 */
	public ClaseServicioService getClaseServicioService() {
		return claseServicioService;
	}

	/**
	 * @param claseServicioService
	 *            the claseServicioService to set
	 */
	public void setClaseServicioService(ClaseServicioService claseServicioService) {
		this.claseServicioService = claseServicioService;
	}

	/**
	 * @return the cmbMarca
	 */
	public Combobox getCmbMarca() {
		return cmbMarca;
	}

	/**
	 * @param cmbMarca
	 *            the cmbMarca to set
	 */
	public void setCmbMarca(Combobox cmbMarca) {
		this.cmbMarca = cmbMarca;
	}

	/**
	 * @return the cmbMoneda
	 */
	public Combobox getCmbMoneda() {
		return cmbMoneda;
	}

	/**
	 * @param cmbMoneda
	 *            the cmbMoneda to set
	 */
	public void setCmbMoneda(Combobox cmbMoneda) {
		this.cmbMoneda = cmbMoneda;
	}

	/**
	 * @return the cmbTipoPassageiro
	 */
	public Combobox getCmbTipoPassageiro() {
		return cmbTipoPassageiro;
	}

	/**
	 * @param cmbTipoPassageiro
	 *            the cmbTipoPassageiro to set
	 */
	public void setCmbTipoPassageiro(Combobox cmbTipoPassageiro) {
		this.cmbTipoPassageiro = cmbTipoPassageiro;
	}

	/**
	 * @return the cmbTipoServicio
	 */
	public Combobox getCmbTipoServicio() {
		return cmbTipoServicio;
	}

	/**
	 * @param cmbTipoServicio
	 *            the cmbTipoServicio to set
	 */
	public void setCmbTipoServicio(Combobox cmbTipoServicio) {
		this.cmbTipoServicio = cmbTipoServicio;
	}

	/**
	 * @return the paradaService
	 */
	public ParadaService getParadaService() {
		return paradaService;
	}

	/**
	 * @param paradaService
	 *            the paradaService to set
	 */
	public void setParadaService(ParadaService paradaService) {
		this.paradaService = paradaService;
	}

	/**
	 * @return the lsPtovata
	 */
	public List<TipoPuntoVenta> getLsPtovata() {
		return lsPtovata;
	}

	/**
	 * @param lsPtovata
	 *            the lsPtovata to set
	 */
	public void setLsPtovata(List<TipoPuntoVenta> lsPtovata) {
		this.lsPtovata = lsPtovata;
	}

	/**
	 * @return the puntoVentaService
	 */
	public TipoPuntoVentaService getPuntoVentaService() {
		return puntoVentaService;
	}

	/**
	 * @param puntoVentaService
	 *            the puntoVentaService to set
	 */
	public void setPuntoVentaService(TipoPuntoVentaService puntoVentaService) {
		this.puntoVentaService = puntoVentaService;
	}

	/**
	 * @return the cmbPtovta
	 */
	public Combobox getCmbPtovta() {
		return cmbPtovta;
	}

	/**
	 * @param cmbPtovta
	 *            the cmbPtovta to set
	 */
	public void setCmbPtovta(Combobox cmbPtovta) {
		this.cmbPtovta = cmbPtovta;
	}

	/**
	 * @return the cmbOrigem
	 */
	public Combobox getCmbOrigem() {
		return cmbOrigem;
	}

	/**
	 * @param cmbOrigem
	 *            the cmbOrigem to set
	 */
	public void setCmbOrigem(Combobox cmbOrigem) {
		this.cmbOrigem = cmbOrigem;
	}

	/**
	 * @return the cmbDestino
	 */
	public Combobox getCmbDestino() {
		return cmbDestino;
	}

	/**
	 * @param cmbDestino
	 *            the cmbDestino to set
	 */
	public void setCmbDestino(Combobox cmbDestino) {
		this.cmbDestino = cmbDestino;
	}

	/**
	 * @return the fechaInicio
	 */
	public Datebox getFechaInicio() {
		return fechaInicio;
	}

	/**
	 * @param fechaInicio
	 *            the fechaInicio to set
	 */
	public void setFechaInicio(Datebox fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	/**
	 * @return the fechaFin
	 */
	public Datebox getFechaFin() {
		return fechaFin;
	}

	/**
	 * @param fechaFin
	 *            the fechaFin to set
	 */
	public void setFechaFin(Datebox fechaFin) {
		this.fechaFin = fechaFin;
	}
}
