package com.rjconsultores.ventaboletos.web.utilerias.render;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;

import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;

/**
 * @author emerson
 * 
 * Este render exibirá as colunas que forem informadas no construtor. 
 * O nome das colunas deverão ter o mesmo nome do campo da classe.
 *
 */
public class RenderPersonalizado<T> implements ListitemRenderer {

	List<String> colunas = new ArrayList<String>();
	Boolean addBotaoExcluir = false;

	public RenderPersonalizado(List<String> colunas) {
		this.colunas = colunas;
	}
	
	public RenderPersonalizado<T> comBotaoExcluir() {
		this.addBotaoExcluir = true;
		return this;
	}

	@Override
	public void render(Listitem item, Object objeto) throws Exception {
		incluirColunasRender(item, objeto);
		
		if (addBotaoExcluir) {
			Listcell lc = new Listcell();
			lc.setParent(item);
			lc.appendChild(criaBotaoExcluir());
		}

		item.setAttribute("data", (T)objeto);
	}

	protected void incluirColunasRender(Listitem item, Object objeto) throws IllegalAccessException, InvocationTargetException {
		incluirColunasSelecionadas(item, objeto);
	}

	private void incluirColunasSelecionadas(Listitem item, Object objeto) throws IllegalAccessException, InvocationTargetException {
		Method[] methods = objeto.getClass().getDeclaredMethods();
		for (String coluna : colunas) {
			String nomeMetodo = obtemMetodoGet(coluna);
			for (Method method : methods) {
				if (method.getName().equals(nomeMetodo)) {
					Listcell lc;
					try {
						lc = new Listcell(method.invoke((T)objeto).toString());
					} catch (NullPointerException e) {
						lc = new Listcell(" - ");
					}
					lc.setParent(item);
					break;
				}
			}
		}
	}
	
	private Button criaBotaoExcluir() {
		Button botaoExcluir = new Button();
		botaoExcluir.setWidth("16");
		botaoExcluir.setHeight("16");
		botaoExcluir.setImage("/gui/img/remove.png");

		botaoExcluir.addEventListener("onClick", new EventListenerExcluirRegistroRender());
		return botaoExcluir;
	}

	private String obtemMetodoGet(String coluna) {
		return "get".concat(coluna.substring(0, 1).toUpperCase().concat(coluna.substring(1)));
	}

	private final class EventListenerExcluirRegistroRender implements EventListener {
		@Override
		public void onEvent(Event event) throws Exception {
			MyListbox listBox = (MyListbox) event.getTarget().getParent().getParent().getParent();
			Listitem listItem = (Listitem) event.getTarget().getParent().getParent();
			listBox.removeItem(listItem.getAttribute("data"));
		}
	}

}
