/*
 * 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.Collections;
import java.util.Comparator;
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.Listheader;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

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.Ruta;
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.service.RutaService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
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
 */
@SuppressWarnings({"serial","rawtypes","unchecked"})
@Controller("busquedaTarifaOficialController")
@Scope("prototype")
public class BusquedaTarifaOficialController extends MyGenericForwardComposer {
	private final static Comparator<Ruta> RUTA_NULL_COMPARATOR = new Comparator<Ruta>() {
        @Override
        public int compare(Ruta lhs, Ruta rhs) {
            if (lhs == null) {
                return -1;
            }
            if (rhs == null) {
                return 1;
            }

            return lhs.toString().compareTo(rhs.toString());
        }
    };

    @Autowired
    private transient PagedListWrapper<TarifaOficial> plwTarifaOficial;
    private Paging pagingTarifaOficial;
    @Autowired
    private MarcaService marcaService;
    @Autowired
    private ClaseServicioService claseServicioService;
    @Autowired
    private RutaService rutaService;
    @Autowired
    private MonedaService monedaService;
    private List<Marca> lsMarcas;
    private List<ClaseServicio> lsClaseServico;
    private List<Ruta> lsRuta;
    private List<Tramo> lsTramos;
    private List<Moneda> lsMonedas;   
    private List<String> lsVende;
    private Combobox cmbOrigem;
    private Combobox cmbDestino;
    private Combobox cmbMarca;
    private Combobox cmbClaseServicio;
    private Combobox cmbRuta;
    private Textbox txbNumRuta;
    private Combobox cmbMoneda;
    private Combobox cmbVigenciaTarifaOficial;
    private MyListbox tarifaList;
    private Listheader listheaderTPP;
    private Combobox cmbVende;

    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 getCmbRuta() {
        return cmbRuta;
    }

    public void setCmbRuta(Combobox cmbRuta) {
        this.cmbRuta = cmbRuta;
    }

    public Textbox getTxbNumRuta() {
        return txbNumRuta;
    }

    public void setTxbNumRuta(Textbox TxbNumRuta) {
        this.txbNumRuta = TxbNumRuta;
    }

    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 List<Ruta> getLsRuta() {
        return lsRuta;
    }

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

    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());
    }
    
    

    public List<String> getLsVende() {
		return lsVende;
	}

	public void setLsVende(List<String> lsVende ) {
		this.lsVende = lsVende;
	}

	@Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        listheaderTPP.setVisible(ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.EXIBE_TPP.getDescricao()));

        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());

        lsRuta = new ArrayList<Ruta>();
        lsRuta.add(0, null);
        for (Ruta ruta: rutaService.obtenerTodos()) {
            lsRuta.add(ruta);
        }
        Collections.sort(lsRuta, RUTA_NULL_COMPARATOR);

        lsMonedas = new ArrayList<Moneda>();
        lsMonedas.add(null);
        lsMonedas.addAll(monedaService.obtenerTodos());
        
       lsVende = new ArrayList();     
       lsVende.add(null);
       lsVende.add("Sim");
       lsVende.add("NÃO");
        

        refreshLista();
    }

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

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

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

    private String getIfFilled(Textbox tb) {
        return tb.getValue().equals("") ? null : tb.getValue();
    }

    private <T> T getIfSelected(Combobox cb) {
        return (T) (cb.getSelectedItem() == null ? null : cb.getSelectedItem().getValue());
    }

    private void refreshLista() throws InterruptedException {
        Parada origem = getIfSelected(cmbOrigem);
        Parada destino = getIfSelected(cmbDestino);
        Marca marca = getIfSelected(cmbMarca);
        ClaseServicio claseServicio = getIfSelected(cmbClaseServicio);
        
        Ruta ruta = getIfSelected(cmbRuta);
        String numRuta = getIfFilled(txbNumRuta);
        Moneda moneda = getIfSelected(cmbMoneda);
        Boolean vende = getIfSelected(cmbVende)!=null?returnStatusVende((String)getIfSelected(cmbVende)):null;

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

            return;
        }

        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;
        }

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

            return;
        }

        if ((numRuta == null) && (!txbNumRuta.getText().isEmpty())) {
            Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Número Linea.",
                    Labels.getLabel("editarTarifaOficialController.window.title"),
                    Messagebox.OK, Messagebox.EXCLAMATION);

            return;
        }
        
        if ((origem == null || destino == null) && (vende != null)) {

			Messagebox.show(Labels.getLabel("modificacionMasivaTarifasController.MSG.informarOrigemEDestino"),
					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("tramo.origem", origem);
		tarifaBusqueda.addFilterEqual("tramo.destino", destino);
		tarifaBusqueda.addFilterEqual("claseServicio", claseServicio);
		tarifaBusqueda.addFilterEqual("ruta", ruta);
		tarifaBusqueda.addFilterEqual("ruta.numRuta", numRuta);
		
		if (vende != null) {
			tarifaBusqueda.addFetch("tramo");
			tarifaBusqueda.addFilterEqual("ruta.rutaCombinacionList.indventa", vende);
			tarifaBusqueda.addFilterEqual("ruta.rutaCombinacionList.tramo.origem", origem);
			tarifaBusqueda.addFilterEqual("ruta.rutaCombinacionList.tramo.destino", destino);
			tarifaBusqueda.addFilterEqual("ruta.rutaCombinacionList.activo", Boolean.TRUE);
		}

        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);
        }
    }
    
    private Boolean returnStatusVende(String stringVende){
    	if(stringVende.equalsIgnoreCase("sim")){
    		 return true;
    	}
    	return false;
    }
}
