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.Window;
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 String table;
    private String field;
    
    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) {

    	this.table = table;
    	this.field = 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(MultipleValuesWidget.this.table, MultipleValuesWidget.this.field,MultipleValuesWidget.this.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 void setValues(List<String> values,String table, String field){
    	this.field=field;
    	this.table=table;
    	 multipleValuesPanel.remove(addMore);
    	for(int i=0;i<values.size();i++){

    		if(valuesWidgetList.size()>i){
    			valuesWidgetList.get(i).setTable(table);
    			valuesWidgetList.get(i).setField(field);
    			valuesWidgetList.get(i).setValue(values.get(i));
    			valuesWidgetList.get(i).setBlackList((ArrayList<String>)values);
    			this.blacklist = (ArrayList<String>) values;
    		}else{
    			ValuesWidget tempValuesWidget = new ValuesWidget(table, field, (ArrayList<String>)values);
        		tempValuesWidget.setValue(values.get(i));
        		valuesWidgetList.add(tempValuesWidget);
        		multipleValuesPanel.add(tempValuesWidget.asWidget());
    		}
    		
    	}
    	 multipleValuesPanel.add(addMore);
    }
    
    
    public List<String> getValues() {

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

        for(ValuesWidget valuesWidget : valuesWidgetList) {

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

        return valuesList;
    }
}
