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

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

import org.apache.log4j.Logger;
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.zkplus.databind.BindingListModel;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.RutaSecuencia;
import com.rjconsultores.ventaboletos.entidad.TaxaEmbLevanteCtrl;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TaxaEmbLevanteCtrlService;
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.RenderTaxaEmbLevanteCtrl;

@Controller("busquedaTaxaEmbLevanteController")
@Scope("prototype")
public class BusquedaTaxaEmbLevanteController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = Logger.getLogger(BusquedaTaxaEmbLevanteController.class);

	@Autowired
	private TaxaEmbLevanteCtrlService taxaEmbLevanteCtrlService;

	@Autowired
	private RutaService rutaService;

	@Autowired
	private transient PagedListWrapper<TaxaEmbLevanteCtrl> plwTaxaEmbLevanteCtrl;

	private MyListbox taxaEmbLevanteCtrlList;
	private TaxaEmbLevanteCtrl taxaEmbLevanteCtrl;

	private Paging pagingTaxaEmbLevanteCtrl;

	private List<Ruta> lsRuta;
	private Combobox cmbRuta;

	private Combobox cmbParadaOrigem;
	private List<Parada> lsParadaOrigem;
	private Combobox cmbParadaDestino;
	private List<Parada> lsParadaDestino;

	@Override
	public void doAfterCompose(Component comp) throws Exception {

		lsRuta = rutaService.obtenerTodos();
		lsParadaOrigem = new ArrayList<Parada>();
		lsParadaDestino = new ArrayList<Parada>();

		super.doAfterCompose(comp);

		taxaEmbLevanteCtrlList.setItemRenderer(new RenderTaxaEmbLevanteCtrl());
		taxaEmbLevanteCtrlList.addEventListener("onClick", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {
				taxaEmbLevanteCtrl = (TaxaEmbLevanteCtrl) taxaEmbLevanteCtrlList.getSelected();
			}
		});

		taxaEmbLevanteCtrlList.addEventListener("onDoubleClick", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {
				taxaEmbLevanteCtrl = (TaxaEmbLevanteCtrl) taxaEmbLevanteCtrlList.getSelected();
				itemSelecionado(taxaEmbLevanteCtrl);
			}
		});

		refreshLista();
	}

	public void onSelect$cmbRuta(Event ev) {
		Ruta ruta = (Ruta) cmbRuta.getSelectedItem().getValue();
		ruta = rutaService.obtenerID(ruta.getRutaId());

		for (RutaSecuencia rutaSecuencia : ruta.getRutaSecuenciaList()) {
			lsParadaOrigem.add(rutaSecuencia.getTramo().getOrigem());
			lsParadaDestino.add(rutaSecuencia.getTramo().getDestino());
		}

		BindingListModel listModelParadaOrigem = new BindingListModelList(lsParadaOrigem, true);
		cmbParadaOrigem.setModel(listModelParadaOrigem);

		BindingListModel listModelParadaDestino = new BindingListModelList(lsParadaDestino, true);
		cmbParadaDestino.setModel(listModelParadaDestino);
	}

	public void onClick$btnNovo(Event ev) {
		itemSelecionado(new TaxaEmbLevanteCtrl());
	}

	public void itemSelecionado(TaxaEmbLevanteCtrl taxa) {
		Map args = new HashMap();
		args.put("taxaEmbLevanteCtrl", taxa);
		args.put("taxaEmbLevanteCtrlList", taxaEmbLevanteCtrlList);

		openWindow("/gui/tarifas/editarTaxaEmbLevante.zul",
				Labels.getLabel("busquedaTaxaEmbLevanteController.editar.window.title"), args, MODAL);
	}

	public void onClick$btnApagar(Event ev) throws InterruptedException {
		try {
			int resp = Messagebox.show(
					Labels.getLabel("busquedaTaxaEmbLevanteController.MSG.borrarPergunta"),
					Labels.getLabel("busquedaTaxaEmbLevanteController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {
				taxaEmbLevanteCtrlService.borrar(taxaEmbLevanteCtrl);
				Messagebox.show(
						Labels.getLabel("busquedaTaxaEmbLevanteController.MSG.borrarOK"),
						Labels.getLabel("busquedaTaxaEmbLevanteController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				taxaEmbLevanteCtrlList.removeItem(taxaEmbLevanteCtrl);

			}
		} catch (Exception ex) {
			log.error("Erro apagar pricing : " + ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("busquedaTaxaEmbLevanteController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}
	}

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

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

	public void refreshLista() {
		HibernateSearchObject<TaxaEmbLevanteCtrl> busquedaTaxaEmbLevanteCtrl =
				new HibernateSearchObject<TaxaEmbLevanteCtrl>(TaxaEmbLevanteCtrl.class,
						pagingTaxaEmbLevanteCtrl.getPageSize());
		Comboitem rutaItem = cmbRuta.getSelectedItem();
		if (rutaItem != null){
			Ruta ruta = (Ruta) rutaItem.getValue();
			busquedaTaxaEmbLevanteCtrl.addFilterEqual("ruta", ruta);	
		}
		
		Comboitem origenItem = cmbParadaOrigem.getSelectedItem();
		if (origenItem != null){
			Parada origen = (Parada) origenItem.getValue();
			busquedaTaxaEmbLevanteCtrl.addFilterEqual("origem", origen);
		}
		
		Comboitem destinoItem = cmbParadaDestino.getSelectedItem();
		if (destinoItem != null){
			Parada destino = (Parada) destinoItem.getValue();
			busquedaTaxaEmbLevanteCtrl.addFilterEqual("destino", destino);
		}
		
		busquedaTaxaEmbLevanteCtrl.addFilterEqual("activo", Boolean.TRUE);
		busquedaTaxaEmbLevanteCtrl.addSortAsc("ruta.descruta");

		plwTaxaEmbLevanteCtrl.init(busquedaTaxaEmbLevanteCtrl, taxaEmbLevanteCtrlList, pagingTaxaEmbLevanteCtrl);

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

	public MyListbox getTaxaEmbLevanteCtrlList() {
		return taxaEmbLevanteCtrlList;
	}

	public void setTaxaEmbLevanteCtrlList(MyListbox taxaEmbLevanteCtrlList) {
		this.taxaEmbLevanteCtrlList = taxaEmbLevanteCtrlList;
	}

	public Paging getPagingTaxaEmbLevanteCtrl() {
		return pagingTaxaEmbLevanteCtrl;
	}

	public void setPagingTaxaEmbLevanteCtrl(Paging pagingTaxaEmbLevanteCtrl) {
		this.pagingTaxaEmbLevanteCtrl = pagingTaxaEmbLevanteCtrl;
	}

	public List<Ruta> getLsRuta() {
		return lsRuta;
	}

	public void setLsRuta(List<Ruta> lsRuta) {
		this.lsRuta = lsRuta;
	}

	public List<Parada> getLsParadaOrigem() {
		return lsParadaOrigem;
	}

	public void setLsParadaOrigem(List<Parada> lsParadaOrigem) {
		this.lsParadaOrigem = lsParadaOrigem;
	}

	public List<Parada> getLsParadaDestino() {
		return lsParadaDestino;
	}

	public void setLsParadaDestino(List<Parada> lsParadaDestino) {
		this.lsParadaDestino = lsParadaDestino;
	}

	public PagedListWrapper<TaxaEmbLevanteCtrl> getPlwTaxaEmbLevanteCtrl() {
		return plwTaxaEmbLevanteCtrl;
	}

	public void setPlwTaxaEmbLevanteCtrl(PagedListWrapper<TaxaEmbLevanteCtrl> plwTaxaEmbLevanteCtrl) {
		this.plwTaxaEmbLevanteCtrl = plwTaxaEmbLevanteCtrl;
	}

}
