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

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.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.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.AgrupamentoParada;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.AgruparParadaService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderParada;

@Controller("editarCatalogoDeAgruparParadaController")
@Scope("prototype")
public class EditarCatalogoDeAgruparParadaController extends MyGenericForwardComposer {

	/**
	 * 
	 */
	private static final long serialVersionUID = 5631099822197596616L;

	@Autowired
	private AgruparParadaService agruparParadaService;
	@Autowired
	private ParadaService paradaService;
	private AgrupamentoParada agrupamentoParada;
	private MyListbox agrupamentoParadaList;
	private static Logger log = LogManager.getLogger(EditarCatalogoDeAgruparParadaController.class);
	private Textbox descAgrupamentoParada;
	private Textbox cveAgrupamentoParada;
	private MyListbox localidadesListbox;
	private List<Parada> lsLocalidades;
	private List<Parada> lsLocalidadesAdicionar;
	private List<Parada> lsLocalidadesApagar;
	private Combobox cmbLocalidade;

	public AgruparParadaService getAgruparParadaService() {
		return agruparParadaService;
	}

	public void setAgruparParadaService(AgruparParadaService agruparParadaService) {
		this.agruparParadaService = agruparParadaService;
	}

	public AgrupamentoParada getAgrupamentoParada() {
		return agrupamentoParada;
	}

	public void setAgrupamentoParada(AgrupamentoParada agrupamentoParada) {
		this.agrupamentoParada = agrupamentoParada;
	}

	public MyListbox getAgrupamentoParadaList() {
		return agrupamentoParadaList;
	}

	public void setAgrupamentoParadaList(MyListbox agrupamentoParadaList) {
		this.agrupamentoParadaList = agrupamentoParadaList;
	}

	public Textbox getDescAgrupamentoParada() {
		return descAgrupamentoParada;
	}

	public void setDescAgrupamentoParada(Textbox descAgrupamentoParada) {
		this.descAgrupamentoParada = descAgrupamentoParada;
	}

	public Textbox getCveAgrupamentoParada() {
		return cveAgrupamentoParada;
	}

	public void setCveAgrupamentoParada(Textbox cveAgrupamentoParada) {
		this.cveAgrupamentoParada = cveAgrupamentoParada;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		agrupamentoParada = (AgrupamentoParada) Executions.getCurrent().getArg().get("agrupamentoParada");
		agrupamentoParadaList = (MyListbox) Executions.getCurrent().getArg().get("agrupamentoParadaList");
		lsLocalidades = new ArrayList<Parada>();
		localidadesListbox.setItemRenderer(new RenderParada());
		if(agrupamentoParada !=null && agrupamentoParada.getAgrupamentoParadaId()!=null) {
			lsLocalidades = paradaService.buscarPorAgrupamentoParadaId(agrupamentoParada);			
		}
		localidadesListbox.setData(lsLocalidades);
		lsLocalidadesApagar = new ArrayList<Parada>();
		lsLocalidadesAdicionar = new ArrayList<Parada>();


	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		try {
			descAgrupamentoParada.getValue();
			cveAgrupamentoParada.getValue();
			agruparParadaService.suscribirActualizar(agrupamentoParada);
			agrupamentoParadaList.updateItem(agrupamentoParada);
			for (Parada parada : lsLocalidadesAdicionar) {
				paradaService.suscribirActualizar(parada);				
			}
			for (Parada parada : lsLocalidadesApagar) {
				paradaService.suscribirActualizar(parada);				
			}
			Messagebox.show(
					Labels.getLabel("editarCatalogoDeAgruparParadaController.MSG.suscribirOK"),
					Labels.getLabel("editarCatalogoDeAgruparParadaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			closeWindow();
		} catch (BusinessException ex) {
			Messagebox.show(
					ex.getLocalizedMessage(),
					Labels.getLabel("editarCatalogoDeAgruparParadaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

		}
	}

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

			if (resp == Messagebox.YES) {

				agruparParadaService.borrar(agrupamentoParada);
				for (Parada parada : lsLocalidades) {
					parada.setAgrupamentoParada(null);
					paradaService.suscribirActualizar(parada);				
				}

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

				agrupamentoParadaList.removeItem(agrupamentoParada);

				closeWindow();
			}
		} catch (Exception ex) {
			log.error(ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCatalogoDeAgruparParadaController.window.title"),
					Messagebox.INFORMATION);
		}
	}
	
	public void onClick$btnAdicionarLocalidade(Event ev) {

		Comboitem selectedItem = cmbLocalidade.getSelectedItem();
		if (selectedItem == null) {
			return;
		}

		Parada parada = (Parada) selectedItem.getValue();

		if(parada !=null) {
			for (Parada paradaAux : lsLocalidades ) {
				if (paradaAux.equals(parada)) {
					return;
				}
			}
			
			parada.setAgrupamentoParada(agrupamentoParada);
			lsLocalidades.add(parada);
			lsLocalidadesAdicionar.add(parada);
			localidadesListbox.setData(lsLocalidades);
		}
	}
	
	public void onClick$btnRemoverLocalidade(Event ev) throws InterruptedException {

		
		Parada parada  = (Parada) localidadesListbox.getSelected();

		if (parada != null) {
			lsLocalidades.remove(parada);
			parada.setAgrupamentoParada(null);
			if(lsLocalidadesAdicionar.contains(parada)) {
				lsLocalidadesAdicionar.remove(parada);
			}else {
				lsLocalidadesApagar.add(parada);				
			}
			localidadesListbox.setData(lsLocalidades);
		}

	}


}
