/*
 * 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.Arrays;
import java.util.Calendar;
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.Checkbox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.DispositivoEmbarcada;
import com.rjconsultores.ventaboletos.entidad.DispositivoEmbarcadaHistorico;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.enums.SistemaEnum;
import com.rjconsultores.ventaboletos.enums.TipoBloqueioDispositivoEmbarcadaEnum;
import com.rjconsultores.ventaboletos.exception.DispositivoEmbarcadaJaCadastradoException;
import com.rjconsultores.ventaboletos.service.DispositivoEmbarcadaHistoricoService;
import com.rjconsultores.ventaboletos.service.DispositivoEmbarcadaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
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;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderDispositivoVendaEmbarcadaHistorico;

/**
 * 
 * @author Lucas
 */
@Controller("editarDispositivoVendaEmbarcadaController")
@Scope("prototype")
public class EditarDispositivoVendaEmbarcadaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private PagedListWrapper<DispositivoEmbarcadaHistorico> plwDispositivoVendaEmbarcadaHistorico;
	private DispositivoEmbarcada dispositivoVendaEmbarcada;
	private MyListbox editarDispositivoVendaEmbarcadaList;
	private Button btnApagar;
	private List<SistemaEnum> lsSistemaEnum;
	private MyComboboxEstandar cmbEmpresa;
	private List<Empresa> lsEmpresa;
	private List<PuntoVenta> lsPuntoVenta;
	private MyComboboxPuntoVenta cmbPuntoVenta;
	private Textbox txtDescricao;
	private Textbox txtRegistro;
	private Textbox txtMac;
	private Textbox txtMei;
	private Checkbox chkDispBloqueado;
	private Checkbox chkDispManutencao;
	private Checkbox chkDispBaixado;
	private Textbox txtMotivoBloqueio;
	private Textbox txtMotivoManutencao;
	private Textbox txtMotivoBaixado;
	private Textbox txtVersaoUltimaSinc;
	private Textbox txtDataUltimaSinc;

	@Autowired
	private DispositivoEmbarcadaService dispositivoEmbarcadaService;
	@Autowired
	private DispositivoEmbarcadaHistoricoService dispositivoEmbarcadaHistoricoService;
	private Usuario usuario;
	private Paging pagingEditarDispositivoVendaEmbarcada;
	private String motivoBloqueado;
	private String motivoManutencao;
	private String motivoBaixado;
	private boolean isNovoDispositivo;
	private static Logger log = LogManager.getLogger(EditarDispositivoVendaEmbarcadaController.class);

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

		usuario = UsuarioLogado.getUsuarioLogado();
		this.lsEmpresa = usuario.getEmpresa();
		lsPuntoVenta = new ArrayList<PuntoVenta>();
		
		super.doAfterCompose(comp);
		
		dispositivoVendaEmbarcada = (DispositivoEmbarcada) Executions.getCurrent().getArg().get("dispositivoVendaEmbarcada");
		isNovoDispositivo = (Boolean) Executions.getCurrent().getArg().get("isNovoDispositivo");
		editarDispositivoVendaEmbarcadaList.setItemRenderer(new RenderDispositivoVendaEmbarcadaHistorico());
		List<DispositivoEmbarcadaHistorico> lsHistoricoDispositivo = dispositivoEmbarcadaHistoricoService.buscarHistoricoDispositivoPorId(dispositivoVendaEmbarcada.getDispositivoEmbarcadaId());
		editarDispositivoVendaEmbarcadaList.setData(lsHistoricoDispositivo);

		lsSistemaEnum = Arrays.asList(SistemaEnum.values());
		
		
		if(dispositivoVendaEmbarcada.getImei() != null) {
			txtMei.setDisabled(true);
		}

		txtVersaoUltimaSinc.setDisabled(true);
		txtDataUltimaSinc.setDisabled(true);
		verificaCheckBox();
		carregarMotivos();
		refreshLista();

	}

	private void carregarMotivos() {
		motivoBloqueado = dispositivoVendaEmbarcada.getMotivoDispBloqueado();
		motivoBaixado = dispositivoVendaEmbarcada.getMotivoDispBaixado();
		motivoManutencao = dispositivoVendaEmbarcada.getMotivoDispManutencao();

	}

	private void verificaCheckBox() {
		if (dispositivoVendaEmbarcada.getIndDispBloqueado() != null && dispositivoVendaEmbarcada.getIndDispBloqueado()) {
			txtMotivoBloqueio.setDisabled(false);
		} else {
			txtMotivoBloqueio.setDisabled(true);
		}

		if (dispositivoVendaEmbarcada.getIndDispManutencao() != null && dispositivoVendaEmbarcada.getIndDispManutencao()) {
			txtMotivoManutencao.setDisabled(false);
		} else {
			txtMotivoManutencao.setDisabled(true);
		}

		if (dispositivoVendaEmbarcada.getIndDispBaixado() != null && dispositivoVendaEmbarcada.getIndDispBaixado()) {
			txtMotivoBaixado.setDisabled(false);
		} else {
			txtMotivoBaixado.setDisabled(true);
		}

	}

	@SuppressWarnings("unused")
	private void refreshLista() {
		HibernateSearchObject<DispositivoEmbarcadaHistorico> dispositivoEmbarcadaHistoricoBusqueda = new HibernateSearchObject<DispositivoEmbarcadaHistorico>(DispositivoEmbarcadaHistorico.class,
				pagingEditarDispositivoVendaEmbarcada.getPageSize());

		if (editarDispositivoVendaEmbarcadaList.getData().length == 0 && !isNovoDispositivo) {
			try {
				Messagebox.show(Labels.getLabel("editarDispositivoVendaEmbarcadaController.MSG.ningunRegistro"),
						Labels.getLabel("dispositivoVendaEmbarcadaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		try {
			if (!verificaCamposVazios()) return;

			List<DispositivoEmbarcadaHistorico> lsDispositivoEmbarcadaHistoricos = new ArrayList<DispositivoEmbarcadaHistorico>();

			dispositivoVendaEmbarcada.setDescricao(txtDescricao.getText());
			dispositivoVendaEmbarcada.setRegistro(txtRegistro.getText());

			dispositivoVendaEmbarcada.setImei(txtMei.getText().trim());
			dispositivoVendaEmbarcada.setUsuario(usuario);
			dispositivoVendaEmbarcada.setFecmodif(Calendar.getInstance().getTime());
			dispositivoVendaEmbarcada.setActivo(Boolean.TRUE);
			dispositivoVendaEmbarcada.setIndDispBloqueado(chkDispBloqueado.isChecked());

			if (chkDispBloqueado.isChecked() && !txtMotivoBloqueio.getText().equals(motivoBloqueado)) {
				lsDispositivoEmbarcadaHistoricos.add(preencheHistoricoDispositivo(txtMotivoBloqueio.getText(), TipoBloqueioDispositivoEmbarcadaEnum.DISPOSITIVO_BLOQUEADO.getValor()));
				dispositivoVendaEmbarcada.setMotivoDispBloqueado(txtMotivoBloqueio.getText());
			}

			dispositivoVendaEmbarcada.setIndDispManutencao(chkDispManutencao.isChecked());
			if (chkDispManutencao.isChecked() && !txtMotivoManutencao.getText().equals(motivoManutencao)) {
				lsDispositivoEmbarcadaHistoricos.add(preencheHistoricoDispositivo(txtMotivoManutencao.getText(), TipoBloqueioDispositivoEmbarcadaEnum.DISPOSITIVO_MANUTENCAO.getValor()));
				dispositivoVendaEmbarcada.setMotivoDispManutencao(txtMotivoManutencao.getText());
			}

			dispositivoVendaEmbarcada.setIndDispBaixado(chkDispBaixado.isChecked());
			if (chkDispBaixado.isChecked() && !txtMotivoBaixado.getText().equals(motivoBaixado)) {
				lsDispositivoEmbarcadaHistoricos.add(preencheHistoricoDispositivo(txtMotivoBaixado.getText(), TipoBloqueioDispositivoEmbarcadaEnum.DISPOSITIVO_BAIXADO.getValor()));
				dispositivoVendaEmbarcada.setMotivoDispBaixado(txtMotivoBaixado.getText());
			}

			dispositivoEmbarcadaService.suscribirActualizar(dispositivoVendaEmbarcada);
			salvarHistoricoDispositivo(lsDispositivoEmbarcadaHistoricos);

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

			closeWindow();
		} catch (DispositivoEmbarcadaJaCadastradoException ex){
			Messagebox.show(
					ex.getMessage(),
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		} catch (Exception ex) {
			log.error("editarDispositivoVendaEmbarcadaController: ", ex);
		} 
	}

	private boolean verificaCamposVazios() throws InterruptedException {
		if (cmbEmpresa.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.MSG.empresaNaoInformada"),
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		if (cmbPuntoVenta.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.MSG.puntoVentaNaoInformado"),
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		if (chkDispBloqueado.isChecked() && txtMotivoBloqueio.getText().isEmpty()){
			Messagebox.show(
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.MSG.motivoBloqueadoNaoInformado"),
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		if (chkDispBaixado.isChecked() && txtMotivoBaixado.getText().isEmpty()){
			Messagebox.show(
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.MSG.motivoBaixaNaoInformado"),
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		if (chkDispManutencao.isChecked() && txtMotivoManutencao.getText().isEmpty()){
			Messagebox.show(
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.MSG.motivoManutencaoNaoInformado"),
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		try{
			if (txtRegistro.getValue().isEmpty()){
				Messagebox.show(
						Labels.getLabel("editarDispositivoVendaEmbarcadaController.MSG.registroNaoInformado"),
						Labels.getLabel("editarDispositivoVendaEmbarcadaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
				return false;
			}
		} catch (WrongValueException e){
			Messagebox.show(
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.MSG.registroNaoInformado"),
					Labels.getLabel("editarDispositivoVendaEmbarcadaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		txtRegistro.getValue();
		txtMei.getValue();
		return true;
	}

	private void salvarHistoricoDispositivo(List<DispositivoEmbarcadaHistorico> lsDispositivoEmbarcadaHistoricos) {
		if (!lsDispositivoEmbarcadaHistoricos.isEmpty()) {
			for (DispositivoEmbarcadaHistorico deh : lsDispositivoEmbarcadaHistoricos) {
				dispositivoEmbarcadaHistoricoService.suscribir(deh);
			}
		}

	}

	private DispositivoEmbarcadaHistorico preencheHistoricoDispositivo(String motivo, Integer tipoDescricao) {
		DispositivoEmbarcadaHistorico dispositivoEmbarcadaHistorico;
		dispositivoEmbarcadaHistorico = new DispositivoEmbarcadaHistorico();
		dispositivoEmbarcadaHistorico.setDispositivoEmbarcada(dispositivoVendaEmbarcada);
		dispositivoEmbarcadaHistorico.setDescricao(motivo);
		dispositivoEmbarcadaHistorico.setTipoBloqueioDispositivoEmbarcada(tipoDescricao);
		dispositivoEmbarcadaHistorico.setFecmodif(Calendar.getInstance().getTime());
		dispositivoEmbarcadaHistorico.setActivo(true);
		dispositivoEmbarcadaHistorico.setUsuarioId(usuario.getUsuarioId());
		return dispositivoEmbarcadaHistorico;
	}

	public void onCheck$chkDispBloqueado(Event event) {
		if (chkDispBloqueado.isChecked()) {
			chkDispBaixado.setChecked(true);
			dispositivoVendaEmbarcada.setIndDispBaixado(true);
			txtMotivoBloqueio.setDisabled(false);
			txtMotivoBaixado.setDisabled(false);
		} else {
			chkDispBaixado.setChecked(false);
			dispositivoVendaEmbarcada.setIndDispBaixado(false);
			txtMotivoBloqueio.setDisabled(true);
			txtMotivoBaixado.setDisabled(true);
		}
	}

	public void onCheck$chkDispManutencao(Event event) {
		if (chkDispManutencao.isChecked()) {
			txtMotivoManutencao.setDisabled(false);
		} else {
			txtMotivoManutencao.setDisabled(true);
		}
	}

	public void onCheck$chkDispBaixado(Event event) {
		if (chkDispBaixado.isChecked()) {
			chkDispBloqueado.setChecked(true);
			dispositivoVendaEmbarcada.setIndDispBloqueado(true);
			txtMotivoBaixado.setDisabled(false);
			txtMotivoBloqueio.setDisabled(false);
		} else {
			chkDispBloqueado.setChecked(false);
			dispositivoVendaEmbarcada.setIndDispBloqueado(false);
			txtMotivoBaixado.setDisabled(true);
			txtMotivoBloqueio.setDisabled(true);
		}
	}

	public void onClick$btnApagar(Event ev) throws InterruptedException {
	}

	public DispositivoEmbarcada getDispositivoVendaEmbarcada() {
		return dispositivoVendaEmbarcada;
	}

	public void setDispositivoVendaEmbarcada(DispositivoEmbarcada dispositivoVendaEmbarcada) {
		this.dispositivoVendaEmbarcada = dispositivoVendaEmbarcada;
	}

	public Button getBtnApagar() {
		return btnApagar;
	}

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

	public List<SistemaEnum> getLsSistemaEnum() {
		return lsSistemaEnum;
	}

	public void setLsSistemaEnum(List<SistemaEnum> lsSistemaEnum) {
		this.lsSistemaEnum = lsSistemaEnum;
	}

	public Textbox getTxtDescricao() {
		return txtDescricao;
	}

	public void setTxtDescricao(Textbox txtDescricao) {
		this.txtDescricao = txtDescricao;
	}

	public Textbox getTxtRegistro() {
		return txtRegistro;
	}

	public void setTxtRegistro(Textbox txtRegistro) {
		this.txtRegistro = txtRegistro;
	}

	public Textbox getTxtMac() {
		return txtMac;
	}

	public void setTxtMac(Textbox txtMac) {
		this.txtMac = txtMac;
	}

	public Textbox getTxtMei() {
		return txtMei;
	}

	public void setTxtMei(Textbox txtMei) {
		this.txtMei = txtMei;
	}

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

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

	public Checkbox getChkDispBloqueado() {
		return chkDispBloqueado;
	}

	public void setChkDispBloqueado(Checkbox chkDispBloqueado) {
		this.chkDispBloqueado = chkDispBloqueado;
	}

	public Checkbox getChkDispManutencao() {
		return chkDispManutencao;
	}

	public void setChkDispManutencao(Checkbox chkDispManutencao) {
		this.chkDispManutencao = chkDispManutencao;
	}

	public Checkbox getChkDispBaixado() {
		return chkDispBaixado;
	}

	public void setChkDispBaixado(Checkbox chkDispBaixado) {
		this.chkDispBaixado = chkDispBaixado;
	}

	public Textbox getTxtMotivoBloqueio() {
		return txtMotivoBloqueio;
	}

	public void setTxtMotivoBloqueio(Textbox txtMotivoBloqueio) {
		this.txtMotivoBloqueio = txtMotivoBloqueio;
	}

	public Textbox getTxtMotivoManutencao() {
		return txtMotivoManutencao;
	}

	public void setTxtMotivoManutencao(Textbox txtMotivoManutencao) {
		this.txtMotivoManutencao = txtMotivoManutencao;
	}

	public Textbox getTxtMotivoBaixado() {
		return txtMotivoBaixado;
	}

	public void setTxtMotivoBaixado(Textbox txtMotivoBaixado) {
		this.txtMotivoBaixado = txtMotivoBaixado;
	}

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

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

	public MyListbox getEditarDispositivoVendaEmbarcadaList() {
		return editarDispositivoVendaEmbarcadaList;
	}

	public void setEditarDispositivoVendaEmbarcadaList(MyListbox editarDispositivoVendaEmbarcadaList) {
		this.editarDispositivoVendaEmbarcadaList = editarDispositivoVendaEmbarcadaList;
	}

	public PagedListWrapper<DispositivoEmbarcadaHistorico> getPlwDispositivoVendaEmbarcadaHistorico() {
		return plwDispositivoVendaEmbarcadaHistorico;
	}

	public void setPlwDispositivoVendaEmbarcadaHistorico(PagedListWrapper<DispositivoEmbarcadaHistorico> plwDispositivoVendaEmbarcadaHistorico) {
		this.plwDispositivoVendaEmbarcadaHistorico = plwDispositivoVendaEmbarcadaHistorico;
	}

	public Paging getPagingEditarDispositivoVendaEmbarcada() {
		return pagingEditarDispositivoVendaEmbarcada;
	}

	public void setPagingEditarDispositivoVendaEmbarcada(Paging pagingEditarDispositivoVendaEmbarcada) {
		this.pagingEditarDispositivoVendaEmbarcada = pagingEditarDispositivoVendaEmbarcada;
	}
	
	public Textbox getTxtVersaoUltimaSinc() {
		return txtVersaoUltimaSinc;
	}

	public void setTxtVersaoUltimaSinc(Textbox txtVersaoUltimaSinc) {
		this.txtVersaoUltimaSinc = txtVersaoUltimaSinc;
	}
	
	public Textbox getTxtDataUltimaSinc() {
		return txtDataUltimaSinc;
	}

	public void setTxtDataUltimaSinc(Textbox txtDataUltimaSinc) {
		this.txtDataUltimaSinc = txtDataUltimaSinc;
	}


}
