package com.rjconsultores.ventaboletos.web.utilerias;

import java.util.ArrayList;
import java.util.List;

import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.InputEvent;
import org.zkoss.zkplus.databind.BindingListModel;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zkplus.spring.SpringUtil;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;

import com.rjconsultores.ventaboletos.entidad.ClienteCorporativo;
import com.rjconsultores.ventaboletos.service.ClienteCorporativoService;

public class MyComboboxClienteCorporativo extends Combobox {

	private static final long serialVersionUID = 1L;
	
	public final static int minLength = 2;
	private ClienteCorporativoService clienteService;
	private List<ClienteCorporativo> lsClienteCorporativo;
	private ClienteCorporativo initialValue;
	private Integer indiceSelected = null;
	private boolean sinTodos = false;
	private Long ID_TODOS = -1L;

	public MyComboboxClienteCorporativo() {
		super();

		clienteService = (ClienteCorporativoService) SpringUtil.getBean("clienteCorpService");
		lsClienteCorporativo = new ArrayList<ClienteCorporativo>();

		this.setAutodrop(false);
		this.setAutocomplete(false);
		

		this.addEventListener("onOK", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				String strClienteCorporativo = MyComboboxClienteCorporativo.this.getText().toUpperCase();
				if (strClienteCorporativo.length() < MyComboboxClienteCorporativo.minLength) {
					return;
				}
				if (!strClienteCorporativo.isEmpty()) {
					lsClienteCorporativo = clienteService.buscaLike(strClienteCorporativo);

					if (sinTodos) {
						ClienteCorporativo e = clienteService.obtenerID(ID_TODOS);
						lsClienteCorporativo.remove(e);
					}

					BindingListModel listModelParada = new BindingListModelList(lsClienteCorporativo, true);
					MyComboboxClienteCorporativo.this.setModel(listModelParada);
					setIndiceSelected(null);
					if (!lsClienteCorporativo.isEmpty()) {
						setIndiceSelected(0);
					}

					MyComboboxClienteCorporativo.this.open();
				} else {
					lsClienteCorporativo.clear();

					BindingListModel listModelClienteCorporativo = new BindingListModelList(lsClienteCorporativo, true);
					MyComboboxClienteCorporativo.this.setModel(listModelClienteCorporativo);
				}
			}
		});

		this.addEventListener("onChanging", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				InputEvent ev = (InputEvent) event;
				String strClienteCorporativo = ev.getValue();
				if (strClienteCorporativo.length() < 2) {
					lsClienteCorporativo.clear();

					BindingListModel listModelClienteCorporativo = new BindingListModelList(lsClienteCorporativo, true);
					MyComboboxClienteCorporativo.this.setModel(listModelClienteCorporativo);

					MyComboboxClienteCorporativo.this.close();
				}
			}
		});
	}

	public ClienteCorporativo getInitialValue() {
		return initialValue;
	}

	public void setInitialValue(ClienteCorporativo initialValue) {
		if (initialValue == null) {
			return;
		}
		List<ClienteCorporativo> ls = new ArrayList<ClienteCorporativo>();
		ls.add(initialValue);

		this.setModel(new BindingListModelList(ls, false));
		this.setText(initialValue.getNomeClienteCorp());
	}

	/**
	 * 
	 * @param checaBusqueda
	 * @throws WrongValueException
	 */
	public String getValue(boolean checaBusqueda) throws WrongValueException {
		if (checaBusqueda) {
			if (this.getSelectedItem() == null) {
				throw new WrongValueException(this, Labels.getLabel("MSG.Error.combobox.hacerBusqueda"));
			}
		}

		return super.getValue();
	}

	public boolean isSinTodos() {
		return sinTodos;
	}

	public void setSinTodos(boolean sinTodos) {
		this.sinTodos = sinTodos;
	}

	public void setComboItemByClienteCorporativo(ClienteCorporativo cliente) {

		List<ClienteCorporativo> ls = new ArrayList<ClienteCorporativo>();
		ls.add(cliente);

		this.setModel(new BindingListModelList(ls, false));
		this.setText(cliente.getNomeClienteCorp());
	}
	
	public Comboitem getItemPorId(Long id) {
		for (ClienteCorporativo cli : lsClienteCorporativo) {
			if(cli.getClienteCorporativoId().equals(id)) {
				Comboitem ciClienteCorporativo = new Comboitem(cli.toString());
				ciClienteCorporativo.setAttribute("value", cli);
				ciClienteCorporativo.setValue(cli);
				return ciClienteCorporativo;
			}
		}
		return null;
	}

	public Integer getIndiceSelected() {
		return indiceSelected;
	}

	public void setIndiceSelected(Integer indiceSelected) {
		this.indiceSelected = indiceSelected;
	}
	
	public ClienteCorporativo getSelectedCliente() {
		return super.getSelectedItem() != null ? (ClienteCorporativo) super.getSelectedItem().getValue():null;
	}
	
	public void setSelectedCliente(Long clienteId) {
		if( clienteId != null) {
			ClienteCorporativo cliente = clienteService.obtenerID(clienteId);
			
			for(Object obj : this.getItems()) {
				Comboitem item = (Comboitem)obj;
				if(item.getValue().equals(cliente)) {
					this.setSelectedItem(item);
					return;
				}
			}
			
			if( this.getItems().isEmpty() ) {
				Comboitem ciCliente = new Comboitem(cliente.toString());
				ciCliente.setAttribute("value", cliente);
				ciCliente.setValue(cliente);
				ciCliente.setParent(this);
				this.setSelectedItem(ciCliente);
			}
		}
	}
	
	@Override
	public boolean equals(Object o) {
		return super.equals(o);
	}

}
