/*

 * 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.logging.log4j.LogManager;
import org.apache.logging.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.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Listheader;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.constantes.ConstantesFuncionSistema;
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.TarifaEmbarcada;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.Via;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
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.service.TarifaEmbarcadaService;
import com.rjconsultores.ventaboletos.service.ViaService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
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.RenderTarifaEmbarcada;

// Mantis 16087

@SuppressWarnings("serial")
@Controller("busquedaTarifaEmbarcadaController")
@Scope("prototype")
public class BusquedaTarifaEmbarcadaController extends MyGenericForwardComposer {
	
	private static Logger log = LogManager.getLogger(BusquedaTarifaEmbarcadaController.class);
	
	@Autowired
	private transient PagedListWrapper<TarifaEmbarcada> plwTarifa;
	private Paging pagingTarifa;

	@Autowired
	private TarifaEmbarcadaService tarifaEmbarcadaService;

	@Autowired
	private MarcaService marcaService;
	
	@Autowired
	private ClaseServicioService claseServicioService;
	
	@Autowired
	private MonedaService monedaService;
	
	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	
	@Autowired
	private RutaService rutaService;
	
	@Autowired
	private ViaService viaService;
	
	private List<Marca> lsMarcas;
	private List<ClaseServicio> lsClaseServico;
	private List<Tramo> lsTramos;
	private List<Moneda> lsMonedas;
	private List<VigenciaTarifa> lsVigencias;
	private List<Ruta> lsRuta;
	private List<Via> lsVia;
	private List<String> lsVende;
	private MyListbox tarifaList;
	private Combobox cmbMarca;
	private Combobox cmbOrigem;
	private Combobox cmbDestino;
	private Combobox cmbMoneda;
	private Combobox cmbClaseServicio;
	private Combobox cmbVigenciaTarifa;
	private Combobox cmbRuta;
	private Combobox cmbVia;
	private Button btnExcluirTodos;
	private Moneda moneda;
	private Marca marca;
	private ClaseServicio claseServicio;
	private VigenciaTarifa vigenciaTarifa;
	private Parada origem;
	private Parada destino;
	private Ruta ruta;
	private Via via;
	private Listheader listheaderTPP;
	private Combobox cmbVende;
	private Boolean vende;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		listheaderTPP.setVisible(ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.EXIBE_TPP.getDescricao()));
		this.cmbMarca.addEventListener("onChange", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {
				Marca marca = getIfSelected(cmbMarca);

				lsRuta = new ArrayList<Ruta>();
				lsRuta.add(null);
				if (marca != null) {
					lsRuta.addAll(rutaService.obtenerPorEmpresa(marca.getEmpresa()));
				} else {
					lsRuta.addAll(rutaService.obtenerTodos());
				}

				refreshLista(true);
				cmbRuta.setModel(new BindingListModelList(lsRuta, true));

			}
		});

		tarifaList.setItemRenderer(new RenderTarifaEmbarcada());
		tarifaList.addEventListener("onDoubleClick", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {
				TarifaEmbarcada t = (TarifaEmbarcada) tarifaList.getSelected();
				verTarifa(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());

		lsVigencias = new ArrayList<VigenciaTarifa>();
		lsVigencias.add(null);
		lsVigencias.addAll(vigenciaTarifaService.obtenerTodos());

		lsVia = new ArrayList<Via>();
		lsVia.add(null);
		lsVia.addAll(viaService.obtenerTodos());

		lsVende = new ArrayList<String>();
		lsVende.add(null);
		lsVende.add("Sim");
		lsVende.add("NÃO");

		if (!temPermissao(ConstantesFuncionSistema.CLAVE_TARIFAS_DESABILITAR_BOTAO_EXCLUIR_TODOS)) {
			btnExcluirTodos.setDisabled(true);
		}

		refreshLista(true);
	}

	private void verTarifa(TarifaEmbarcada t) {
		if (t == null) {
			return;
		}

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

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

	public void onClick$btnExcluirTodos(Event ev) throws InterruptedException {
		try {

			if (moneda == null && marca == null && claseServicio == null && vigenciaTarifa == null
					&& origem == null && destino == null && ruta == null && via == null) {

				Messagebox.show(
						Labels.getLabel("editarTarifaController.btnFechar.MSG.pesquisaobrigatoria"),
						Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				return;
			}

			int opcao = Messagebox.show(
					Labels.getLabel("editarTarifaController.btnFechar.MSG.Deseja.BorrarEmLote"),
					Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (opcao == Messagebox.YES) {
				tarifaEmbarcadaService.excluirTodasTarifas(moneda, marca, claseServicio, vigenciaTarifa, origem, destino, ruta, via, vende);

				Messagebox.show(
						Labels.getLabel("editarTarifaController.btnFechar.MSG.borrarEmLoteOK"),
						Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}

		} catch (Exception ex) {
			log.error(ex);
		}
		refreshLista(false);
	}

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

	public void onClick$btnNovo(Event ev) {
		verTarifa(new TarifaEmbarcada());
	}
	
	@SuppressWarnings("unchecked")
	private <T> T getIfSelected(Combobox cb) {
		return (T) (cb.getSelectedItem() != null ? cb.getSelectedItem().getValue() : null);
	}

	public Button getBtnExcluirTodos() {
		return btnExcluirTodos;
	}

	public void setBtnExcluirTodos(Button btnExcluirTodos) {
		this.btnExcluirTodos = btnExcluirTodos;
	}

	private void refreshLista(Boolean exibirMsgNenhumRegistro) throws InterruptedException {
		moneda = getIfSelected(cmbMoneda);
		marca = getIfSelected(cmbMarca);
		claseServicio = getIfSelected(cmbClaseServicio);
		vigenciaTarifa = getIfSelected(cmbVigenciaTarifa);
		origem = getIfSelected(cmbOrigem);
		destino = getIfSelected(cmbDestino);
		ruta = getIfSelected(cmbRuta);
		via = getIfSelected(cmbVia);
		vende = getIfSelected(cmbVende) != null ? returnStatusVende((String) getIfSelected(cmbVende)) : null;
		
		boolean origemEmpty = ((origem == null) && (!cmbOrigem.getText().isEmpty()));
		boolean destinoEmpty = ((destino == null) && (!cmbDestino.getText().isEmpty()));

		if ((moneda == null) && (!cmbMoneda.getText().isEmpty())) {

			Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Moneda.",
					Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if ((marca == null) && (!cmbMarca.getText().isEmpty())) {
			Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Marca.",
					Labels.getLabel("editarTarifaEmbarcadaController.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("editarTarifaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if ((vigenciaTarifa == null) && (!cmbVigenciaTarifa.getText().isEmpty())) {
			Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Vigencia Tarifa.",
					Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if (origemEmpty) {
			Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Origen.",
					Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if (destinoEmpty) {
			Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Destino.",
					Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}


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

			return;
		}

		if ((via == null) && (!cmbVia.getText().isEmpty())) {
			Messagebox.show(Labels.getLabel("MSG.SELECCIONE.VALOR.CORRECTO") + " Via.",
					Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

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

			Messagebox.show(Labels.getLabel("modificacionMasivaTarifasController.MSG.informarOrigemEDestino"),
					Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		HibernateSearchObject<TarifaEmbarcada> tarifaBusqueda = new HibernateSearchObject<TarifaEmbarcada>(TarifaEmbarcada.class, pagingTarifa.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("vigenciaTarifa", vigenciaTarifa);
		tarifaBusqueda.addFilterEqual("tramo.origem", origem);
		tarifaBusqueda.addFilterEqual("tramo.destino", destino);


		if (ruta != null) {
			tarifaBusqueda.addFilterEqual("ruta", ruta);
		}

		if (via != null) {
			tarifaBusqueda.addFilterEqual("tramo.via", via);
		}
		
		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);

		}
		
		plwTarifa.init(tarifaBusqueda, tarifaList, pagingTarifa);
		
		if (tarifaList.getData().length == 0 && exibirMsgNenhumRegistro) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("editarTarifaEmbarcadaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}

		HabilitarBotaoExcluirTodos();
	}

	private void HabilitarBotaoExcluirTodos() {
		if (moneda != null || marca != null || claseServicio != null || vigenciaTarifa != null 
				|| origem != null || destino != null || ruta != null || via != null) {
			Boolean selecionouAoMenosUmCampoPesquisa = true;
			if (selecionouAoMenosUmCampoPesquisa && tarifaList.getSize() > 0 && temPermissao(ConstantesFuncionSistema.CLAVE_TARIFAS_DESABILITAR_BOTAO_EXCLUIR_TODOS)) {
				btnExcluirTodos.setDisabled(false);
			} else {
				btnExcluirTodos.setDisabled(true);
			}
		}
	}

	private Boolean returnStatusVende(String stringVende) {
		if (stringVende.equalsIgnoreCase("sim")) {
			return true;
		}
		return false;
	}
	
	public void onClick$btnPesquisa(Event ev) throws InterruptedException {
		refreshLista(true);
	}

	private boolean temPermissao(String permissao) {
		return UsuarioLogado.getUsuarioLogado().isPermisoClave(permissao);
	}

	public Combobox getCmbVende() {
		return cmbVende;
	}

	public void setCmbVende(Combobox cmbVende) {
		this.cmbVende = cmbVende;
	}

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

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

	public void setLsVigencias(List<VigenciaTarifa> lsVigencias) {
		this.lsVigencias = lsVigencias;
	}

	public Combobox getCmbVigenciaTarifa() {
		return cmbVigenciaTarifa;
	}

	public void setCmbVigenciaTarifa(Combobox cmbVigenciaTarifa) {
		this.cmbVigenciaTarifa = cmbVigenciaTarifa;
	}

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

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

	public Combobox getCmbVia() {
		return cmbVia;
	}

	public void setCmbVia(Combobox cmbVia) {
		this.cmbVia = cmbVia;
	}

	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 getTarifaList() {
		return tarifaList;
	}

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

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

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

	public List<Via> getLsVia() {
		return lsVia;
	}

	public void setLsVia(List<Via> lsVia) {
		this.lsVia = lsVia;
	}
}
