/**
 * 
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.esquemaoperacional.flexbus;

import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
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.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Corrida;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.enums.StatusFlexBus;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.RutaService;
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.RenderCorridaFlexBus;

/**
 * @author Valdir Cordeiro
 *
 */
@Controller("busqueCorridaFlexBusController")
@Scope("prototype")
public class BuqueCorridaFlexBusController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private ClaseServicioService claseService;
	@Autowired
	private RutaService rutaService;
	
	private Datebox fecInicio;
	private Datebox fecFinal;
	private Combobox cmbClase;
	private Combobox cmbStatus;
	private Combobox cmbRuta;
	private Combobox cmbEmpresaCorrida;
	private List<Empresa> lsEmpresa;
	private List<StatusFlexBus> lsStatus;
	private List<ClaseServicio> lsClase;
	private List<Ruta> lsRuta;
	private Button btnPesquisa;
	private Intbox txtNumCorrida;
	private Checkbox chkNaoIncluirLinhaInativa;
	
	private MyListbox corridaList;
	
	@Autowired
	private transient PagedListWrapper<Corrida> plwCorrida;
	private Paging pagingCorrida;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsStatus = Arrays.asList(StatusFlexBus.values());
		lsClase = claseService.obtenerTodos();
		lsRuta = rutaService.obtenerTodos();
		
		fecInicio.setValue(new Date());
		fecFinal.setValue(new Date());
		
		corridaList.setItemRenderer(new RenderCorridaFlexBus());
		corridaList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				Corrida rc = (Corrida) corridaList.getSelected();
				verCorrida(rc);
			}
		});
		
		btnPesquisa.focus();
		cmbStatus.setSelectedItem(null);
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void verCorrida(Corrida rc) {
		if (rc == null) {
			return;
		}

		Map args = new HashMap();
		args.put("corrida", rc);
		args.put("busqueCorridaFlexBusController", this);
		args.put("corridaList", corridaList);

		openWindow("/gui/esquema_operacional/flexbus/editarCorridaFlexBus.zul", Labels.getLabel("editarConfiguracionCorridaController.window.title"), args, MODAL);
	}
	
	public void onClick$chkNaoIncluirLinhaInativa(Event ev) {
		if (chkNaoIncluirLinhaInativa.isChecked()) {
			for (Iterator<Ruta> it = lsRuta.iterator(); it.hasNext();) {
				Ruta ruta = it.next();
				if (Boolean.TRUE.equals(ruta.getIndRutaCancelada())) {
					it.remove();
				}
			}
		} else {
			//Volta aos itens iniciais
			if (cmbEmpresaCorrida.getSelectedItem()==null) {
				lsRuta = rutaService.obtenerTodos();
			} else {
				lsRuta = rutaService.obtenerPorEmpresa(((Empresa) cmbEmpresaCorrida.getSelectedItem().getValue()));
			}
		}
		
		BindingListModelList l = new BindingListModelList(lsRuta, true);
		cmbRuta.setModel(l);
		cmbRuta.setSelectedItem(null);
	}
	
	public void onClick$btnRefresh(Event ev) {
		refreshLista();
	}
	
	@SuppressWarnings("deprecation")
	public void refreshLista() {
		
		HibernateSearchObject<Corrida> busquedaCorrita = new HibernateSearchObject<Corrida>(Corrida.class, pagingCorrida.getPageSize());

		busquedaCorrita.addFilterEqual("activo", 1);
		
		busquedaCorrita.addFilterEqual("isFlexBus", Boolean.TRUE);

		Integer numCorrida = txtNumCorrida.getValue();
		if(numCorrida != null) {
			busquedaCorrita.addFilterEqual("id.corridaId", numCorrida);
		}

		Comboitem cbiClase = cmbClase.getSelectedItem();
		ClaseServicio claseServicio = null;
		if (cbiClase != null) {
			claseServicio = (ClaseServicio) cbiClase.getValue();
			busquedaCorrita.addFilterEqual("claseServicio", claseServicio);
		}

		Comboitem cbiStatus = cmbStatus.getSelectedItem();
		StatusFlexBus status = null;
		if (cbiStatus != null) {
			status = (StatusFlexBus) cbiStatus.getValue();
			busquedaCorrita.addFilterEqual("statusFlexBus", status.getStatus());
		}

		Comboitem cbiRuta = cmbRuta.getSelectedItem();
		Ruta ruta = null;
		if (cbiRuta != null) {
			ruta = (Ruta) cbiRuta.getValue();
			busquedaCorrita.addFilterEqual("ruta", ruta);
		}

		Comboitem cbiEmpresa = cmbEmpresaCorrida.getSelectedItem();
		Empresa empresa = null;
		if (cbiEmpresa != null) {
			empresa = (Empresa) cbiEmpresa.getValue();
			busquedaCorrita.addFilterEqual("empresa", empresa);
		} else {
			busquedaCorrita.addFilterIn("empresa", lsEmpresa);
		}

		if (fecInicio.getValue() != null) {
			Date ini = fecInicio.getValue();
			ini.setHours(00);
			ini.setMinutes(00);
			ini.setSeconds(00);
			busquedaCorrita.addFilterGreaterOrEqual("fechorsalida", ini);
		}

		if (fecFinal.getValue() != null) {
			Date fin = fecFinal.getValue();
			fin.setHours(23);
			fin.setMinutes(59);
			fin.setSeconds(59);
			busquedaCorrita.addFilterLessOrEqual("fechorsalida", fin);
		}
		busquedaCorrita.addSortAsc("fechorsalida");

		plwCorrida.init(busquedaCorrita, corridaList, pagingCorrida);

		if (corridaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("busquedaConfiguracionCorridaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}
	
	public void onClick$btnPesquisa(Event ev) throws InterruptedException {
		refreshLista();
	}

	public MarcaService getMarcaService() {
		return marcaService;
	}

	public void setMarcaService(MarcaService marcaService) {
		this.marcaService = marcaService;
	}

	public ClaseServicioService getClaseService() {
		return claseService;
	}

	public void setClaseService(ClaseServicioService claseService) {
		this.claseService = claseService;
	}

	public RutaService getRutaService() {
		return rutaService;
	}

	public void setRutaService(RutaService rutaService) {
		this.rutaService = rutaService;
	}

	public Datebox getFecInicio() {
		return fecInicio;
	}

	public void setFecInicio(Datebox fecInicio) {
		this.fecInicio = fecInicio;
	}

	public Datebox getFecFinal() {
		return fecFinal;
	}

	public void setFecFinal(Datebox fecFinal) {
		this.fecFinal = fecFinal;
	}

	public Combobox getCmbClase() {
		return cmbClase;
	}

	public void setCmbClase(Combobox cmbClase) {
		this.cmbClase = cmbClase;
	}

	public Combobox getCmbStatus() {
		return cmbStatus;
	}

	public void setCmbStatus(Combobox cmbStatus) {
		this.cmbStatus = cmbStatus;
	}

	public Combobox getCmbRuta() {
		return cmbRuta;
	}

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

	public Combobox getCmbEmpresaCorrida() {
		return cmbEmpresaCorrida;
	}

	public void setCmbEmpresaCorrida(Combobox cmbEmpresaCorrida) {
		this.cmbEmpresaCorrida = cmbEmpresaCorrida;
	}

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

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

	public List<StatusFlexBus> getLsStatus() {
		return lsStatus;
	}

	public void setLsStatus(List<StatusFlexBus> lsStatus) {
		this.lsStatus = lsStatus;
	}

	public List<ClaseServicio> getLsClase() {
		return lsClase;
	}

	public void setLsClase(List<ClaseServicio> lsClase) {
		this.lsClase = lsClase;
	}

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

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

	public Button getBtnPesquisa() {
		return btnPesquisa;
	}

	public void setBtnPesquisa(Button btnPesquisa) {
		this.btnPesquisa = btnPesquisa;
	}

	public Intbox getTxtNumCorrida() {
		return txtNumCorrida;
	}

	public void setTxtNumCorrida(Intbox txtNumCorrida) {
		this.txtNumCorrida = txtNumCorrida;
	}

	public Checkbox getChkNaoIncluirLinhaInativa() {
		return chkNaoIncluirLinhaInativa;
	}

	public void setChkNaoIncluirLinhaInativa(Checkbox chkNaoIncluirLinhaInativa) {
		this.chkNaoIncluirLinhaInativa = chkNaoIncluirLinhaInativa;
	}

	public MyListbox getCorridaList() {
		return corridaList;
	}

	public void setCorridaList(MyListbox corridaList) {
		this.corridaList = corridaList;
	}

	public PagedListWrapper<Corrida> getPlwCorrida() {
		return plwCorrida;
	}

	public void setPlwCorrida(PagedListWrapper<Corrida> plwCorrida) {
		this.plwCorrida = plwCorrida;
	}

	public Paging getPagingCorrida() {
		return pagingCorrida;
	}

	public void setPagingCorrida(Paging pagingCorrida) {
		this.pagingCorrida = pagingCorrida;
	}
}
