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

import java.util.Arrays;
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.Comboitem;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.ConfComprovantePassagem;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.enums.EnumTipoIntegracao;
import com.rjconsultores.ventaboletos.enums.EnumViaComprovantePassagem;
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.RenderConfComprovantePassagem;

@Controller("busquedaIntegracaoCompPassagemController")
@Scope("prototype")
public class BusquedaIntegracaoCompPassagemController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private transient PagedListWrapper<ConfComprovantePassagem> plwConfCompPassagem;

	private MyListbox confComprovantePassagemList;
	private Paging pagingConfCompPassagem;
	private Combobox cmbEmpresa;
	
	private List<Empresa> lsEmpresas;
	
	private List<EnumTipoIntegracao> lsTipoIntegracao;
	private Combobox cmbTipoIntegracao;
	
	private List<EnumViaComprovantePassagem> lsViaComprovante;
	private Combobox cmbViaComprovante;
	
	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(Combobox cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public MyListbox getEmpresaTrocoSimplesList() {
		return confComprovantePassagemList;
	}

	public void setEmpresaTrocoSimplesList(MyListbox empresaTrocoSimplesList) {
		this.confComprovantePassagemList = empresaTrocoSimplesList;
	}

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

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

	public void onClick$btnNovo(Event ev) {
		editar(new ConfComprovantePassagem());
	}
	
	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}


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

		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsTipoIntegracao = Arrays.asList(EnumTipoIntegracao.values());
		lsViaComprovante = Arrays.asList(EnumViaComprovantePassagem.values());
		
		confComprovantePassagemList.setItemRenderer(new RenderConfComprovantePassagem());
		confComprovantePassagemList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				ConfComprovantePassagem e= (ConfComprovantePassagem) confComprovantePassagemList.getSelected();
				editar(e);
			}
		});

		refreshLista();

	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void editar(ConfComprovantePassagem e) {
		if (e == null) {
			return;
		}

		Map args = new HashMap();
		args.put("ConfComprovantePassagem", e);
		args.put("busquedaIntegracaoCompPassagem", this);

		openWindow("/gui/esquema_operacional/integracao/editarIntegracaoCompPassagem.zul",
				Labels.getLabel("editarIntComprovantePassagem.window.title"), args, MODAL);
	}

	public void refreshLista() {
		HibernateSearchObject<ConfComprovantePassagem> confCompPassagemBusqueda =
				new HibernateSearchObject<ConfComprovantePassagem>(ConfComprovantePassagem.class, pagingConfCompPassagem.getPageSize());

		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();

		if (itemEmpresa != null) {
			Empresa empresa = (Empresa) itemEmpresa.getValue();
			confCompPassagemBusqueda.addFilterEqual("empresa", empresa);
		}
		
		Comboitem itemTipoIntegracao = cmbTipoIntegracao.getSelectedItem();

		if (itemTipoIntegracao != null) {
			EnumTipoIntegracao integracao = (EnumTipoIntegracao) itemTipoIntegracao.getValue();
			confCompPassagemBusqueda.addFilterEqual("tipoIntegracao", integracao.toString());
		}
		
		Comboitem itemViaComprovante = cmbViaComprovante.getSelectedItem();

		if (itemViaComprovante != null) {
			EnumViaComprovantePassagem via = (EnumViaComprovantePassagem) itemViaComprovante.getValue();
			confCompPassagemBusqueda.addFilterEqual("viaComprovante", via.toString());
		}

		confCompPassagemBusqueda.addFilterEqual("activo", Boolean.TRUE);
		confCompPassagemBusqueda.addSortAsc("empresa.nombempresa");

		plwConfCompPassagem.init(confCompPassagemBusqueda, confComprovantePassagemList, pagingConfCompPassagem);

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

	public List<EnumTipoIntegracao> getLsTipoIntegracao() {
		return lsTipoIntegracao;
	}

	public void setLsTipoIntegracao(List<EnumTipoIntegracao> lsTipoIntegracao) {
		this.lsTipoIntegracao = lsTipoIntegracao;
	}

	public Combobox getCmbTipoIntegracao() {
		return cmbTipoIntegracao;
	}

	public void setCmbTipoIntegracao(Combobox cmbTipoIntegracao) {
		this.cmbTipoIntegracao = cmbTipoIntegracao;
	}

	public List<EnumViaComprovantePassagem> getLsViaComprovante() {
		return lsViaComprovante;
	}

	public void setLsViaComprovante(List<EnumViaComprovantePassagem> lsViaComprovante) {
		this.lsViaComprovante = lsViaComprovante;
	}

	public Combobox getCmbViaComprovante() {
		return cmbViaComprovante;
	}

	public void setCmbViaComprovante(Combobox cmbViaComprovante) {
		this.cmbViaComprovante = cmbViaComprovante;
	}
}
