/*
 * 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.Calendar;
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.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.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Longbox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.api.Comboitem;

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.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.EstacionService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
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;

	private MyListbox estacionList;
	private MyListbox estacionSitefList;
	private MyListbox estacionImpresoraList;
	private MyListbox estacionRioCardList;
	private Combobox cmbEmpresa;
	private Combobox cmbEmpresaImpressora;
	private Combobox cmbEmpresaRioCard;
	private Button btnApagar;
	private Textbox txtDescEstacion;
	private Textbox txtDescMac;
	private Textbox txtIpServidor;
	private Longbox txtNumCaja;
	private Estacion estacion;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private Intbox txtNumEmpresa;
	private Intbox txtNumFilial;
	private Intbox txtNumPdv;
	private Textbox txtOperadora;
	private List<Empresa> lsEmpresa;
	private List<EstacionSitef> lsEstacionSitef;
	private List<EstacionRioCard> lsEstacionRiocard;
	private List<EstacionImpresora> lsEstacionImpresora;
	private static Logger log = Logger.getLogger(EditarEstacionController.class);
	private Textbox txtNomImpressoara;
	private Textbox txtNomeArquivoLayout;
	private Radio rdPausarImpressoraNo;
	private Radio rdPausarImpressoraSi;
	private Tab tabRioCard;

	public Estacion getEstacion() {
		return estacion;
	}

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

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

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

		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		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());
		
		if (ApplicationProperties.getInstance().integracionRioCard()) {
			tabRioCard.setVisible(true);
		}

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

			if (estacion.getPausarImpressora() != null) {
				if (estacion.getPausarImpressora()) {
					rdPausarImpressoraSi.setChecked(Boolean.TRUE);
				} else {
					rdPausarImpressoraNo.setChecked(Boolean.TRUE);
				}
			}
		}

		txtDescEstacion.focus();
	}

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

		String descMac = txtDescMac.getText();

		estacion.setActivo(Boolean.TRUE);
		estacion.setFecmodif(Calendar.getInstance().getTime());
		estacion.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		estacion.setDescmac(estacionService.getDecimalMAC(descMac).toString());

		if (rdPausarImpressoraSi.isChecked()) {
			estacion.setPausarImpressora(Boolean.TRUE);
		} else if (rdPausarImpressoraNo.isChecked()) {
			estacion.setPausarImpressora(Boolean.FALSE);
		}

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

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

		estacionSitefList.addItemNovo(es);
	}

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

		EstacionSitef es = (EstacionSitef) estacionSitefList.getSelected();

		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();
		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) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();

			final Integer empresaId = empresa.getEmpresaId();

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

				@Override
				public boolean evaluate(Object obj) {

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

			String nomeImpresora = txtNomImpressoara.getValue();
			
			if (StringUtils.isBlank(nomeImpresora)){
				Clients.alert(Labels.getLabel("editarEstacionController.MSG.nomeImpressora"), Labels.getLabel("editarEstacionController.window.title"), Messagebox.INFORMATION);

				return;
			}
			
			String nomeArquivoLayout = txtNomeArquivoLayout.getValue();

			EstacionImpresora estacionImpresora = new EstacionImpresora();
			estacionImpresora.setEmpresa(empresa);
			estacionImpresora.setEstacion(estacion);
			estacionImpresora.setNombImpresora(nomeImpresora);
			estacionImpresora.setNombArchivoLayout(nomeArquivoLayout);
			estacionImpresora.setActivo(Boolean.TRUE);
			estacionImpresora.setFecmodif(Calendar.getInstance().getTime());
			estacionImpresora.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			estacionImpresoraList.addItemNovo(estacionImpresora);

		}
	}

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

		EstacionImpresora ei = (EstacionImpresora) estacionImpresoraList.getSelected();
		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);
		}
	}

}
