package com.rjconsultores.ventaboletos.web.gui.controladores.catalogos;

import java.util.List;

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.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Label;

import com.rjconsultores.ventaboletos.dao.CtrlSerieEmbarcadaDAO;
import com.rjconsultores.ventaboletos.dao.DispositivoEmbarcadaDAO;
import com.rjconsultores.ventaboletos.entidad.CtrlSerieEmbarcada;
import com.rjconsultores.ventaboletos.entidad.DispositivoEmbarcada;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.service.ControleSerieEmbarcadaService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.embarcada.SerieEmbarcada;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;

@Controller("editarAutorizacaoUsoSerieEmbarcadaController")
@Scope("prototype")
public class EditarAutorizacaoUsoSerieEmbarcadaController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 3681643325026575959L;

	private static Logger log = LogManager.getLogger(EditarAutorizacaoUsoSerieEmbarcadaController.class);
	
	@Autowired
	private EstadoService estadoService;
	
	@Autowired
	private DispositivoEmbarcadaDAO dispositivoEmbarcadaDAO;  
	
	@Autowired
	private CtrlSerieEmbarcadaDAO ctrlSerieEmbarcadaDAO; 
	
	@Autowired
	private ControleSerieEmbarcadaService controleSerieEmbarcadaService;

	private MyListbox autorizacaoUsoSerieEmbarcadaList;
	
	private Button btnApagar;
	private Button btnSalvar;
	
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private List<PuntoVenta> lsPuntoVenta;

	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;

	private Combobox cmbEstado;
	private List<Estado> lsEstado;
	
	private MyComboboxEstandar cmbDescricao;
	private List<DispositivoEmbarcada> lsDescricao;

	private CtrlSerieEmbarcada serieEmbarcada = null;
	
	private String serie = "Não definida";
	private String numero = "Não definido";
	
	private Label lbIMEIValue;
	
	private Grid gridInfoBPe;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		this.lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		this.lsDescricao = dispositivoEmbarcadaDAO.buscarTodos();
		this.lsEstado = estadoService.obtenerTodos();
		
		serieEmbarcada = (CtrlSerieEmbarcada) Executions.getCurrent().getArg().get("autorizacaoUsoSerieEmbarcada");
		autorizacaoUsoSerieEmbarcadaList = (MyListbox) Executions.getCurrent().getArg().get("autorizacaoUsoSerieEmbarcadaList");
		
		if (serieEmbarcada.getCtrlSerieEmbarcadaId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
			
			gridInfoBPe.setVisible(Boolean.FALSE);
		} else {
//			btnSalvar.setVisible(Boolean.FALSE);

			cmbEmpresa.setDisabled(true);
//			cmbPuntoVenta.setDisabled(true);
			cmbDescricao.setDisabled(true);
			cmbEstado.setDisabled(true);
			
			cmbPuntoVenta.setInitialValue(serieEmbarcada.getPuntoventa());
			
			cmbEmpresa.setText(serieEmbarcada.getEmpresa().getNombempresa());
			cmbDescricao.setText(serieEmbarcada.getDispositivoEmbarcada().getDescricao());
			cmbEstado.setText(serieEmbarcada.getEstado().getNombestado());
		}
		
		if (serieEmbarcada.getDispositivoEmbarcada() == null) {
			lbIMEIValue.setValue("Não definido");
		} else {
			lbIMEIValue.setValue(serieEmbarcada.getDispositivoEmbarcada().getImei());
			
			serie = serieEmbarcada.getSerie();
			numero = serieEmbarcada.getNumeroCorrente();
		}
	}

	public void onChange$cmbDescricao() {
		if (cmbDescricao.getSelectedItem() != null) {
			DispositivoEmbarcada de = (DispositivoEmbarcada) cmbDescricao.getSelectedItem().getValue();
			lbIMEIValue.setValue(de.getImei());

		} else {
			lbIMEIValue.setValue("Não definido");
		}
	}
	
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		try {
			cmbPuntoVenta.getValue();
			cmbEmpresa.getValue();
			cmbDescricao.getValue();
			cmbEstado.getValue();

			if (serieEmbarcada.getPuntoventa() == null ||
				serieEmbarcada.getEmpresa() == null ||
				serieEmbarcada.getDispositivoEmbarcada() == null ||
				serieEmbarcada.getEstado() == null) {
				
				
				Messagebox.show(
						Labels.getLabel("editarAutorizacaoUsoSerieEmbarcadaController.MSG.camposobrigatorios"),
						Labels.getLabel("editarAutorizacaoUsoSerieEmbarcadaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				
				
				return;
			}
			
			if (serieEmbarcada.getCtrlSerieEmbarcadaId() == null) {
				if (ctrlSerieEmbarcadaDAO.validaDispositivoEmpresaEstadoCadastrado(serieEmbarcada.getDispositivoEmbarcada(), serieEmbarcada.getEmpresa(), serieEmbarcada.getEstado())) {
					Messagebox.show(
							Labels.getLabel("editarAutorizacaoUsoSerieEmbarcadaController.MSG.erroJaCadastrado"),
							Labels.getLabel("editarAutorizacaoUsoSerieEmbarcadaController.window.title"),
							Messagebox.OK, Messagebox.INFORMATION);
					return;
				}
				
				SerieEmbarcada seq = controleSerieEmbarcadaService.buscarSerieEmbarcada(serieEmbarcada);
				
				serieEmbarcada.setSerie(seq.getSerie());
				serieEmbarcada.setNumeroInicial(seq.getNumero());
				serieEmbarcada.setNumeroCorrente(seq.getNumero());
				serieEmbarcada.setCtrlSerieEmbarcadaSeq(seq.getCtrlSerieEmbarcada());
				
				serieEmbarcada.setIndBaixado(Boolean.FALSE);
				serieEmbarcada.setIndReutilizado(Boolean.FALSE);
				serieEmbarcada.setActivo(Boolean.TRUE);
				
				ctrlSerieEmbarcadaDAO.suscribir(serieEmbarcada);

				autorizacaoUsoSerieEmbarcadaList.addItemNovo(serieEmbarcada);
				
				Messagebox.show(
						Labels.getLabel("editarAutorizacaoUsoSerieEmbarcadaController.MSG.suscribirOK", new Object[] { serieEmbarcada.getSerie() }),
						Labels.getLabel("editarAutorizacaoUsoSerieEmbarcadaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} else {
				ctrlSerieEmbarcadaDAO.actualizacion(serieEmbarcada);

				autorizacaoUsoSerieEmbarcadaList.updateItem(serieEmbarcada);
				
				Messagebox.show(
						Labels.getLabel("editarAutorizacaoUsoSerieEmbarcadaController.MSG.actualizacionOK"),
						Labels.getLabel("editarAutorizacaoUsoSerieEmbarcadaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}

			closeWindow();

		} catch (Exception ex) {
			
			if (ex instanceof WrongValueException) {
				throw (WrongValueException) ex;
			}
			
			log.error("editarAutorizacaoUsoSerieEmbarcadaController: " + ex.getMessage(), ex);
			
			Messagebox.show(
					ex.getMessage(),
					Labels.getLabel("editarAutorizacaoUsoSerieEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			

			
		}
	}		

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

		if (resp == Messagebox.YES) {
			ctrlSerieEmbarcadaDAO.borrar(serieEmbarcada);

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

			autorizacaoUsoSerieEmbarcadaList.removeItem(serieEmbarcada);

			closeWindow();
		}
	}
	
	public MyComboboxPuntoVenta getCmbPuntoVenta() {
		return cmbPuntoVenta;
	}

	public void setCmbPuntoVenta(MyComboboxPuntoVenta cmbPuntoVenta) {
		this.cmbPuntoVenta = cmbPuntoVenta;
	}

	public List<PuntoVenta> getLsPuntoVenta() {
		return lsPuntoVenta;
	}

	public void setLsPuntoVenta(List<PuntoVenta> lsPuntoVenta) {
		this.lsPuntoVenta = lsPuntoVenta;
	}

	public MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(MyComboboxEstandar cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

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

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

	public Combobox getCmbEstado() {
		return cmbEstado;
	}

	public void setCmbEstado(Combobox cmbEstado) {
		this.cmbEstado = cmbEstado;
	}

	public List<Estado> getLsEstado() {
		return lsEstado;
	}

	public void setLsEstado(List<Estado> lsEstado) {
		this.lsEstado = lsEstado;
	}

	public MyComboboxEstandar getCmbDescricao() {
		return cmbDescricao;
	}

	public void setCmbDescricao(MyComboboxEstandar cmbDescricao) {
		this.cmbDescricao = cmbDescricao;
	}

	public List<DispositivoEmbarcada> getLsDescricao() {
		return lsDescricao;
	}

	public void setLsDescricao(List<DispositivoEmbarcada> lsDescricao) {
		this.lsDescricao = lsDescricao;
	}

	public CtrlSerieEmbarcada getSerieEmbarcada() {
		return serieEmbarcada;
	}

	public void setSerieEmbarcada(CtrlSerieEmbarcada serieEmbarcada) {
		this.serieEmbarcada = serieEmbarcada;
	}

	public String getSerie() {
		return serie;
	}

	public void setSerie(String serie) {
		this.serie = serie;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public Label getLbIMEIValue() {
		return lbIMEIValue;
	}

	public void setLbIMEIValue(Label lbIMEIValue) {
		this.lbIMEIValue = lbIMEIValue;
	}

	public Button getBtnApagar() {
		return btnApagar;
	}

	public void setBtnApagar(Button btnApagar) {
		this.btnApagar = btnApagar;
	}

	public Button getBtnSalvar() {
		return btnSalvar;
	}

	public void setBtnSalvar(Button btnSalvar) {
		this.btnSalvar = btnSalvar;
	}

	public Grid getGridInfoBPe() {
		return gridInfoBPe;
	}

	public void setGridInfoBPe(Grid gridInfoBPe) {
		this.gridInfoBPe = gridInfoBPe;
	}
}
