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

import java.util.ArrayList;
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.Intbox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.GrupoRuta;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.GrupoRutaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
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.RenderCatalogoDeRutas;
import com.trg.search.Filter;

/**
 * 
 * @author Rafius
 */
@Controller("busquedaCatalogoDeRutaController")
@Scope("prototype")
public class BusquedaCatalogoDeRutaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private transient PagedListWrapper<Ruta> plwRuta;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	@Autowired
	private ClaseServicioService claseServicioServicce;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private GrupoRutaService grupoRutaService;
	private List<ClaseServicio> lsClaseServicio;
	private List<OrgaoConcedente> lsOrgaoConcedente;
	private List<GrupoRuta> lsGrupoRuta;
	private List<Empresa> lsEmpresa;
	private MyListbox rutaList;
	private Paging pagingRuta;
	private Textbox txtNombre;
	private Textbox txtNumRuta;
	private Intbox txtId;
	private Combobox cmbClaseServicio;
	private Combobox cmbOrgaoConcedente;
	private Combobox cmbGrupoRuta;
	private Combobox cmbEmpresa;
	

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}

	public List<ClaseServicio> getLsClaseServicio() {
		return lsClaseServicio;
	}

	public void setLsClaseServicio(List<ClaseServicio> lsClaseServicio) {
		this.lsClaseServicio = lsClaseServicio;
	}

	public List<OrgaoConcedente> getLsOrgaoConcedente() {
		return lsOrgaoConcedente;
	}

	public void setLsOrgaoConcedente(List<OrgaoConcedente> lsOrgaoConcedente) {
		this.lsOrgaoConcedente = lsOrgaoConcedente;
	}

	public List<GrupoRuta> getLsGrupoRuta() {
		return lsGrupoRuta;
	}

	public void setLsGrupoRuta(List<GrupoRuta> lsGrupoRuta) {
		this.lsGrupoRuta = lsGrupoRuta;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();		
		lsClaseServicio = claseServicioServicce.buscarPorEmpresasDoUsuario(lsEmpresa);
		lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();
		lsGrupoRuta = grupoRutaService.obtenerTodos();		
		
		super.doAfterCompose(comp);

		rutaList.setItemRenderer(new RenderCatalogoDeRutas());
		rutaList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				Ruta c = (Ruta) rutaList.getSelected();
				verRuta(c);
			}
		});

		refreshLista();

		txtId.focus();
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void verRuta(Ruta c) {
		if (c == null) {
			return;
		}

		Map args = new HashMap();
		args.put("ruta", c);
		args.put("rutaList", rutaList);

		openWindow("/gui/esquema_operacional/editarRuta.zul",
				Labels.getLabel("editarCatalogoDeRutaController.window.title"), args, MODAL);
	}

	private void refreshLista() {
		HibernateSearchObject<Ruta> rutaBusqueda =
				new HibernateSearchObject<Ruta>(Ruta.class, pagingRuta.getPageSize());
		rutaBusqueda.addFilterEqual("activo", Boolean.TRUE);
		
		if (cmbEmpresa.getSelectedIndex() >= 0){
			Empresa e = (Empresa)cmbEmpresa.getSelectedItem().getValue();
			rutaBusqueda.addFilterAll("lsRutaEmpresa", Filter.equal("empresa.empresaId", e.getEmpresaId()));
		} else {
			rutaBusqueda.addFilterAll("lsRutaEmpresa", Filter.in("empresa.empresaId", getIdEmpresas(lsEmpresa)));			
		}

		rutaBusqueda.addFilterNotEqual("rutaId", -1);
		if (txtId.getValue() != null) {
			rutaBusqueda.addFilterEqual("rutaId", txtId.getValue());
		}
		
		if(txtNumRuta.getValue() != null && !txtNumRuta.getValue().isEmpty()) {
			rutaBusqueda.addFilterEqual("numRuta", txtNumRuta.getValue());
		}

		rutaBusqueda.addFilterLike("descruta", "%" + txtNombre.getText().trim().concat("%"));

		Comboitem cbiClaseServicio = cmbClaseServicio.getSelectedItem();
		if (cbiClaseServicio != null) {
			ClaseServicio claseServicio = (ClaseServicio) cbiClaseServicio.getValue();
			rutaBusqueda.addFilterEqual("claseServicio", claseServicio);
		}

		Comboitem cbiGrupoRuta = cmbGrupoRuta.getSelectedItem();
		if (cbiGrupoRuta != null) {
			GrupoRuta grupoRuta = (GrupoRuta) cbiGrupoRuta.getValue();
			rutaBusqueda.addFilterEqual("grupoRuta", grupoRuta);
		}

		Comboitem cbiOrgaoConcedente = cmbOrgaoConcedente.getSelectedItem();
		if (cbiOrgaoConcedente != null) {
			OrgaoConcedente orgaoConcedente = (OrgaoConcedente) cbiOrgaoConcedente.getValue();
			rutaBusqueda.addFilterEqual("orgaoConcedente", orgaoConcedente);
		}

		rutaBusqueda.addSortAsc("descruta");

		plwRuta.init(rutaBusqueda, rutaList, pagingRuta);
		if (rutaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("busquedaCatalogoDeRutaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	private List<Integer> getIdEmpresas(List<Empresa> lsEmpresa2) {
				
		if(lsEmpresa2 == null || lsEmpresa2.isEmpty()) {
			return null;
		}
		
		List<Integer> ids = new ArrayList<Integer>();
		for (Empresa empresa : lsEmpresa2) {
			ids.add(empresa.getEmpresaId());
		}
		
		return ids;
	}

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

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

	public void onClick$btnNovo(Event ev) {
		verRuta(new Ruta());
	}
	
}