package eu.dnetlib.client.widgets;

import com.github.gwtbootstrap.client.ui.base.IconAnchor;
import com.github.gwtbootstrap.client.ui.constants.IconType;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;

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


public class MultipleValuesWidget implements IsWidget {

    private FlowPanel multipleValuesPanel = new FlowPanel();
    private List<ValuesWidget> valuesWidgetList = new ArrayList<>();
    private ArrayList<String> blacklist = new ArrayList<String>();
    
    private IconAnchor addMore = new IconAnchor();

    public interface SearchingListener {
    	public void onSearch();
    	public void onReturn();
    }
    
    private SearchingListener searchingListener;
    
    public void setSearchingListener(SearchingListener searchingListener){
    	this.searchingListener = searchingListener;
    }
    
    public MultipleValuesWidget(final String table, final String field) {

        final ValuesWidget valueWidget = new ValuesWidget(table, field,blacklist);
        valuesWidgetList.add(valueWidget);
        multipleValuesPanel.add(valueWidget.asWidget());

        ValuesWidget.DeleteValueListener deleteValueListener = new ValuesWidget.DeleteValueListener() {
            @Override
            public void deleteValue() {
                valuesWidgetList.remove(valueWidget);
                multipleValuesPanel.remove(valueWidget.asWidget());
            }
        };
        valueWidget.setDeleteValueListener(deleteValueListener);

        addMore.setIcon(IconType.PLUS);
        addMore.setText("Add another value");
        addMore.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {

                final ValuesWidget valueWidget = new ValuesWidget(table, field,blacklist);
                valuesWidgetList.add(valueWidget);
                multipleValuesPanel.insert(valueWidget.asWidget(), multipleValuesPanel.getWidgetIndex(addMore));

                ValuesWidget.DeleteValueListener deleteValueListener = new ValuesWidget.DeleteValueListener() {
                    @Override
                    public void deleteValue() {
                        valuesWidgetList.remove(valueWidget);
                        multipleValuesPanel.remove(valueWidget.asWidget());
                    }
                };
                valueWidget.setDeleteValueListener(deleteValueListener);
            }
        });
        eu.dnetlib.client.widgets.ValuesWidget.SearchingListener valuesSearchingListener = new eu.dnetlib.client.widgets.ValuesWidget.SearchingListener() {
        	@Override
			public void onSearch() {
				if(searchingListener!=null)
					searchingListener.onSearch();
			}
			
			@Override
			public void onReturn() {
				if(searchingListener!=null)
					searchingListener.onReturn();
			}
		};
        valueWidget.setSearchingListener(valuesSearchingListener);
        multipleValuesPanel.add(addMore);
    }

    @Override
    public Widget asWidget() {
        return multipleValuesPanel;
    }

    public List<String> getValues() {

        List<String> valuesList = new ArrayList<>();

        for(ValuesWidget valuesWidget : valuesWidgetList) {

            if(valuesWidget.getValue()!=null)
                valuesList.add(valuesWidget.getValue());
        }

        return valuesList;
    }
}
