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

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.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.zkplus.databind.BindingListModel;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;

import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.RutaSecuencia;
import com.rjconsultores.ventaboletos.entidad.TaxaEmbLevante;
import com.rjconsultores.ventaboletos.entidad.TaxaEmbLevanteCtrl;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TaxaEmbLevanteCtrlService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTaxaEmbLevante;

@Controller("editarTaxaEmbLevanteController")
@Scope("prototype")
public class EditarTaxaEmbLevanteController extends MyGenericForwardComposer {

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

	@Autowired
	private TaxaEmbLevanteCtrlService taxaEmbLevanteCtrlService;

	@Autowired
	private RutaService rutaService;
	@Autowired
	private ParadaService paradaService;

	private TaxaEmbLevante taxaEmbLevante;
	private TaxaEmbLevanteCtrl taxaEmbLevanteCtrl;
	private MyListbox taxaEmbLevanteCtrlList;

	private MyListbox taxaEmbLevanteList;

	private List<Ruta> lsRuta;
	private Combobox cmbRuta;

	private Combobox cmbParadaOrigem;
	private List<Parada> lsParadaOrigem;
	private Combobox cmbParadaDestino;
	private List<Parada> lsParadaDestino;

	private List<TaxaEmbLevante> listTaxaLevante;

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

		taxaEmbLevanteCtrl = (TaxaEmbLevanteCtrl) Executions.getCurrent().getArg().get("taxaEmbLevanteCtrl");
		taxaEmbLevanteCtrlList = (MyListbox) Executions.getCurrent().getArg().get("taxaEmbLevanteCtrlList");

		if (taxaEmbLevanteCtrl.getTaxaEmbLevanteCtrlId() != null)
			taxaEmbLevanteCtrl = taxaEmbLevanteCtrlService.obtenerID(taxaEmbLevanteCtrl.getTaxaEmbLevanteCtrlId());

		listTaxaLevante = taxaEmbLevanteCtrl.getTaxaEmbLevanteList();

		super.doAfterCompose(comp);

		taxaEmbLevanteList.setItemRenderer(new RenderTaxaEmbLevante());
		taxaEmbLevanteList.addEventListener("onClick", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {
				taxaEmbLevante = (TaxaEmbLevante) taxaEmbLevanteList.getSelected();
			}
		});

		taxaEmbLevanteList.addEventListener("onDoubleClick", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {
				taxaEmbLevante = (TaxaEmbLevante) taxaEmbLevanteList.getSelected();
				itemSelecionado(taxaEmbLevante);
			}
		});

		lsRuta = rutaService.obtenerTodos();
		lsParadaOrigem = new ArrayList<Parada>();
		lsParadaDestino = new ArrayList<Parada>();

		if (taxaEmbLevanteCtrl.getTaxaEmbLevanteCtrlId() != null) {

			Comboitem ci = new Comboitem(taxaEmbLevanteCtrl.getRuta().toString());
			ci.setAttribute("value", taxaEmbLevanteCtrl.getRuta());
			ci.setValue(taxaEmbLevanteCtrl.getRuta());
			ci.setParent(cmbRuta);
			cmbRuta.setSelectedItem(ci);

			this.selectRuta();

			ci = new Comboitem(taxaEmbLevanteCtrl.getOrigem().getDescparada());
			ci.setAttribute("value", taxaEmbLevanteCtrl.getOrigem());
			ci.setValue(taxaEmbLevanteCtrl.getOrigem());
			ci.setParent(cmbParadaOrigem);
			cmbParadaOrigem.setSelectedItem(ci);

			ci = new Comboitem(taxaEmbLevanteCtrl.getDestino().getDescparada());
			ci.setAttribute("value", taxaEmbLevanteCtrl.getDestino());
			ci.setValue(taxaEmbLevanteCtrl.getDestino());
			ci.setParent(cmbParadaDestino);
			cmbParadaDestino.setSelectedItem(ci);

			taxaEmbLevanteCtrl = taxaEmbLevanteCtrlService.obtenerID(taxaEmbLevanteCtrl.getTaxaEmbLevanteCtrlId());
			List<TaxaEmbLevante> list = taxaEmbLevanteCtrl.getTaxaEmbLevanteList();
			taxaEmbLevanteList.setData(list);

		} else {
			taxaEmbLevanteList.setData(new ArrayList<TaxaEmbLevante>());
		}
	}

	public void itemSelecionado(TaxaEmbLevante taxa) {
		Map args = new HashMap();
		args.put("taxaEmbLevante", taxa);
		args.put("taxaEmbLevanteList", taxaEmbLevanteList);
		args.put("taxaEmbLevanteCtrl", taxaEmbLevanteCtrl);
		args.put("listTaxaLevante", listTaxaLevante);

		openWindow("/gui/tarifas/editarTaxaEmbLevanteParada.zul",
				Labels.getLabel("busquedaTaxaEmbLevanteController.editar.window.title"), args, MODAL);
	}

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

		if (cmbRuta.getSelectedItem().getValue() != null) {
			taxaEmbLevanteCtrl.setRuta((Ruta) cmbRuta.getSelectedItem().getValue());
		} else {
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("busquedaTaxaEmbLevanteController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}

		if (cmbParadaOrigem.getSelectedItem().getValue() != null) {
			taxaEmbLevanteCtrl.setOrigem((Parada) cmbParadaOrigem.getSelectedItem().getValue());
		} else {
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("busquedaTaxaEmbLevanteController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}

		if (cmbParadaDestino.getSelectedItem().getValue() != null) {
			taxaEmbLevanteCtrl.setDestino((Parada) cmbParadaDestino.getSelectedItem().getValue());
		} else {
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("busquedaTaxaEmbLevanteController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}

		taxaEmbLevanteCtrl.setTaxaEmbLevanteList(listTaxaLevante);

		if (taxaEmbLevanteCtrl.getTaxaEmbLevanteCtrlId() != null) {

			taxaEmbLevanteCtrlList.removeItem(taxaEmbLevanteCtrl);
			taxaEmbLevanteCtrlService.actualizacion(taxaEmbLevanteCtrl);
			taxaEmbLevanteCtrlList.updateItem(taxaEmbLevanteCtrl);

			Messagebox.show(
					Labels.getLabel("busquedaTaxaEmbLevanteControllerMSG.suscribirOK"),
					Labels.getLabel("busquedaTaxaEmbLevanteController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

		} else {
			taxaEmbLevanteCtrlService.suscribir(taxaEmbLevanteCtrl);
			taxaEmbLevanteCtrlList.addItemNovo(taxaEmbLevanteCtrl);

			Messagebox.show(
					Labels.getLabel("busquedaTaxaEmbLevanteControllerMSG.suscribirOK"),
					Labels.getLabel("busquedaTaxaEmbLevanteController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}

	}

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

			if (resp == Messagebox.YES) {

				taxaEmbLevante.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				taxaEmbLevante.setFecmodif(Calendar.getInstance().getTime());
				taxaEmbLevante.setActivo(Boolean.FALSE);

				int index = listTaxaLevante.indexOf(taxaEmbLevante);
				listTaxaLevante.set(index, taxaEmbLevante);

				taxaEmbLevanteList.removeItem(taxaEmbLevante);

			}
		} catch (Exception ex) {
			log.error("Erro apagar pricing : " + ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("busquedaTaxaEmbLevanteController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}
	}

	public void onClick$btnNovo(Event ev) {
		this.itemSelecionado(new TaxaEmbLevante());
	}

	public void onSelect$cmbRuta(Event ev) {
		this.selectRuta();
	}

	public void selectRuta() {

		Ruta ruta = (Ruta) cmbRuta.getSelectedItem().getValue();
		ruta = rutaService.obtenerID(ruta.getRutaId());

		for (RutaSecuencia rutaSecuencia : ruta.getRutaSecuenciaList()) {
			lsParadaOrigem.add(rutaSecuencia.getTramo().getOrigem());
			lsParadaDestino.add(rutaSecuencia.getTramo().getDestino());
		}
		lsParadaDestino.add(paradaService.obtenerID(Parada.ID_PARADA_TODOS));

		BindingListModel listModelParadaOrigem = new BindingListModelList(lsParadaOrigem, true);
		cmbParadaOrigem.setModel(listModelParadaOrigem);

		BindingListModel listModelParadaDestino = new BindingListModelList(lsParadaDestino, true);
		cmbParadaDestino.setModel(listModelParadaDestino);

	}

	public List<Ruta> getLsRuta() {
		return lsRuta;
	}

	public void setLsRuta(List<Ruta> lsRuta) {
		this.lsRuta = lsRuta;
	}

	public List<Parada> getLsParadaOrigem() {
		return lsParadaOrigem;
	}

	public void setLsParadaOrigem(List<Parada> lsParadaOrigem) {
		this.lsParadaOrigem = lsParadaOrigem;
	}

	public List<Parada> getLsParadaDestino() {
		return lsParadaDestino;
	}

	public void setLsParadaDestino(List<Parada> lsParadaDestino) {
		this.lsParadaDestino = lsParadaDestino;
	}

	public TaxaEmbLevanteCtrl getTaxaEmbLevanteCtrl() {
		return taxaEmbLevanteCtrl;
	}

	public void setTaxaEmbLevanteCtrl(TaxaEmbLevanteCtrl taxaEmbLevanteCtrl) {
		this.taxaEmbLevanteCtrl = taxaEmbLevanteCtrl;
	}

	public MyListbox getTaxaEmbLevanteCtrlList() {
		return taxaEmbLevanteCtrlList;
	}

	public void setTaxaEmbLevanteCtrlList(MyListbox taxaEmbLevanteCtrlList) {
		this.taxaEmbLevanteCtrlList = taxaEmbLevanteCtrlList;
	}

	public TaxaEmbLevante getTaxaEmbLevante() {
		return taxaEmbLevante;
	}

	public void setTaxaEmbLevante(TaxaEmbLevante taxaEmbLevante) {
		this.taxaEmbLevante = taxaEmbLevante;
	}

}
