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

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
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.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zkplus.databind.BindingListModel;
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.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Listheader;
import org.zkoss.zul.Longbox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estacion;
import com.rjconsultores.ventaboletos.entidad.EstacionImpresora;
import com.rjconsultores.ventaboletos.entidad.EstacionRioCard;
import com.rjconsultores.ventaboletos.entidad.EstacionSitef;
import com.rjconsultores.ventaboletos.enums.TipoImpressora;
import com.rjconsultores.ventaboletos.enums.TipoImpressoraRelatorio;
import com.rjconsultores.ventaboletos.enums.TipoIntegracaoTEF;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.EstacionService;
import com.rjconsultores.ventaboletos.service.EstacionSitefService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.EstacionRioCardRender;
import com.rjconsultores.ventaboletos.web.utilerias.render.EstacionSitefRender;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEstacionImpresora;

/**
 * 
 * @author Administrador
 */
@Controller("editarEstacionController")
@Scope("prototype")
public class EditarEstacionController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	
	@Autowired
	private EstacionService estacionService;

	@Autowired
	private EstacionSitefService estacionSitefService;
	
	private MyListbox estacionList;
	private MyListbox estacionSitefList;
	private MyListbox estacionImpresoraList;
	private MyListbox estacionRioCardList;
	private Combobox cmbEmpresa;
	private Combobox cmbEmpresaImpressora;
	private Combobox cmbEmpresaRioCard;
	private Combobox cmbTipoImpressora;
	private Combobox cmbEstacion;
	private Combobox cmbIntegracaoTef;
	private Button btnApagar;
	private Textbox txtDescEstacion;
	private Textbox txtNomImpressoraBPe;
	private Textbox txtDescMac;
	private Textbox txtIMEI;
	private Textbox txtIpServidor;
	private Longbox txtNumCaja;
	private Estacion estacion;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private Textbox txtNumEmpresa;
	private Intbox txtNumFilial;
	private Textbox txtCnpjTef;
	private Textbox txtNumPdv;
	private Textbox txtSenhaConfig;
	private Textbox txtOperadora;
	private Textbox txtNumeroDeSerie;
	private Textbox txtDescricao;
	private List<Empresa> lsEmpresa;
	private List<EstacionSitef> lsEstacionSitef;
	private List<EstacionRioCard> lsEstacionRiocard;
	private List<EstacionImpresora> lsEstacionImpresora;
	private List<String> lsTipoImpressora;

	private static Logger log = LogManager.getLogger(EditarEstacionController.class);
	private Textbox txtNomImpressora;
	private Textbox txtNomImpressoraSeguro;
	private Textbox txtNomImpressoraRelatorio;
	private Combobox cmbTpImpressoraRelatorio;
	private Textbox txtNomeArquivoLayout;
	private Radio rdPausarImpressoraNo;
	private Radio rdPausarImpressoraSi;
	private Radio rdTerminalMultiploNo;
	private Radio rdTerminalMultiploSi;
	private Tab tabRioCard;
	private Label lblLibercard;
	private Checkbox chkUtilizaCartaoLibercard;
	private Row rowUtilizaCartaoLibercard;
	
	private Checkbox chkStockCentral;
	private Checkbox chkVoucherBPe;
	private Label lblNomeArquivoLayoutInternacional;
	private Textbox txtNomeArquivoLayoutInternacional;
	private Listheader colunmNomeArquivoLayoutIternacional;
	private Checkbox chkMapaViagemImpTermica;
	
	private Row rowNumeroDeSerie;
	private Row rowDescricao;
	private Listheader colunmNumeroDeSerie;
	private Listheader colunmDescricao;

	public Estacion getEstacion() {
		return estacion;
	}

	public void setEstacion(Estacion estacion) {
		this.estacion = estacion;
	}

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

	public List<String> getLsTipoImpressora() {
		return lsTipoImpressora;
	}

	public void setLsTipoImpressora(List<String> lsTipoImpressora) {
		this.lsTipoImpressora = lsTipoImpressora;
	}

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

		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsTipoImpressora = getTiposImpressora();
		estacionSitefList.setItemRenderer(new EstacionSitefRender());
		estacion = (Estacion) Executions.getCurrent().getArg().get("estacion");
		estacionList = (MyListbox) Executions.getCurrent().getArg().get("estacionList");
		estacionSitefList.setItemRenderer(new EstacionSitefRender());
		estacionImpresoraList.setItemRenderer(new RenderEstacionImpresora());
		estacionRioCardList.setItemRenderer(new EstacionRioCardRender());

		validaHabilitacaoCampos();
		
		if (estacion.getEstacionId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
		} else {
			// Convertendo a mascara em Hexa novamente.
			if (estacion.getDescmac() != null && !estacion.getDescmac().equals("")) {
				Long hx = Long.parseLong(estacion.getDescmac(), 10);
				String descMac = Long.toHexString(hx);
				while (descMac.length() < 12) {
					descMac = "0" + descMac;
				}
				// AABBCCDDEEFF
				// AA-BB-CC-DD-EE-FF
				descMac = descMac.substring(0, 2).concat("-").concat(descMac.substring(2, 4).concat("-")).concat(descMac.substring(4, 6)).concat("-").concat(descMac.substring(6, 8)).concat("-").concat(descMac.substring(8, 10).concat("-")).concat(descMac.substring(10, 12));

				txtDescMac.setText(descMac.toUpperCase());
			}

			estacion = estacionService.obtenerID(estacion.getEstacionId());

			lsEstacionSitef = estacion.getEstacionSitefList();
			estacionSitefList.setData(lsEstacionSitef);

			lsEstacionRiocard = estacion.getEstacionRioCardList();
			estacionRioCardList.setData(lsEstacionRiocard);

			lsEstacionImpresora = estacion.getLsEstacionImpresora();
			estacionImpresoraList.setData(lsEstacionImpresora);
			
			carregarComboTipoImpressora();

			if (estacion.getPausarImpressora() != null) {
				if (estacion.getPausarImpressora()) {
					rdPausarImpressoraSi.setChecked(Boolean.TRUE);
				} else {
					rdPausarImpressoraNo.setChecked(Boolean.TRUE);
				}
			}
			if (estacion.getTerminalMultiplo() != null) {
				if (estacion.getTerminalMultiplo()) {
					rdTerminalMultiploSi.setChecked(Boolean.TRUE);
				} else {
					rdTerminalMultiploNo.setChecked(Boolean.TRUE);
				}
			}
			
			if(estacion.getIndStockCentral() != null && 
					estacion.getIndStockCentral()){
				chkStockCentral.setChecked(Boolean.TRUE);
			}else{
				chkStockCentral.setChecked(Boolean.FALSE);
			}
		}
		
		txtIMEI.setText(estacion.getImei() == null ? "" : estacion.getImei());
		txtIMEI.setTooltip(Labels.getLabel("editarEstacionController.tooltip.imei"));
		
		txtNomImpressoraBPe.setTooltip(Labels.getLabel("editarEstacionController.tooltip.impressorabpe"));
		txtNomImpressoraSeguro.setTooltip(Labels.getLabel("editarEstacionController.tooltip.impressorarelatorio"));
		txtNomImpressoraRelatorio.setTooltip(Labels.getLabel("editarEstacionController.tooltip.impressoraseguro"));
		txtDescEstacion.focus();
	}

	private void carregarComboTipoImpressora() {
		for (TipoImpressoraRelatorio tipoImpresoraRelatorio : TipoImpressoraRelatorio.values()) {
			Comboitem comboItem = new Comboitem(tipoImpresoraRelatorio.getDescricao());
			comboItem.setValue(tipoImpresoraRelatorio.getId());
			comboItem.setParent(cmbTpImpressoraRelatorio);
		}
	}

	private void validaHabilitacaoCampos() {
		ApplicationProperties instance = ApplicationProperties.getInstance();
		validaHabilitacaoCamposRioCard(instance)
		.validaHabilitacaoCamposCartaoLiberCard(instance)
		.validaHabilitacaoLayoutInternacional(instance);
	}

	private EditarEstacionController validaHabilitacaoCamposRioCard(ApplicationProperties instance) {
		if (instance.isCustomHabilitado(CustomEnum.INTEGRACION_RIOCARD.getDescricao())) {
			tabRioCard.setVisible(true);
		}
		return this;
	}

	private EditarEstacionController validaHabilitacaoCamposCartaoLiberCard(ApplicationProperties instance) {
		if (instance.isCustomHabilitado(CustomEnum.UTILLIZA_CARTAO_LIBERCARD.getDescricao())) {
			lblLibercard.setVisible(true);
			chkUtilizaCartaoLibercard.setVisible(true);
			rowUtilizaCartaoLibercard.setVisible(true);
		}
		return this;
	}

	private void validaHabilitacaoLayoutInternacional(ApplicationProperties instance) {
		if (instance.isCustomHabilitado(CustomEnum.IS_PERMITE_LAYOUT_INTERNACIONAL.getDescricao())) {
			lblNomeArquivoLayoutInternacional.setVisible(true);
			txtNomeArquivoLayoutInternacional.setVisible(true);
			colunmNomeArquivoLayoutIternacional.setVisible(true);
		}
	}

	private List<String> getTiposImpressora() {
		List<String> tiposImpressora = new ArrayList<String>();
		for (TipoImpressora tipo : TipoImpressora.values()) {
			tiposImpressora.add(tipo.getNome());
		}
		return tiposImpressora;
	}

	@SuppressWarnings("unchecked")
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		cmbPuntoVenta.getValue(true);
		txtNumEmpresa.getValue();
		txtNumFilial.getValue();
		txtNumPdv.getValue();
		txtDescEstacion.getValue();
		txtNomImpressoraBPe.getValue();
		txtNumCaja.getValue();
		txtOperadora.getValue();

		String descMac = txtDescMac.getText();
		String imei = txtIMEI.getText();
		
		boolean indStockCentral = chkStockCentral.isChecked();
		boolean imeiPreenchido = !imei.isEmpty();
		
		if (!indStockCentral) {
			String strMAC = txtDescMac.getText();

	        strMAC = strMAC.replaceAll("-", "");

	        if (imeiPreenchido && strMAC.isEmpty()) {
	        } else {
		        if (strMAC.length() != 12) {
		        	Clients.alert(Labels.getLabel("MSG.CONSTRAINT.MACConstraint")
		        			,Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
		        	return;
		        }

		        try {
		            Long.parseLong(strMAC, 16);
		        } catch (Throwable t) {
		        	Clients.alert(Labels.getLabel("MSG.CONSTRAINT.MACConstraint"),
		        			Labels.getLabel("editarEstacionController.window.title"),Messagebox.INFORMATION);
		        	return;
		        }
	        }
	        
	        if (strMAC.isEmpty()) {
		        if (imei.isEmpty()) {
		        	Clients.alert(Labels.getLabel("MSG.CONSTRAINT.IMEIConstraint")
		        			,Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
		        	return;
		        }
	        }
	        
	        Long numCaja = txtNumCaja.getValue();
	        
	        if(numCaja == null){
	        	Clients.alert(Labels.getLabel("msg.constraint.cajaObligatorio"), 
	        			Labels.getLabel("editarEstacionController.window.title"), 	Messagebox.INFORMATION);
	        	return;
	        }
		}

		estacion.setActivo(Boolean.TRUE);
		estacion.setFecmodif(Calendar.getInstance().getTime());
		estacion.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		estacion.setIndVoucher(chkVoucherBPe.isChecked());
		estacion.setIndMapaViagemImpTermica(chkMapaViagemImpTermica.isChecked());
		
		if(descMac != null && !descMac.equals("")){
			estacion.setDescmac(estacionService.getDecimalMAC(descMac).toString());
		} else {
			estacion.setDescmac(null);
		}

		estacion.setImei(imei == null || imei.isEmpty() ? null : imei);
		
		if (rdPausarImpressoraSi.isChecked()) {
			estacion.setPausarImpressora(Boolean.TRUE);
		} else if (rdPausarImpressoraNo.isChecked()) {
			estacion.setPausarImpressora(Boolean.FALSE);
		}
		if (rdTerminalMultiploSi.isChecked()) {
			estacion.setTerminalMultiplo(Boolean.TRUE);
		} else if (rdTerminalMultiploNo.isChecked()) {
			estacion.setTerminalMultiplo(Boolean.FALSE);
		}
		estacion.setIndStockCentral(indStockCentral);

		try {
			estacion.setEstacionSitefList(estacionSitefList.getListData());
			estacion.setEstacionRioCardList(estacionRioCardList.getListData());
			estacion.setLsEstacionImpresora(estacionImpresoraList.getListData());

			estacionService.suscribirActualizar(estacion);

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

			estacionList.updateItem(estacion);

			closeWindow();
		} catch (BusinessException e) {
			Messagebox.show(e.getMessage(), Labels.getLabel("editarEstacionController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}

	}

	public void onClick$btnApagar(Event ev) {
		try {
			int resp = Messagebox.show(Labels.getLabel("editarEstacionController.MSG.borrarPergunta"),
					Labels.getLabel("editarEstacionController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {
				estacionService.borrar(estacion);

				Messagebox.show(Labels.getLabel("editarEstacionController.MSG.borrarOK"),
						Labels.getLabel("editarEstacionController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				estacionList.removeItem(estacion);

				closeWindow();
			}
		} catch (BusinessException ex) {
			Clients.alert(ex.getLocalizedMessage(),
					Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
		} catch (Exception ex) {
			log.error(ex);
			Clients.alert(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
		}
	}

	public void onClick$btnAddConfSitef(Event e) throws InterruptedException {

		if(!validarCampos()) {
			return;
		}
		
		TipoIntegracaoTEF tipoIntegracaoTEF = (TipoIntegracaoTEF) cmbIntegracaoTef.getSelectedItem().getValue();

		final Integer empresaId = ((Empresa) cmbEmpresa.getSelectedItem().getValue()).getEmpresaId();

		boolean empresaExiste = CollectionUtils.exists(estacionSitefList.getListData(), new Predicate() {

			@Override
			public boolean evaluate(Object obj) {

				EstacionSitef e = (EstacionSitef) obj;

				return (e.getActivo() && e.getEmpresa().getEmpresaId().equals(empresaId));

			}
		});

		if (empresaExiste) {
			Clients.alert(Labels.getLabel("editarEstacionController.MSG.empresaYaExiste"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
			return;
		}

		EstacionSitef es = new EstacionSitef();
		es.setActivo(Boolean.TRUE);
		es.setEmpresa((Empresa) cmbEmpresa.getSelectedItem().getValue());
		es.setFecmodif(Calendar.getInstance().getTime());
		es.setEstacion(estacion);
		es.setNumempresa(txtNumEmpresa.getValue());
		es.setNumfilial(txtNumFilial.getValue());
		es.setNumpdv(txtNumPdv.getValue());
		es.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		es.setIpServidor(txtIpServidor.getValue());
		es.setTipoIntegracao(tipoIntegracaoTEF);
		es.setCnpj(txtCnpjTef.getValue());
		es.setSenhaConfig(txtSenhaConfig.getValue());
		es.setNumeroDeSerie(txtNumeroDeSerie.getValue());
		es.setDescricao(txtDescricao.getValue());		
		
		if (estacion.getPuntoVenta() == null){
			Clients.alert(Labels.getLabel("editarEstacionController.MSG.sinPuntoVenta"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
			
			return ;
		}
		
		EstacionSitef estacionSitefTemp = estacionSitefService.parametrizacaoJahExiste(es.getEmpresa(), es.getTipoIntegracao(), es.getNumpdv(), es.getNumfilial(),estacion.getPuntoVenta());
	
		if (estacionSitefTemp != null) {
			Clients.alert(Labels.getLabel("editarEstacionController.MSG.singularidadError", new String[] { estacionSitefTemp.getEstacion().getDescestacion() }), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
			return;
		}

		estacionSitefList.addItemNovo(es);

	}

	private boolean validarCampos() throws InterruptedException {
		if (cmbIntegracaoTef.getSelectedItem() == null) {
			Clients.alert(Labels.getLabel("editarEstacionController.MSG.integracaoTef"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
			return false;
		}
		
		txtNumEmpresa.getValue();
		txtNumFilial.getValue();
		txtNumPdv.getValue();
		txtIpServidor.getValue();
		txtCnpjTef.getValue();
		txtSenhaConfig.getValue();
		
		TipoIntegracaoTEF tipoIntegracaoTEF = (TipoIntegracaoTEF) cmbIntegracaoTef.getSelectedItem().getValue();
		
		if(StringUtils.isNotBlank(txtNumEmpresa.getValue()) && StringUtils.isNotBlank(txtNumEmpresa.getValue().replaceAll("\\d", ""))) {
			Messagebox.show(Labels.getLabel("editarEstacionController.MSG.numEmpresa", new Object[] {Labels.getLabel("editarEstacionController.lbNumEmpresa.value")}),
					Labels.getLabel("editarEstacionController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		if(TipoIntegracaoTEF.SITEF.equals(tipoIntegracaoTEF)) {
			if ((cmbEmpresa.getSelectedItem() == null) || (txtNumEmpresa.getValue() == null) || (txtNumFilial.getValue() == null) || (txtNumPdv.getValue() == null) || (txtIpServidor.getValue() == null)) {
				Clients.alert(Labels.getLabel("editarEstacionController.MSG.sitef"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
				return false;
			}
		}

		if(TipoIntegracaoTEF.PAYGO.equals(tipoIntegracaoTEF)) {
			if ((cmbEmpresa.getSelectedItem() == null) || (txtNumEmpresa.getValue() == null) || (txtCnpjTef.getValue() == null) || (txtNumPdv.getValue() == null) || (txtIpServidor.getValue() == null)) {
				Clients.alert(Labels.getLabel("editarEstacionController.MSG.paygo"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
				return false;
			}
		}
		
		if(TipoIntegracaoTEF.GRANITO.equals(tipoIntegracaoTEF)) {
			if (cmbEmpresa.getSelectedItem() == null ||
				txtCnpjTef.getValue() == null ||
				txtNumPdv.getValue() == null ||
				txtSenhaConfig.getValue() == null) {
				Clients.alert(Labels.getLabel("editarEstacionController.MSG.granito"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
				return false;
			}
		}
		
		return true;
	}


	public void onClick$btnRemConfSitef(Event e) {
		if (estacionSitefList.getSelected() == null) {
			return;
		}

		EstacionSitef es = (EstacionSitef) estacionSitefList.getSelected();
		
		//Verifica se o usuario tem permissão para remover a empresa
		if(!lsEmpresa.contains(es.getEmpresa())) {
			Clients.alert(Labels.getLabel("editarEstacionController.MSG.UsuarioSemPermissaoEmpresa"), 
					Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
			return;
		}

		estacionSitefList.removeSelectedItem();

		if (es.getEstacionsitefId() != null) {
			es.setFecmodif(Calendar.getInstance().getTime());
			es.setActivo(Boolean.FALSE);
			es.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			estacionSitefList.addItemNovo(es);
		}
	}

	public void onClick$btnAddConfRioCard(Event e) {
		Comboitem cbiEmpresa = cmbEmpresaRioCard.getSelectedItem();
		String operadora = txtOperadora.getValue();
		if (cbiEmpresa != null && StringUtils.isNotBlank(operadora)) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();

			final Integer empresaId = empresa.getEmpresaId();

			boolean empresaExiste = CollectionUtils.exists(estacionRioCardList.getListData(), new Predicate() {

				@Override
				public boolean evaluate(Object obj) {

					EstacionRioCard e = (EstacionRioCard) obj;

					return (e.getActivo() && e.getEmpresa().getEmpresaId().equals(empresaId));

				}
			});

			if (empresaExiste) {
				Clients.alert(Labels.getLabel("editarEstacionController.MSG.empresaYaExiste"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);

				return;
			}

			EstacionRioCard estacionRioCard = new EstacionRioCard();
			estacionRioCard.setEmpresa(empresa);
			estacionRioCard.setEstacion(estacion);
			estacionRioCard.setOperadora(operadora);
			estacionRioCard.setActivo(Boolean.TRUE);
			estacionRioCard.setFecmodif(Calendar.getInstance().getTime());
			estacionRioCard.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			estacionRioCardList.addItemNovo(estacionRioCard);
		}
	}

	public void onClick$btnRemConfRioCard(Event ev) {
		if (estacionRioCardList.getSelected() == null) {
			return;
		}

		EstacionRioCard rc = (EstacionRioCard) estacionRioCardList.getSelected();
		
		//Verifica se o usuario tem permissão para remover a empresa
		if(!lsEmpresa.contains(rc.getEmpresa())) {
			Clients.alert(Labels.getLabel("editarEstacionController.MSG.UsuarioSemPermissaoEmpresa"), 
					Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
			return;
		}
		
		estacionImpresoraList.removeSelectedItem();

		if (rc.getEstacionRioCardId() != null) {
			rc.setFecmodif(Calendar.getInstance().getTime());
			rc.setActivo(Boolean.FALSE);
			rc.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			estacionRioCardList.addItemNovo(rc);

		}
	}

	public void onClick$btnAddEstacionImpresora(Event ev) {
		Comboitem cbiEmpresa = cmbEmpresaImpressora.getSelectedItem();
		if (cbiEmpresa != null) {
			String nomeImpresora = txtNomImpressora.getValue();

			if (StringUtils.isBlank(nomeImpresora)) {
				Clients.alert(Labels.getLabel("editarEstacionController.MSG.nomeImpressora"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
				return;
			}			
			
			Empresa empresa = (Empresa) cbiEmpresa.getValue();

			final Integer empresaId = empresa.getEmpresaId();

			boolean empresaExiste = validarImpressoraJaCadastrada(empresaId, nomeImpresora);

			if (empresaExiste) {
				Clients.alert(Labels.getLabel("editarEstacionController.MSG.empresaYaExiste"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);

				return;
			}

			if (cmbTipoImpressora.getSelectedItem() == null) {
				Clients.alert(Labels.getLabel("editarEstacionController.MSG.nomeImpressora"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
				return;
			}
			
			Comboitem cbiEstacion = cmbEstacion.getSelectedItem();
			Estacion estacionCentral = null;
			
			String valor = ((Comboitem) cmbTipoImpressora.getSelectedItem()).getValue().toString();
			if (valor.equals(TipoImpressora.STOCK_CENTRAL.getNome())){
				if(estacion.getIndStockCentral() == null || 
						!estacion.getIndStockCentral()){
					if(cbiEstacion == null){
						Clients.alert(Labels.getLabel("editarEstacionController.MSG.nomeImpressora"), 
								Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
						return;
					}else{
						estacionCentral = (Estacion)cbiEstacion.getValue();
					}
				}
			}
			

			EstacionImpresora estacionImpresora = new EstacionImpresora();
			estacionImpresora.setEmpresa(empresa);
			estacionImpresora.setEstacion(estacion);
			estacionImpresora.setNombImpresora(nomeImpresora);
			estacionImpresora.setNombArchivoLayout(txtNomeArquivoLayout.getValue());
			estacionImpresora.setActivo(Boolean.TRUE);
			estacionImpresora.setFecmodif(Calendar.getInstance().getTime());
			estacionImpresora.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			estacionImpresora.setTipoImpressora(getTipoImpressora());
			estacionImpresora.setEstacionCentral(estacionCentral);
			estacionImpresora.setNombArchivoLayoutIternacional(txtNomeArquivoLayoutInternacional.getValue());

			estacionImpresoraList.addItemNovo(estacionImpresora);

		}
	}

	/**
	 * Mantis #8978
	 * Valida se a impressora pode ser adicionada.
	 * Se a propriedade "PermiteVariasImpressorasMesmaEmpresa" estiver ativada, valida a empresa e o nome da impressora,<br>
	 * caso não esteja ativada, consiste apenas a empresa.
	 * @param empresaId
	 * @param nomeImpresora
	 * @return
	 */
	private boolean validarImpressoraJaCadastrada(final Integer empresaId, final String nomeImpresora) {
		boolean empresaExiste;
		
		if(ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.IS_PERMITE_VARIAS_IMPRESSORAS_MESMA_EMPRESA.getDescricao())) {
			empresaExiste = CollectionUtils.exists(estacionImpresoraList.getListData(), 
					new PredicateMesmaEmpresaEImpressora(nomeImpresora, empresaId));
		} else {
			empresaExiste = CollectionUtils.exists(estacionImpresoraList.getListData(), 
					new PredicateEmpresaAtiva(empresaId));
		}
		return empresaExiste;
	}

	private Integer getTipoImpressora() {
		String valor = ((Comboitem) cmbTipoImpressora.getSelectedItem()).getValue().toString();
		return TipoImpressora.getTipoImpressoraPorNome(valor) != null ? TipoImpressora.getTipoImpressoraPorNome(valor).getCodigo() : 0;
	}

	public void onClick$btnRemEstacionImpresora(Event ev) {
		if (estacionImpresoraList.getSelected() == null) {
			return;
		}

		EstacionImpresora ei = (EstacionImpresora) estacionImpresoraList.getSelected();
		
		//Verifica se o usuario tem permissão para remover a empresa
		if(!lsEmpresa.contains(ei.getEmpresa())) {
			Clients.alert(Labels.getLabel("editarEstacionController.MSG.UsuarioSemPermissaoEmpresa"), 
					Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);
			return;
		}
		estacionImpresoraList.removeSelectedItem();

		if (ei.getEstacionImpresoraId() != null) {
			ei.setFecmodif(Calendar.getInstance().getTime());
			ei.setActivo(Boolean.FALSE);
			ei.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			estacionImpresoraList.addItemNovo(ei);

			estacionService.devolverFoliosAutomaticosImpressoraFiscal(ei);
		}
	}

	public void onChange$cmbTipoImpressora(Event ev) {
		Comboitem item = (Comboitem) cmbTipoImpressora.getSelectedItem();

		if (item == null || item.getValue() == null) {
			return;
		}
		String valor = item.getValue().toString();
		
		List<Estacion> lsEstacionVacio = new ArrayList<Estacion>();
		BindingListModel dictModelVacio = new BindingListModelList(lsEstacionVacio, false);
		cmbEstacion.setModel(dictModelVacio);

		if (TipoImpressora.BEMATECH_FISCAL.getNome().equals(valor) || TipoImpressora.BEMATECH_FISCAL_BLINDADA.getNome().equals(valor)) {
			configurarTextBox(txtNomImpressora, Boolean.TRUE, "BEMATECHFISCAL");
			configurarTextBoxComValorLimpo(txtNomeArquivoLayout, Boolean.TRUE);
			configurarTextBoxComValorLimpo(txtNomeArquivoLayoutInternacional, Boolean.TRUE);
		} else if (TipoImpressora.DARUMA.getNome().equals(valor)|| TipoImpressora.DARUMA_BLINDADA.getNome().equals(valor)) {
			configurarTextBox(txtNomImpressora, Boolean.TRUE, TipoImpressora.DARUMA.getNome());
			configurarTextBoxComValorLimpo(txtNomeArquivoLayout, Boolean.TRUE);
			configurarTextBoxComValorLimpo(txtNomeArquivoLayoutInternacional, Boolean.TRUE);
		} else if (TipoImpressora.CENTRAL_EMISSAO.getNome().equals(valor)) {
			configurarTextBox(txtNomImpressora, Boolean.TRUE, TipoImpressora.CENTRAL_EMISSAO.getNome());
			configurarTextBoxComValorLimpo(txtNomeArquivoLayout, Boolean.TRUE);
			configurarTextBoxComValorLimpo(txtNomeArquivoLayoutInternacional, Boolean.TRUE);
		} else if (TipoImpressora.MATRICIAL.getNome().equals(valor)) {
			configurarTextBoxComValorLimpo(txtNomImpressora, Boolean.FALSE);
			configurarTextBoxComValorLimpo(txtNomeArquivoLayout, Boolean.FALSE);
			configurarTextBoxComValorLimpo(txtNomeArquivoLayoutInternacional, Boolean.FALSE);
		} else if (TipoImpressora.STOCK_CENTRAL.getNome().equals(valor)) {
			if(estacion == null || estacion.getPuntoVenta() == null){
				Clients.alert(Labels.getLabel("editarEstacionController.MSG.sinPuntoVenta"), 
	        			Labels.getLabel("editarEstacionController.window.title"), 	org.zkoss.zul.Messagebox.INFORMATION);
				cmbTipoImpressora.setSelectedItem(null);
				return;
			}
			configurarTextBoxComValorLimpo(txtNomImpressora, Boolean.FALSE);
			configurarTextBoxComValorLimpo(txtNomeArquivoLayout, Boolean.FALSE);
			cmbEstacion.setSelectedItem(null);
			List<Estacion> lsEstacion = estacionService.buscarEstacionesStockCentral(estacion.getPuntoVenta());
			BindingListModel dictModel = new BindingListModelList(lsEstacion, false);
			cmbEstacion.setModel(dictModel);
		}
	}

	private void configurarTextBox(Textbox textBox, Boolean desabilitado, String valor) {
		configurarTextBoxComValorLimpo(textBox, desabilitado);
		textBox.setText(valor);
	}

	private void configurarTextBoxComValorLimpo(Textbox textBox, Boolean desabilitado) {
		limparTextBox(textBox);
		textBox.setDisabled(desabilitado);
	}

	private void limparTextBox(Textbox txtBox) {
		txtBox.setText("");
	}

	public void onChange$cmbEstacion(Event ev) {
		Comboitem item = (Comboitem) cmbEstacion.getSelectedItem();

		if (item == null || item.getValue() == null) {
			return;
		}
		
	}
	
	private final class PredicateMesmaEmpresaEImpressora extends PredicateEmpresaAtiva {
		private final String nomeImpresora;

		private PredicateMesmaEmpresaEImpressora(String nomeImpresora, Integer empresaId) {
			super(empresaId);
			this.nomeImpresora = nomeImpresora;
		}

		@Override
		public boolean evaluate(Object obj) {
			EstacionImpresora e = (EstacionImpresora) obj;
			return (super.evaluate(obj)) 
					&& e.getNombImpresora().equals(nomeImpresora);
		}
	}

	private class PredicateEmpresaAtiva implements Predicate {
		private final Integer empresaId;

		private PredicateEmpresaAtiva(Integer empresaId) {
			this.empresaId = empresaId;
		}

		@Override
		public boolean evaluate(Object obj) {
			EstacionImpresora e = (EstacionImpresora) obj;
			return (e.getActivo() && e.getEmpresa().getEmpresaId().equals(empresaId));
		}
	}
	
	public List<TipoIntegracaoTEF> getLsIntegracaoTef() {
		List<TipoIntegracaoTEF> lsIntegracao = TipoIntegracaoTEF.list();
		Collections.sort(lsIntegracao, new Comparator<TipoIntegracaoTEF>() {
			@Override
			public int compare(TipoIntegracaoTEF o1, TipoIntegracaoTEF o2) {
				return o1.toString().compareTo(o2.toString());
			}
		});
		return lsIntegracao;
	}
	
	public void onChange$cmbEmpresa(Event ev) {
		Comboitem item = (Comboitem) cmbEmpresa.getSelectedItem();
		if (item == null || item.getValue() == null) {
			return;
		}
		try{
			Empresa empresa = (Empresa) item.getValue();
			if(StringUtils.isNotBlank(empresa.getCnpj())) {
				txtCnpjTef.setValue(empresa.getCnpj().replaceAll("^\\D", ""));
			}
		}catch(Exception e){
			log.error(e.getMessage(), e);
		}
	}
	
	public void onChange$cmbIntegracaoTef(Event ev) {
		TipoIntegracaoTEF tipoIntegracaoTEF = (TipoIntegracaoTEF) cmbIntegracaoTef.getSelectedItem().getValue();
		if (tipoIntegracaoTEF != null && (tipoIntegracaoTEF.equals(TipoIntegracaoTEF.ADYEN)
				|| tipoIntegracaoTEF.equals(TipoIntegracaoTEF.CREDIBANCO))) {
			rowDescricao.setVisible(true);
			rowNumeroDeSerie.setVisible(true);
			colunmNumeroDeSerie.setVisible(true);
			colunmDescricao.setVisible(true);
		}else {
			rowDescricao.setVisible(false);
			rowNumeroDeSerie.setVisible(false);
			colunmNumeroDeSerie.setVisible(false);
			colunmDescricao.setVisible(false);
		}
	}
	
}
