/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
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.zul.Combobox;
import org.zkoss.zul.Paging;

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.TarifaOficial;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.MonedaService;
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.RenderTarifaOficial;

/**
 *
 * @author rodrigo
 */
@Controller("busquedaTarifaOficialController")
@Scope("prototype")
public class BusquedaTarifaOficialController extends MyGenericForwardComposer {

    @Autowired
    private transient PagedListWrapper<TarifaOficial> plwTarifaOficial;
    private Paging pagingTarifaOficial;
    @Autowired
    private MarcaService marcaService;
    @Autowired
    private ClaseServicioService claseServicioService;
    @Autowired
    private MonedaService monedaService;
    private List<Marca> lsMarcas;
    private List<ClaseServicio> lsClaseServico;
    private List<Tramo> lsTramos;
    private List<Moneda> lsMonedas;
    private MyListbox tarifaList;
    private Combobox cmbMarca;
    private Combobox cmbOrigem;
    private Combobox cmbDestino;
    private Combobox cmbMoneda;
    private Combobox cmbClaseServicio;
    private Combobox cmbVigenciaTarifaOficial;
    
    private static final Logger log = Logger.getLogger(BusquedaTarifaOficialController.class);



    public Combobox getCmbVigenciaTarifaOficial() {
        return cmbVigenciaTarifaOficial;
    }

    public void setCmbVigenciaTarifaOficial(Combobox cmbVigenciaTarifaOficial) {
        this.cmbVigenciaTarifaOficial = cmbVigenciaTarifaOficial;
    }

    public Combobox getCmbClaseServicio() {
        return cmbClaseServicio;
    }

    public void setCmbClaseServicio(Combobox cmbClaseServicio) {
        this.cmbClaseServicio = cmbClaseServicio;
    }

    public Combobox getCmbMarca() {
        return cmbMarca;
    }

    public void setCmbMarca(Combobox cmbMarca) {
        this.cmbMarca = cmbMarca;
    }

    public Combobox getCmbMoneda() {
        return cmbMoneda;
    }

    public void setCmbMoneda(Combobox cmbMoneda) {
        this.cmbMoneda = cmbMoneda;
    }

    public List<ClaseServicio> getLsClaseServico() {
        return lsClaseServico;
    }

    public void setLsClaseServico(List<ClaseServicio> lsClaseServico) {
        this.lsClaseServico = lsClaseServico;
    }

    public List<Marca> getLsMarcas() {
        return lsMarcas;
    }

    public void setLsMarcas(List<Marca> lsMarcas) {
        this.lsMarcas = lsMarcas;
    }

    public List<Moneda> getLsMonedas() {
        return lsMonedas;
    }

    public void setLsMonedas(List<Moneda> lsMonedas) {
        this.lsMonedas = lsMonedas;
    }

    public List<Tramo> getLsTramos() {
        return lsTramos;
    }

    public void setLsTramos(List<Tramo> lsTramos) {
        this.lsTramos = lsTramos;
    }

    public MyListbox getTarifaOficialList() {
        return tarifaList;
    }

    public void setTarifaOficialList(MyListbox tarifaList) {
        this.tarifaList = tarifaList;
    }

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

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

    public void onClick$btnNovo(Event ev) {
        verTarifaOficial(new TarifaOficial());
    }

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

        tarifaList.setItemRenderer(new RenderTarifaOficial());
        tarifaList.addEventListener("onDoubleClick", new EventListener() {

            @Override
            public void onEvent(Event event) throws Exception {
                TarifaOficial t = (TarifaOficial) tarifaList.getSelected();
                verTarifaOficial(t);
            }
        });

        lsMarcas = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());

        lsClaseServico = new ArrayList<ClaseServicio>();
        lsClaseServico.add(null);
        lsClaseServico.addAll(claseServicioService.obtenerTodos());

        lsMonedas = new ArrayList<Moneda>();
        lsMonedas.add(null);
        lsMonedas.addAll(monedaService.obtenerTodos());

        refreshLista();
    }

    private void verTarifaOficial(TarifaOficial t) {
        if (t == null) {
            return;
        }

        Map args = new HashMap();
        args.put("tarifaOficial", t);
        args.put("tarifaOficialList", tarifaList);

        openWindow("/gui/tarifas/editarTarifaOficial.zul",
                Labels.getLabel("editarTarifaOficialController.window.title"), args, MODAL);
    }

    private void refreshLista() throws InterruptedException {
        Moneda moneda = (Moneda) (cmbMoneda.getSelectedItem() != null ? cmbMoneda.getSelectedItem().getValue() : null);
        Marca marca = (Marca) (cmbMarca.getSelectedItem() != null ? cmbMarca.getSelectedItem().getValue() : null);
        ClaseServicio claseServicio = (ClaseServicio) (cmbClaseServicio.getSelectedItem() != null ? cmbClaseServicio.getSelectedItem().getValue() : null);
        Parada origem = (Parada) (cmbOrigem.getSelectedItem() != null ? cmbOrigem.getSelectedItem().getValue() : null);
        Parada destino = (Parada) (cmbDestino.getSelectedItem() != null ? cmbDestino.getSelectedItem().getValue() : null);

        if ((moneda == null) && (!cmbMoneda.getText().isEmpty())) {
            try {
                Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Moneda.",
                        Labels.getLabel("editarTarifaOficialController.window.title"),
                        Messagebox.OK, Messagebox.EXCLAMATION);

                return;
            } catch (Exception ex) {
                log.error(ex);
            }
        }

        if ((marca == null) && (!cmbMarca.getText().isEmpty())) {
            Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Marca.",
                    Labels.getLabel("editarTarifaOficialController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);

            return;
        }

        if ((claseServicio == null) && (!cmbClaseServicio.getText().isEmpty())) {
            Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Clase servicio.",
                    Labels.getLabel("editarTarifaOficialController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);

            return;
        }

        

        if ((origem == null) && (!cmbOrigem.getText().isEmpty())) {
            Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Origen.",
                    Labels.getLabel("editarTarifaOficialController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);

            return;
        }

        if ((destino == null) && (!cmbDestino.getText().isEmpty())) {
            Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Destino.",
                    Labels.getLabel("editarTarifaOficialController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);

            return;
        }


        HibernateSearchObject<TarifaOficial> tarifaBusqueda =new HibernateSearchObject<TarifaOficial>(TarifaOficial.class, pagingTarifaOficial.getPageSize());
        
        tarifaBusqueda.addFilterEqual("activo", Boolean.TRUE);
        tarifaBusqueda.addFilterEqual("moneda", moneda);
        
        if(marca != null){
        	tarifaBusqueda.addFilterEqual("marca", marca);
        }else{
        	tarifaBusqueda.addFilterIn("marca", lsMarcas);
        }
        tarifaBusqueda.addFilterEqual("claseServicio", claseServicio);
        tarifaBusqueda.addFilterEqual("tramo.origem", origem);
        tarifaBusqueda.addFilterEqual("tramo.destino", destino);

      
        plwTarifaOficial.init(tarifaBusqueda, tarifaList, pagingTarifaOficial);
        if (tarifaList.getData().length == 0) {
        	Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),Labels.getLabel("editarTarifaOficialController.window.title"),Messagebox.OK, Messagebox.INFORMATION);
        }
    }
}
