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

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
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.constantes.Constantes;
import com.rjconsultores.ventaboletos.entidad.CasetaPeaje;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Peaje;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.service.CalcularPeajeService;
import com.rjconsultores.ventaboletos.service.CasetaPeajeService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaService;
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.RenderPedagio;

@Controller("busquedaAlteracaoPrecoPedagioController")
@Scope("prototype")
public class BusquedaAlteracaoPrecoPedagioController  extends MyGenericForwardComposer {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private Paging pagingPeaje;
	
	private List<OrgaoConcedente> lsOrgaoConcedente;	
	private Combobox cmbOrgaoConcedente;
	private Combobox cmbRuta;
	private Combobox cmbOrigen;
	private Combobox cmbDestino;
	private Combobox cmbEmpresa;
	private Combobox cmbPracaPedagio;
	private MyListbox pedagioList;
	private List<CasetaPeaje> lsPracaPedagio;
	private List<Empresa> lsEmpresa;
	private List<Ruta> lsRuta;
	
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;	
	@Autowired
    private transient PagedListWrapper<Peaje> plwPeaje;	
	@Autowired
	private CalcularPeajeService calcularPeajeService;
	@Autowired
	private CasetaPeajeService casetaPeajeService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private RutaService rutaService;
	
	@Override
    public void doAfterCompose(Component comp) throws Exception {        
		
		lsEmpresa = empresaService.obtenerTodos();
        lsPracaPedagio = casetaPeajeService.obtenerTodos();
        lsRuta = rutaService.obtenerTodos();
        
        Collections.sort(lsPracaPedagio);
        lsOrgaoConcedente = new ArrayList<OrgaoConcedente>();
        for (Integer orgaoConcedenteId : Constantes.ORGAOS_CONCEDENTES_CALCULO_ANTT) {
			lsOrgaoConcedente.add(orgaoConcedenteService.obtenerID(orgaoConcedenteId));
		}
		for (Integer orgaoConcedenteId : Constantes.ORGAOS_CONCEDENTES_CALCULO_ARTESP) {
			lsOrgaoConcedente.add(orgaoConcedenteService.obtenerID(orgaoConcedenteId));
		}
						
		super.doAfterCompose(comp);
		
		pedagioList.setItemRenderer(new RenderPedagio());
		pedagioList.addEventListener("onDoubleClick", new EventListener() {

            @Override
            public void onEvent(Event event) throws Exception {}
        });
        
        refreshLista();
    }

	public OrgaoConcedenteService getOrgaoConcedenteService() {
		return orgaoConcedenteService;
	}

	public void setOrgaoConcedenteService(OrgaoConcedenteService orgaoConcedenteService) {
		this.orgaoConcedenteService = orgaoConcedenteService;
	}

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

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

	public Combobox getCmbOrgaoConcedente() {
		return cmbOrgaoConcedente;
	}

	public void setCmbOrgaoConcedente(Combobox cmbOrgaoConcedente) {
		this.cmbOrgaoConcedente = cmbOrgaoConcedente;
	}

	public MyListbox getPedagioList() {
		return pedagioList;
	}

	public void setPedagioList(MyListbox pedagioList) {
		this.pedagioList = pedagioList;
	}
	
	public void onClick$btnPesquisa(Event ev) throws InterruptedException {
        refreshLista();
    }

	public Combobox getCmbRuta() {
		return cmbRuta;
	}

	public void setCmbRuta(Combobox cmbRuta) {
		this.cmbRuta = cmbRuta;
	}
	
	public void onClick$btnRefresh(Event ev) throws InterruptedException {
        refreshLista();
    }
	
	private void refreshLista() throws InterruptedException {
		
		OrgaoConcedente orgao = (OrgaoConcedente)(cmbOrgaoConcedente.getSelectedItem() != null ? cmbOrgaoConcedente.getSelectedItem().getValue() : null );	
        HibernateSearchObject<Peaje> peajeBusqueda =new HibernateSearchObject<Peaje>(Peaje.class, pagingPeaje.getPageSize());
        
        Integer i= null;
        if(null != orgao) {
        	i = orgao.getOrgaoConcedenteId();
        }
        
        peajeBusqueda.addFilterEqual("activo", Boolean.TRUE);
        peajeBusqueda.addFilterEqual("orgaoConcedente.orgaoConcedenteId", i);
        
        Comboitem comboRuta = cmbRuta.getSelectedItem();
        if(comboRuta != null){
        	Ruta ruta = (Ruta) comboRuta.getValue();
        	peajeBusqueda.addFilterEqual("ruta.rutaId", ruta.getRutaId());
        }
        
        Comboitem cbiOrigem = cmbOrigen.getSelectedItem();
		if (cbiOrigem != null) {
			Parada origen = (Parada) cbiOrigem.getValue();
			peajeBusqueda.addFilterEqual("origem", origen);
		}
        
        Comboitem cbiDestino = cmbDestino.getSelectedItem();
		if (cbiDestino != null) {
			Parada destino = (Parada) cbiDestino.getValue();
			peajeBusqueda.addFilterEqual("destino", destino);
		}
		
		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();
		if (cbiEmpresa != null){
			Empresa e = (Empresa) cmbEmpresa.getSelectedItem().getValue();
			peajeBusqueda.addFilterEqual("ruta.lsRutaEmpresa.empresa", e);
		}		
		
        Comboitem cbiCasetaPeaje = cmbPracaPedagio.getSelectedItem();
		if (cbiCasetaPeaje != null) {
			CasetaPeaje pracaPedagio = (CasetaPeaje) cbiCasetaPeaje.getValue();
			peajeBusqueda.addFilterEqual("casetaPeaje", pracaPedagio);
		}
        
        peajeBusqueda.addSortAsc("casetaPeaje.desccaseta");
        
        plwPeaje.init(peajeBusqueda, pedagioList, pagingPeaje);
    }

	public List<CasetaPeaje> getLsPracaPedagio() {
		return lsPracaPedagio;
	}

	public void setLsPracaPedagio(List<CasetaPeaje> lsPracaPedagio) {
		this.lsPracaPedagio = lsPracaPedagio;
	}

	public Combobox getCmbPracaPedagio() {
		return cmbPracaPedagio;
	}

	public void setCmbPracaPedagio(Combobox cmbPracaPedagio) {
		this.cmbPracaPedagio = cmbPracaPedagio;
	}

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

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

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

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