/*
 * 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.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.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import com.rjconsultores.ventaboletos.entidad.DispositivoEmbarcada;
import com.rjconsultores.ventaboletos.entidad.EmbarcadaDispOperador;
import com.rjconsultores.ventaboletos.service.EmbarcadaDispOperadorService;
import com.rjconsultores.ventaboletos.service.UsuarioService;
import com.rjconsultores.ventaboletos.vo.embarcada.UsuarioEmbarcadaVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderUsuarioDispositivo;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderUsuarioDispositivoSelecao;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderUsuarioDispositivoSelecionados;

/**
 * 
 * @author rodrigo
 */
@Controller("editarOperadoresDispositivoController")
@Scope("prototype")
public class EditarOperadoresDispositivoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(EditarOperadoresDispositivoController.class);

	/**
	 * ListBox dos usuários que estáo atrelados ao dispositivo
	 */
	private MyListbox usuariosDispositivoListBox;
	private Textbox txtDescImei;
	private Textbox txtPuntoVenta;
	private List<UsuarioEmbarcadaVO> lsTodosUsuariosPontoVendaAtualizado;
	private List<UsuarioEmbarcadaVO> lsTodosUsuariosPontoVendaInicial;
	private List<UsuarioEmbarcadaVO> lsUsuariosAtreladosDispositivo;
	private List<UsuarioEmbarcadaVO> lsUsuariosAdicionadosAtreladosDispositivo;
	private List<UsuarioEmbarcadaVO> lsUsuariosRemovidosAtreladosDispositivo;
	private Window winEditarOperadoresDispositivo;
	/**
	 * Parametro
	 */
	private DispositivoEmbarcada dispositivoVendaEmbarcada;

	@Autowired
	private UsuarioService usuarioService;

	@Autowired
	EmbarcadaDispOperadorService embarcadaDispOperadorService;

	/**
	 * Campo pesquisa Textbox
	 */
	private Textbox txtPalavraPesquisaUsuario;
	/**
	 * ListBox do campo de pesuisa dos usuários
	 */
	private MyListbox usuarioPesquisaSelecaoListBox;

	/**
	 * ListBox dos usuários selecionados
	 */
	private MyListbox usuarioSelecionadoListBox;

	private Textbox txtFiltro;
	

	public List<UsuarioEmbarcadaVO> getLsUsuarios() {
		return lsTodosUsuariosPontoVendaAtualizado;
	}

	public void setLsUsuarios(List<UsuarioEmbarcadaVO> lsUsuarios) {
		this.lsTodosUsuariosPontoVendaAtualizado = lsUsuarios;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		// Instancia listas vazias
		lsTodosUsuariosPontoVendaAtualizado = new ArrayList<UsuarioEmbarcadaVO>();
		lsUsuariosAtreladosDispositivo = new ArrayList<UsuarioEmbarcadaVO>();
		lsTodosUsuariosPontoVendaInicial = new ArrayList<UsuarioEmbarcadaVO>();
		lsUsuariosRemovidosAtreladosDispositivo = new ArrayList<UsuarioEmbarcadaVO>();
		lsUsuariosAdicionadosAtreladosDispositivo = new ArrayList<UsuarioEmbarcadaVO>();

		dispositivoVendaEmbarcada = (DispositivoEmbarcada) Executions.getCurrent().getArg().get("dispositivoVendaEmbarcada");
		// Preenche usuários do Ponto de Venda
		lsTodosUsuariosPontoVendaAtualizado.addAll(usuarioService.buscarUsuariosEmbarcadaPorPontoVenda(dispositivoVendaEmbarcada.getPuntoVenta().getPuntoventaId().longValue()));
		lsTodosUsuariosPontoVendaInicial = lsTodosUsuariosPontoVendaAtualizado;
		// Preenche usuários atrelados ao dispositivo
		lsUsuariosAtreladosDispositivo.addAll(usuarioService.buscarUsuariosEmbarcadaPorDispositivo(dispositivoVendaEmbarcada.getDispositivoEmbarcadaId()));
		// Remove da lista de usuários do ponto de venda os usuários que já estáo atrelados ao dispositivo
		for (UsuarioEmbarcadaVO usuarioEmbarcadaVO : lsUsuariosAtreladosDispositivo) {
			lsTodosUsuariosPontoVendaAtualizado.remove(usuarioEmbarcadaVO);
		}
		// Preenche campos de texto
		txtDescImei.setText(dispositivoVendaEmbarcada != null && dispositivoVendaEmbarcada.getImei() != null ? dispositivoVendaEmbarcada.getImei() : "");
		txtDescImei.setDisabled(true);

		txtPuntoVenta.setText(dispositivoVendaEmbarcada != null && dispositivoVendaEmbarcada.getPuntoVenta() != null ? dispositivoVendaEmbarcada.getPuntoVenta().getNombpuntoventa() : "");

		// Instancia reinderizador da Listbox dos usuários selecionados (Grid de usuários selecionados)
		usuarioSelecionadoListBox.setItemRenderer(new RenderUsuarioDispositivoSelecionados(new EventListener() {

			@Override
			public void onEvent(Event arg0) throws Exception {

				UsuarioEmbarcadaVO usuarioClicado = (UsuarioEmbarcadaVO) arg0.getTarget().getAttribute("data");
				for (Object usuario : usuarioSelecionadoListBox.getListData()) {
					if (((UsuarioEmbarcadaVO) usuario).equals(usuarioClicado)) {
						usuarioSelecionadoListBox.removeItem(usuarioClicado);
						executarPesquisaUsuario();
						break;
					}
				}
			}
		}));

		// Instancia Reinderizador da Listbox dos usuários atrelados ao dispositivo
		usuariosDispositivoListBox.setItemRenderer(new RenderUsuarioDispositivo());

		usuariosDispositivoListBox.addEventListener("onDoubleClick", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {

			}
		});

		if (usuariosDispositivoListBox != null && lsUsuariosAtreladosDispositivo != null) {
			usuariosDispositivoListBox.setData(lsUsuariosAtreladosDispositivo);
		}

		winEditarOperadoresDispositivo.addEventListener("onClose", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {

				txtDescImei.getText();
				// Caso tenha preenchido lista de usuários atrelados ou removidos pergunta usuário se ele deseja fechar a tela, se listas vazias fecha tela sem perguntar
				if (!lsUsuariosAdicionadosAtreladosDispositivo.isEmpty() && !lsUsuariosRemovidosAtreladosDispositivo.isEmpty()) {

					int resp = Messagebox.show(
							Labels.getLabel("editarOperadoresDispositivoController.MSG.existemUsuariosAtrelados"),
							Labels.getLabel("editarOperadoresDispositivoController.window.title"),
							Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
					if (resp == Messagebox.YES) {
						closeWindow();

					} else {
						event.stopPropagation();
						txtDescImei.focus();
					}
				} else {
					//closeWindow();

				}
			}
		});

	}

	public void onClick$btnSalva(Event ev) {
		limparFiltro();
		txtDescImei.getText();
		try {
			if ((lsUsuariosAdicionadosAtreladosDispositivo == null && lsUsuariosRemovidosAtreladosDispositivo == null) ||
					(lsUsuariosAdicionadosAtreladosDispositivo.isEmpty() && lsUsuariosRemovidosAtreladosDispositivo.isEmpty())) {
				Clients.alert(Labels.getLabel("editarOperadoresDispositivoController.MSG.naoAdicionadoItemNovo"),
						Labels.getLabel("editarOperadoresDispositivoController.window.title"),
						Messagebox.INFORMATION);

				return;
			}

			// Salvar lista usuários adicionados
			if (lsUsuariosAdicionadosAtreladosDispositivo != null && !lsUsuariosAdicionadosAtreladosDispositivo.isEmpty()) {
				embarcadaDispOperadorService.inserirListEmbarcadaDispOperador(converteParaEmbarcadaDispOperador(lsUsuariosAdicionadosAtreladosDispositivo,
						dispositivoVendaEmbarcada.getDispositivoEmbarcadaId(), dispositivoVendaEmbarcada.getPuntoVenta().getPuntoventaId().longValue()));
				lsUsuariosAtreladosDispositivo.addAll(lsUsuariosAdicionadosAtreladosDispositivo);
				lsUsuariosAdicionadosAtreladosDispositivo.clear();
			}

			// Salvar lista usuários removidos
			if (lsUsuariosRemovidosAtreladosDispositivo != null && !lsUsuariosRemovidosAtreladosDispositivo.isEmpty()) {
				embarcadaDispOperadorService.removerListEmbarcadaDispOperador(converteParaEmbarcadaDispOperador(lsUsuariosRemovidosAtreladosDispositivo,
						dispositivoVendaEmbarcada.getDispositivoEmbarcadaId(), dispositivoVendaEmbarcada.getPuntoVenta().getPuntoventaId().longValue()));
				lsUsuariosRemovidosAtreladosDispositivo.clear();
			}
			Messagebox.show(
					Labels.getLabel("editarOperadoresDispositivoController.MSG.suscribirOK"),
					Labels.getLabel("editarOperadoresDispositivoController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

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

	public void onClick$btnAplicarFiltro(Event ev) {
		aplicarFiltro();
	}

	public void onOK$txtFiltro(Event ev) {

	}

	public void onClick$btnRemoverFiltro(Event ev) {
		limparFiltro();
	}

	private void limparFiltro() {
		txtFiltro.setText("");
		usuariosDispositivoListBox.setData(lsUsuariosAtreladosDispositivo);
	}

	public void onClick$btnAdicionarUsuario(Event ev) {
		for (Object usuario : usuarioSelecionadoListBox.getListData()) {
			UsuarioEmbarcadaVO usuarioSelecionado = (UsuarioEmbarcadaVO) usuario;

			if (!lsUsuariosAtreladosDispositivo.contains(usuarioSelecionado)) {
				lsUsuariosAtreladosDispositivo.add(usuarioSelecionado);
				lsUsuariosAdicionadosAtreladosDispositivo.add(usuarioSelecionado);
			}
		}
		usuariosDispositivoListBox.setData(lsUsuariosAtreladosDispositivo);
		usuarioSelecionadoListBox.getListData().clear();
		usuariosDispositivoListBox.renderAll();
	}

	public void onClick$btnRemoverUsuario(Event ev) {
		UsuarioEmbarcadaVO usuarioSelecionado = (UsuarioEmbarcadaVO) usuariosDispositivoListBox.getSelected();
		if (usuarioSelecionado != null && usuarioSelecionado.getUsuarioId() != null) {
			lsUsuariosRemovidosAtreladosDispositivo.add(usuarioSelecionado);
			lsUsuariosAtreladosDispositivo.remove(usuarioSelecionado);
			usuariosDispositivoListBox.setData(lsUsuariosAtreladosDispositivo);
		}
		usuariosDispositivoListBox.renderAll();
	}

	public void onClick$btnPesquisaUsuario(Event ev) {
		executarPesquisaUsuario();
	}

	private void aplicarFiltro() {
		String filtro = txtFiltro.getText();
		if (filtro.isEmpty()) {
			usuariosDispositivoListBox.setData(lsUsuariosAtreladosDispositivo);
			return;
		}
		List<UsuarioEmbarcadaVO> lsUsuariosFiltrado = new ArrayList<UsuarioEmbarcadaVO>();
		for (UsuarioEmbarcadaVO usuarioEmbarcadaVO : lsUsuariosAtreladosDispositivo) {
			if (usuarioEmbarcadaVO.getCveusuario().toUpperCase().contains(filtro.toUpperCase())) {
				lsUsuariosFiltrado.add(usuarioEmbarcadaVO);
			}
		}
		usuariosDispositivoListBox.setData(lsUsuariosFiltrado);
		usuariosDispositivoListBox.renderAll();
	}
	
	private void executarPesquisaUsuario() {
		usuarioPesquisaSelecaoListBox.setItemRenderer(new RenderUsuarioDispositivoSelecao(new EventListener() {
			// Este evento será acionado quando for clicado no botao (+) para adicionar
			@Override
			public void onEvent(Event arg0) throws Exception {
				UsuarioEmbarcadaVO usuarioClicado = (UsuarioEmbarcadaVO) arg0.getTarget().getAttribute("data");
				if (usuarioSelecionadoListBox.getListData().isEmpty()) {
					usuarioSelecionadoListBox.addItemNovo(usuarioClicado);
				} else {
					for (Object usuarioEmbarcadaVO : usuarioSelecionadoListBox.getListData()) {
						if (!((UsuarioEmbarcadaVO) usuarioEmbarcadaVO).equals(usuarioClicado)) {
							usuarioSelecionadoListBox.addItemNovo(usuarioClicado);
							break;
						}
					}
				}
				usuarioPesquisaSelecaoListBox.removeItem(usuarioClicado);
			}
		}));

		String termoPesquisaLogin = txtPalavraPesquisaUsuario.getText();
		List<UsuarioEmbarcadaVO> lsUsuariosSemAdicionadas = new ArrayList<UsuarioEmbarcadaVO>();

		for (UsuarioEmbarcadaVO usuarioEmbarcadaVO : lsTodosUsuariosPontoVendaInicial) {
			if (usuarioEmbarcadaVO.getCveusuario() != null && usuarioEmbarcadaVO.getCveusuario().toUpperCase().contains(termoPesquisaLogin.toUpperCase())) {
				lsUsuariosSemAdicionadas.add(usuarioEmbarcadaVO);
			}
		}

		usuarioPesquisaSelecaoListBox.setData(lsUsuariosSemAdicionadas);

		if (usuarioPesquisaSelecaoListBox.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioLinhasHorarioController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	/**
	 * Converte lista para List<EmbarcadaDispOperador>
	 * 
	 * @param usuarioEmbarcadaVOList
	 * @param dispositivoId
	 * @param puntoVentaId
	 * @return
	 */
	private List<EmbarcadaDispOperador> converteParaEmbarcadaDispOperador(List<UsuarioEmbarcadaVO> usuarioEmbarcadaVOList, Long dispositivoId, Long puntoVentaId) {
		List<EmbarcadaDispOperador> embarcadaDispOperadorList = new ArrayList<EmbarcadaDispOperador>();
		for (UsuarioEmbarcadaVO usuarioEmbarcadaVO : usuarioEmbarcadaVOList) {
			EmbarcadaDispOperador embarcadaDispOperador = new EmbarcadaDispOperador(usuarioEmbarcadaVO.getUsuarioId(), dispositivoId, puntoVentaId, null, null);
			embarcadaDispOperadorList.add(embarcadaDispOperador);
		}
		return embarcadaDispOperadorList;
	}

}
