
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.catalogos;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.lang.StringUtils;
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.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Groupbox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.ConfTotem;
import com.rjconsultores.ventaboletos.entidad.ConfTotemVentaRapida;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.TipoPuntoVenta;
import com.rjconsultores.ventaboletos.service.ConfTotemService;
import com.rjconsultores.ventaboletos.service.ConfTotemVentaRapidaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.TipoPuntoVentaService;
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.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfTotemVentaRapidaOrigemDestino;

/**
 *
 * @author Wallace
 */
@Controller("busquedaConfTotemController")
@Scope("prototype")
public class BusquedaConfTotemController extends MyGenericForwardComposer {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Autowired
	private ConfTotemService confTotemService;
	private Checkbox chkPermitirTecladoAlfaNumerico;
	private Checkbox chkPermitirVenda;
	private Checkbox chkTituloInicial;
	private Checkbox chkSeguroTabela;
	private Checkbox chkPagamentoMultiempresaBPe;
	private Checkbox chkPermitirImpressao;
	private Checkbox chkPermitirReserva;
	private Checkbox chktrabalhaComParcelamento;
	private Checkbox chkImprimeComprovanteCartaoEmpresaCorrida;
	private Checkbox chktListarPassageiroUltimaPoltrona;
	private Checkbox chkPermitirVendaRapida;
	private Checkbox chkIndImprime2Via;
	private static Logger log = LogManager.getLogger(BusquedaConfTotemController.class);
	private MyListbox empresaList;
	private MyListbox bandeirasList;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private ConfTotemVentaRapidaService confTotemVentaRapidaOrigemDestinoService;
	private List<Empresa> lsEmpresa;
	private List<String> lsBandeiras;
	private Combobox cmbEmpresa;
	private Combobox cmbBandeira;
	private Combobox cmbParadaOrigem;
	private Combobox cmbParadaDestino;
	private MyListbox localidadesOrigemDestinoList;
	@Autowired
	private transient PagedListWrapper<ConfTotemVentaRapida> plwOrigensDestinosVentaRapida;
	private Paging pagingOrigensDestinosVentaRapida;
	private MyTextboxDecimal txtPrecioParcelaMinima;
	private Groupbox groupBoxEmailObrigatorio;
	private Groupbox groupBoxTelefoneObrigatorio;
	private Checkbox chkIndExibeEmail;
	private Checkbox chkIndExibeTelefone;
	private Checkbox chkIndEmailObrigatorio;
	private Checkbox chkIndTelefoneObrigatorio;
	private Checkbox chkIndMostrarInfoCorrida;
	private Checkbox chkIndNoChequeFolioPreimpresos;
	
	private MyListbox canalVentaList;
	private List<TipoPuntoVenta> lsCanalVenta;
	@Autowired
	private TipoPuntoVentaService tipoPuntoVentaService;
	private Combobox cmbCanalVenta;
	

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsEmpresa = empresaService.obtenerTodos();
		lsCanalVenta = tipoPuntoVentaService.obtenerTodos();
		getLsBandeiras();
		localidadesOrigemDestinoList.setItemRenderer(new RenderConfTotemVentaRapidaOrigemDestino());

		refreshLista();
	}
	
	/**
	 * Adicione ao <tt>Map</tt> o nome customizado do componente e o componente para
	 * preencher os valores na hora de salvar e carregar a tela.
	 * 
	 * Tipos desenvolvidos:
	 * <p>
	 * {@link Checkbox}
	 * <p>
	 * <p>
	 * {@link Textbox}
	 * <p>
	 * <p>
	 * {@link MyTextboxDecimal}
	 * <p>
	 * <p>
	 * {@link Spinner}
	 * <p>
	 */
	private Map<String, Object> preencheComponentesComValores() {

		Map<String, Object> map = new HashMap<String, Object>();

		map.put("isAlphaNumericKeyboard", chkPermitirTecladoAlfaNumerico);
		map.put("isVendaHabilitado", chkPermitirVenda);
		map.put("isImpressaoHabilitado", chkPermitirImpressao);
		map.put("isReservaHabilitado", chkPermitirReserva);
		map.put("isTituloInicialDesabilitado", chkTituloInicial);
		map.put("isSeguroTabelaViraOpcional", chkSeguroTabela);
		map.put("isPagamentoMultiempresaBPe", chkPagamentoMultiempresaBPe);
		map.put("isImprimeComprovanteCartaoEmpresaCorrida", chkImprimeComprovanteCartaoEmpresaCorrida);
		map.put("trabalhaComParcelamentoCartaoCredito", chktrabalhaComParcelamento);
		map.put("listarPassageiro", chktListarPassageiroUltimaPoltrona);
		map.put("isVendaRapidaHabilitado", chkPermitirVendaRapida);
		map.put("valorParcelaMinima", txtPrecioParcelaMinima);
		map.put("indEmiteSegundaVia", chkIndImprime2Via);
		map.put("exibeTelefone", chkIndExibeTelefone);
		map.put("telefoneObrigatorio", chkIndTelefoneObrigatorio); 
		map.put("exibeEmail", chkIndExibeEmail); 
		map.put("isMostrarInfoCorrida", chkIndMostrarInfoCorrida); 
		map.put("isNaoValidarFolioPreimpressos", chkIndNoChequeFolioPreimpresos);
		
		return map;

	}

	private void refreshLista() {

		List<ConfTotem> lista = confTotemService.obtenerTodos();

		if (lista.size() == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("customController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				log.error(ex);
			}
		} else {
			Map<String, String> map = new HashMap<String, String>();
			for (ConfTotem confTotem : lista) {
				map.put(confTotem.getChave(), confTotem.getValor());
			}

			List<Empresa> lsEmpresas = new ArrayList<Empresa>();
			if(StringUtils.isNotBlank(map.get("empresasParaVenda"))) {
				String[] empresas = map.get("empresasParaVenda").split(",");

				for (int i = 0; i < empresas.length; i++) {
					lsEmpresas.add(empresaService.obtenerID(Integer.valueOf(empresas[i])));
				}
			}
			
			List<TipoPuntoVenta> lsTipoPuntoVenta = new ArrayList<TipoPuntoVenta>();
			if(StringUtils.isNotBlank(map.get("canalDeVendaParaEmissao2Via"))) {
				String[] tipoPuntoVenta = map.get("canalDeVendaParaEmissao2Via").split(",");

				for (int i = 0; i < tipoPuntoVenta.length; i++) {
					lsTipoPuntoVenta.add(tipoPuntoVentaService.obtenerID(Short.valueOf(tipoPuntoVenta[i])));
				}
			}
			
			List<String> lsBandeirasCartao = new ArrayList<String>();
			if(StringUtils.isNotBlank(map.get("bandeirasCartao"))) {
				String[] bandeiras = map.get("bandeirasCartao").split(",");

				for (int i = 0; i < bandeiras.length; i++) {
					lsBandeirasCartao.add(bandeiras[i]);
				}
			}
			
			for (Entry<String, Object> entry : this.preencheComponentesComValores().entrySet()) {
				String key = entry.getKey();
				Object value = entry.getValue();
				setarValoresComponentes(map, key, value);
			}
			if(map.get("exibeTelefone") != null && Boolean.TRUE.equals(Boolean.parseBoolean(map.get("exibeTelefone")))) {
				groupBoxTelefoneObrigatorio.setVisible(Boolean.TRUE);
			}
			if(map.get("exibeEmail") != null && Boolean.TRUE.equals(Boolean.parseBoolean(map.get("exibeEmail")))) {
				groupBoxEmailObrigatorio.setVisible(Boolean.TRUE);
			}
	
			empresaList.setData(lsEmpresas);
			bandeirasList.setData(lsBandeirasCartao);
			canalVentaList.setData(lsTipoPuntoVenta);
			
			buscarOrigenDestinosVentaRapida();

		}
	}

	public void buscarOrigenDestinosVentaRapida() {

		localidadesOrigemDestinoList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				ConfTotemVentaRapida confTotemVentaRapidaOrigemDestino = (ConfTotemVentaRapida) localidadesOrigemDestinoList.getSelected();
				if(confTotemVentaRapidaOrigemDestino != null){
					visualizaOrigens(confTotemVentaRapidaOrigemDestinoService.buscarOrigem(confTotemVentaRapidaOrigemDestino.getOrigen()).get(0));
				}
			}
		});
		
		HibernateSearchObject<ConfTotemVentaRapida> origensDestinoVentaRapida = new HibernateSearchObject<ConfTotemVentaRapida>(ConfTotemVentaRapida.class, pagingOrigensDestinosVentaRapida.getPageSize());

		Comboitem cbi = cmbParadaOrigem.getSelectedItem();
		if (cbi != null) {
			Parada origem = (Parada) cbi.getValue();
			origensDestinoVentaRapida.addFilterEqual("origen", origem);
		}

		cbi = cmbParadaDestino.getSelectedItem();
		if (cbi != null) {
			Parada destino = (Parada) cbi.getValue();
			origensDestinoVentaRapida.addFilterEqual("destino", destino);
		}


		origensDestinoVentaRapida.addSortAsc("origen");
		origensDestinoVentaRapida.addSortAsc("destino");
		origensDestinoVentaRapida.addFilterEqual("activo", Boolean.TRUE);

		plwOrigensDestinosVentaRapida.init(origensDestinoVentaRapida, localidadesOrigemDestinoList, pagingOrigensDestinosVentaRapida);

						
	}

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

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

	@SuppressWarnings("unchecked")
	public void onClick$buttonSalvar(Event ev) throws InterruptedException {

		try {
//			cantCorrida.getValue();

			List<ConfTotem> lista = confTotemService.obtenerTodos();

			Map<String, ConfTotem> map = new HashMap<String, ConfTotem>();
			for (ConfTotem confTotem : lista) {
				map.put(confTotem.getChave(), confTotem);
			}

			for (Entry<String, Object> entry : this.preencheComponentesComValores().entrySet()) {
				String key = entry.getKey();
				Object value = entry.getValue();
				salvarValoresComponentes(map, key, value);
			}

			ConfTotem novoItem = new ConfTotem();
			novoItem.setActivo(Boolean.TRUE);
			novoItem.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			novoItem.setFecmodif(new Date());

			ConfTotem confTotem = map.get("empresasParaVenda");
			List<Empresa> lsEmpresas = empresaList.getListData();
			StringBuilder sb = new StringBuilder();
			for (Empresa empresa : lsEmpresas) {
				sb.append(empresa.getEmpresaId()).append(",");
			}

			if (!sb.toString().isEmpty()) {
				sb.delete(sb.length() - 1, sb.length());
			}

			if (confTotem != null) {
				confTotem.setValor(sb.toString());
				confTotemService.actualizacion(confTotem);
			} else {
				novoItem = new ConfTotem();
				novoItem.setChave("empresasParaVenda");
				novoItem.setValor(sb.toString());

				confTotemService.suscribir(novoItem);
			}
			
			
			
			confTotem = map.get("canalDeVendaParaEmissao2Via");
			List<TipoPuntoVenta> lsTipoPuntoVentas = canalVentaList.getListData();
			sb = new StringBuilder();
			for (TipoPuntoVenta tipoPuntoVenta : lsTipoPuntoVentas) {
				sb.append(tipoPuntoVenta.getTipoptovtaId()).append(",");
			}

			if (!sb.toString().isEmpty()) {
				sb.delete(sb.length() - 1, sb.length());
			}

			if (confTotem != null) {
				confTotem.setValor(sb.toString());
				confTotemService.actualizacion(confTotem);
			} else {
				novoItem = new ConfTotem();
				novoItem.setChave("canalDeVendaParaEmissao2Via");
				novoItem.setValor(sb.toString());

				confTotemService.suscribir(novoItem);
			}

			
			

			confTotem = map.get("bandeirasCartao");
			List<String> lsBandeirasCartao = bandeirasList.getListData();
			sb = new StringBuilder();
			for (String bandeira : lsBandeirasCartao) {
				sb.append(bandeira).append(",");
			}

			if (!sb.toString().isEmpty()) {
				sb.delete(sb.length() - 1, sb.length());
			}

			if (confTotem != null) {
				confTotem.setValor(sb.toString());
				confTotemService.actualizacion(confTotem);
			} else {
				novoItem = new ConfTotem();
				novoItem.setChave("bandeirasCartao");
				novoItem.setValor(sb.toString());

				confTotemService.suscribir(novoItem);
			}

			Messagebox.show(Labels.getLabel("busquedaConfTotemController.MSG.suscribirOK"),
					Labels.getLabel("busquedaConfTotemController.window.title"), Messagebox.OK, Messagebox.INFORMATION);

		} catch (Exception ex) {
			log.error("", ex);
		}
	}
	
	private void salvarValoresComponentes(Map<String, ConfTotem> mapTodos, String nomeComponente, Object componente) {

		ConfTotem confTotem = mapTodos.get(nomeComponente);

		String valueComponent = null;

		if (componente instanceof Checkbox) {
			valueComponent = String.valueOf(((Checkbox) componente).isChecked());
		} else if (componente instanceof Textbox) {
			valueComponent = ((Textbox) componente).getValue();
		} else if (componente instanceof MyTextboxDecimal) {
			valueComponent = ((MyTextboxDecimal) componente).getValue();
		} else if (componente instanceof Spinner) {
			valueComponent = String.valueOf(((Spinner) componente).getValue());
		} else {
			valueComponent = (componente != null ? componente.toString() : null);
		}

		if (confTotem != null) {
			confTotem.setValor(valueComponent);
			confTotem.setFecmodif(new Date());
			confTotem.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			confTotemService.actualizacion(confTotem);
		} else {
			ConfTotem novoItem = new ConfTotem();
			novoItem.setActivo(Boolean.TRUE);
			novoItem.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			novoItem.setFecmodif(new Date());
			novoItem.setChave(nomeComponente);
			novoItem.setValor(valueComponent);
			confTotemService.suscribir(novoItem);
		}

	}
	
	private void setarValoresComponentes(Map<String, String> mapTodos, String nomeComponente, Object componente) {
		if (componente instanceof Checkbox) {
			((Checkbox) componente).setChecked(StringUtils.isBlank(mapTodos.get(nomeComponente)) ? false : Boolean.parseBoolean(mapTodos.get(nomeComponente)));
		} else if (componente instanceof Textbox) {
			((Textbox) componente).setValue(StringUtils.isBlank(mapTodos.get(nomeComponente)) ? null : mapTodos.get(nomeComponente));
		} else if (componente instanceof MyTextboxDecimal) {
			((MyTextboxDecimal) componente).setValue(StringUtils.isBlank(mapTodos.get(nomeComponente)) ? "0" : mapTodos.get(nomeComponente));
		} else if (componente instanceof Spinner) {
			((Spinner) componente).setValue(StringUtils.isBlank(mapTodos.get(nomeComponente)) ? 0 : Integer.parseInt(mapTodos.get(nomeComponente)));
		} 
	}
	
	public void onClick$btnAddEmpresa(Event ev) {
		
		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();
		if (cbiEmpresa != null) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();
			if(!empresaList.getListData().contains(empresa)){
				empresaList.addItemNovo(empresa);
			}			
		}
	}
	public void onClick$btnRemEmpresa(Event ev) {
		if (empresaList.getSelected() == null) {
			return;
		}
		empresaList.removeSelectedItem();

	}
	
	public void onClick$btnAddbandeira(Event ev) {
		
		Comboitem cbiBandeira = cmbBandeira.getSelectedItem();
		if (cbiBandeira != null) {
			String empresa = (String) cbiBandeira.getValue();
			if(!bandeirasList.getListData().contains(empresa)){
				bandeirasList.addItemNovo(empresa);
			}		
		}
	}
	public void onClick$btnRemBandeira(Event ev) {
		if (bandeirasList.getSelected() == null) {
			return;
		}
		bandeirasList.removeSelectedItem();

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

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}
	
	
	public List<String> getLsBandeiras() {
		lsBandeiras = new ArrayList<String>();
		lsBandeiras.add("ELO");
		lsBandeiras.add("DINNERS");
		lsBandeiras.add("AMERICAN EXPRESS");
		lsBandeiras.add("VISA");
		lsBandeiras.add("MASTER CARD");
		lsBandeiras.add("TODOS");
		return lsBandeiras;
	}

	public void setLsBandeiras(List<String> lsBandeiras) {
		this.lsBandeiras = lsBandeiras;
	}


	
	private void visualizaOrigens(ConfTotemVentaRapida confTotemVentaRapidaOrigemDestino){
		
		if (confTotemVentaRapidaOrigemDestino == null)
			return;
		
		Map args = new HashMap();
		args.put("confTotemVentaRapidaOrigemDestino", confTotemVentaRapidaOrigemDestino);
		args.put("busquedaConfTotemController",  this);

		openWindow("/gui/catalogos/editarConfTotemVentaRapida.zul",
				Labels.getLabel("editarConfTotemController.window.title"), args, MODAL);
		
	}
	
	public void onClick$btnNovo(Event ev) {
		visualizaOrigens(new ConfTotemVentaRapida());
	}
	
	public void onCheck$chkIndExibeEmail() {
		if(chkIndExibeEmail.isChecked()){
			groupBoxEmailObrigatorio.setVisible(Boolean.TRUE);
		} else {
			groupBoxEmailObrigatorio.setVisible(Boolean.FALSE);
			chkIndEmailObrigatorio.setChecked(Boolean.FALSE);
		}
	}
	
	public void onCheck$chkIndExibeTelefone() {
		if(chkIndExibeTelefone.isChecked()){
			groupBoxTelefoneObrigatorio.setVisible(Boolean.TRUE);
		} else {
			groupBoxTelefoneObrigatorio.setVisible(Boolean.FALSE);
			chkIndTelefoneObrigatorio.setChecked(Boolean.FALSE);
		}
	}
	
	
	public void onClick$btnAddCanalVenta(Event ev) {
		
		Comboitem cbiCanalVenta = cmbCanalVenta.getSelectedItem();
		if (cbiCanalVenta != null) {
			TipoPuntoVenta tipoPuntoVenta = (TipoPuntoVenta) cbiCanalVenta.getValue();
			if(!canalVentaList.getListData().contains(tipoPuntoVenta)){
				canalVentaList.addItemNovo(tipoPuntoVenta);
			}			
		}
	}
	public void onClick$btnRemCanalVenta(Event ev) {
		if (canalVentaList.getSelected() == null) {
			return;
		}
		canalVentaList.removeSelectedItem();

	}

	public List<TipoPuntoVenta> getLsCanalVenta() {
		return lsCanalVenta;
	}

	public void setLsCanalVenta(List<TipoPuntoVenta> lsCanalVenta) {
		this.lsCanalVenta = lsCanalVenta;
	}
	
	
}
