
/*
 * 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.HashMap;
import java.util.List;
import java.util.Map;

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.zul.Button;

import com.rjconsultores.ventaboletos.entidad.ConfTotemVentaRapida;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.service.ConfTotemVentaRapidaService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfTotemVentaRapidaOrigemDestino;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderParadaConfTotem;

/**
 *
 * @author Wallace
 */
@Controller("editarConfTotemVentaRapidaController")
@Scope("prototype")
public class EditarConfTotemVentaRapidaController extends MyGenericForwardComposer {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Autowired
	private static Logger log = LogManager.getLogger(EditarConfTotemVentaRapidaController.class);
	private MyComboboxParada cmbParadaOrigem;
	private MyListbox localidadesDestinoList;
	@Autowired
	private ParadaService paradaService;
	@Autowired
	private ConfTotemVentaRapidaService confTotemVentaRapidaService;
	private MyListbox localidadesOrigemDestinoList;
	private ConfTotemVentaRapida confTotemVentaRapida;
	private Button btnApagar;
	private BusquedaConfTotemController busquedaConfTotemController;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		localidadesOrigemDestinoList.setItemRenderer(new RenderConfTotemVentaRapidaOrigemDestino());
		confTotemVentaRapida = (ConfTotemVentaRapida) Executions.getCurrent().getArg().get("confTotemVentaRapidaOrigemDestino");
		localidadesOrigemDestinoList.setData(confTotemVentaRapidaService.buscarOrigem(confTotemVentaRapida.getOrigen()));
		busquedaConfTotemController = (BusquedaConfTotemController) Executions.getCurrent().getArg().get("busquedaConfTotemController");

		if(confTotemVentaRapida.getOrigen() != null){
			cmbParadaOrigem.setValue(confTotemVentaRapida.getOrigen().getDescparada());
			cmbParadaOrigem.setComboItemByParada((Parada) confTotemVentaRapida.getOrigen());
			cmbParadaOrigem.setDisabled(Boolean.TRUE);
		}

		if (confTotemVentaRapida == null) {
			btnApagar.setVisible(Boolean.FALSE);
		}

		refreshLista();
	}

	private void refreshLista() {
		try {
			executarPesquisaLocalidadesDestino();
		} catch (Exception e) {
			log.error(e);
		}
		
		cmbParadaOrigem.addEventListener("onSelect", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {
				if (cmbParadaOrigem.getSelectedItem() != null) {
					executarPesquisaLocalidadesDestino();
				}
			}
		});

	}

	public void onClick$btnPesquisa(Event ev) {
		refreshLista();
	}

	public void onClick$btnRefresh(Event ev) {
		refreshLista();
	}

	public void onClick$buttonSalvar(Event ev) throws InterruptedException {
		
		if(localidadesOrigemDestinoList.getListData().isEmpty() && confTotemVentaRapida.getOrigen() == null){
			Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
					Labels.getLabel("customController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}
		if(cmbParadaOrigem.getSelectedObject() != null){
			confTotemVentaRapidaService.apagarPorOrigem(confTotemVentaRapida.getOrigen());
		}
				
		try {

			Map<Integer, Parada> origens = new HashMap<Integer, Parada>();
			@SuppressWarnings("unchecked")
			List<ConfTotemVentaRapida> list = localidadesOrigemDestinoList.getListData();
			for (ConfTotemVentaRapida confTotemVentaRapidaOrigemDestino : list) {
				origens.put(confTotemVentaRapidaOrigemDestino.getOrigen().getParadaId(), confTotemVentaRapidaOrigemDestino.getOrigen());
			}

			for (Map.Entry<Integer, Parada> entry : origens.entrySet()) {
					for (ConfTotemVentaRapida confTotemVentaRapidaOrigemDestino : list) {
						if (entry.getKey().equals(confTotemVentaRapidaOrigemDestino.getOrigen().getParadaId())) {
							ConfTotemVentaRapida entidad = confTotemVentaRapidaService.buscarOrigemDestino(confTotemVentaRapidaOrigemDestino.getOrigen(), confTotemVentaRapidaOrigemDestino.getDestino());
							if(entidad == null){
								entidad = new ConfTotemVentaRapida();
								entidad.setOrigen(confTotemVentaRapidaOrigemDestino.getOrigen());
								entidad.setDestino(confTotemVentaRapidaOrigemDestino.getDestino());
								confTotemVentaRapidaService.suscribir(entidad);;
							}
						}
					}
				}
			
		} catch (Exception ex) {
			log.error("", ex);
		}
		busquedaConfTotemController.buscarOrigenDestinosVentaRapida();
		try {
			Messagebox.show(
					Labels.getLabel("busquedaConfTotemController.MSG.suscribirOK"),
					Labels.getLabel("busquedaConfTotemController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		} catch (InterruptedException ex) {
			log.error(ex);
		}
		closeWindow();
	}
	
	public void apagarHistorico(){
		
	}

	private void executarPesquisaLocalidadesDestino() throws InterruptedException {

		if(cmbParadaOrigem.getModel() == null){
			return;
		}
		final Parada origem = (Parada) cmbParadaOrigem.getModel().getElementAt(0);
		List<Parada> lsParadas = paradaService.buscarDestinosPorOrigem(origem.getParadaId());
		if(lsParadas != null){
			localidadesDestinoList.setData(paradaService.buscarDestinosPorOrigem(origem.getParadaId()));

		}
		try {

			localidadesDestinoList.setItemRenderer(new RenderParadaConfTotem(new EventListener() {
				@Override
				public void onEvent(Event arg0) throws Exception {
					Parada destino = (Parada) arg0.getTarget().getAttribute("data");
					if (arg0.getTarget().getAttribute("tipo").equals(RenderParadaConfTotem.BOTAO_ADICIONAR_PERMISSAO)) {
						if (localidadesOrigemDestinoList.getListData().isEmpty()) {
							ConfTotemVentaRapida vo = new ConfTotemVentaRapida();
							vo.setOrigen(origem);
							vo.setDestino(destino);
							localidadesOrigemDestinoList.addItemNovo(vo);
						} else {
							for (Object objectParada : localidadesOrigemDestinoList.getListData()) {
								if (localidadesOrigemDestinoList.getListData().contains(new ConfTotemVentaRapida(origem, destino))) {
									return;
								}
								if (!(((ConfTotemVentaRapida) objectParada).getDestino().equals(destino) && ((ConfTotemVentaRapida) objectParada).getOrigen().equals(origem))) {
									ConfTotemVentaRapida vo = new ConfTotemVentaRapida();
									vo.setOrigen(origem);
									vo.setDestino(destino);
									localidadesOrigemDestinoList.addItemNovo(vo);
									break;
								}
							}
						}
					}
				}
			}));
		} catch (Exception e) {
			log.error("", e);
		}

	}

	public void onClick$btnRemoverOrigemDestino(Event ev) throws InterruptedException {

		try {
			localidadesOrigemDestinoList.removeItem(localidadesOrigemDestinoList.getSelected());
		} catch (Exception ex) {
			log.error("", ex);
		}
	}

}
