package com.ix.adpoint.gui.model;

import java.lang.reflect.Constructor;
import javax.annotation.Nullable;
import org.jdesktop.swingx.autocomplete.ObjectToStringConverter;

/** To use this class, item I must have a contructor that accept a String as the only param */
public abstract class EditableComboBoxModel<I> extends ComboBoxModelExtended<I> {
	@Nullable
	private final ObjectToStringConverter converter;

	public EditableComboBoxModel(@Nullable ObjectToStringConverter converter,
		boolean firstItemShouldBeNull) {
		super(firstItemShouldBeNull);
		this.converter = converter;
	}

	@SuppressWarnings("unchecked")
	@Override
	public void setSelectedItem(Object item) {
		if ("".equals(item))
			item = null;
		if (item instanceof String) {
			if (converter != null)
				for(Object o : getData())
					if (item.equals(converter.getPreferredStringForItem(o))) {
						super.setSelectedItem(o);
						selected = (I) o;
						return;
					}
			try {
				Constructor<I> constructor = getItemClass().getConstructor(String.class);
				item = constructor.newInstance(item);
				super.setSelectedItem(item);
				selected = (I) item;
			} catch(Exception ex) {
				throw new RuntimeException("Could not instantiate " + getItemClass().getSimpleName(), ex);
			}
		} else
			super.setSelectedItem(item);
	}

	/** Forces overriding of this method, as it is needed to create the just created item */
	@Override
	public abstract Class<I> getItemClass();
}