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 eu.dnetlib.goldoa.domain.PublicationIdentifier;

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

/**
 * Created by stefania on 3/11/15.
 */
public class MultipleIdentifiersWidget implements IsWidget {

    private FlowPanel multipleIdentifiersPanel = new FlowPanel();
    private List<IdentifierInfoWidget> identifierInfoWidgetList = new ArrayList<>();

    private IconAnchor addMore = new IconAnchor();

    public MultipleIdentifiersWidget() {

        final IdentifierInfoWidget identifierInfoWidget = new IdentifierInfoWidget();
        identifierInfoWidgetList.add(identifierInfoWidget);
        multipleIdentifiersPanel.add(identifierInfoWidget.asWidget());
        IdentifierInfoWidget.DeleteIdentifierListener deleteIdentifierListener = new IdentifierInfoWidget.DeleteIdentifierListener() {
            @Override
            public void deleteIdentifier() {
                identifierInfoWidgetList.remove(identifierInfoWidget);
                multipleIdentifiersPanel.remove(identifierInfoWidget.asWidget());
            }
        };
        identifierInfoWidget.setDeleteIdentifierListener(deleteIdentifierListener);

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

                final IdentifierInfoWidget identifierInfoWidget = new IdentifierInfoWidget();
                identifierInfoWidgetList.add(identifierInfoWidget);
                multipleIdentifiersPanel.insert(identifierInfoWidget.asWidget(), multipleIdentifiersPanel.getWidgetIndex(addMore));
                IdentifierInfoWidget.DeleteIdentifierListener deleteIdentifierListener = new IdentifierInfoWidget.DeleteIdentifierListener() {
                    @Override
                    public void deleteIdentifier() {
                        identifierInfoWidgetList.remove(identifierInfoWidget);
                        multipleIdentifiersPanel.remove(identifierInfoWidget.asWidget());
                    }
                };
                identifierInfoWidget.setDeleteIdentifierListener(deleteIdentifierListener);
            }
        });
        multipleIdentifiersPanel.add(addMore);
    }

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

    public List<PublicationIdentifier> getPublicationIdentifiers() {

        List<PublicationIdentifier> publicationIdentifierList = new ArrayList<>();

        for(IdentifierInfoWidget identifierInfoWidget : identifierInfoWidgetList) {

            if(identifierInfoWidget.getPublicationIdentifier()!=null)
                publicationIdentifierList.add(identifierInfoWidget.getPublicationIdentifier());
        }

        return publicationIdentifierList;
    }

    public void clear() {

        multipleIdentifiersPanel.clear();
        identifierInfoWidgetList = new ArrayList<>();

        final IdentifierInfoWidget identifierInfoWidget = new IdentifierInfoWidget();
        IdentifierInfoWidget.DeleteIdentifierListener deleteIdentifierListener = new IdentifierInfoWidget.DeleteIdentifierListener() {
            @Override
            public void deleteIdentifier() {
                identifierInfoWidgetList.remove(identifierInfoWidget);
                multipleIdentifiersPanel.remove(identifierInfoWidget.asWidget());
            }
        };
        identifierInfoWidget.setDeleteIdentifierListener(deleteIdentifierListener);
        identifierInfoWidgetList.add(identifierInfoWidget);
        multipleIdentifiersPanel.add(identifierInfoWidget.asWidget());
        multipleIdentifiersPanel.add(addMore);
    }

    public void loadPublicationIdentifiers(List<PublicationIdentifier> publicationIdentifierList) {

        if(!publicationIdentifierList.isEmpty()) {
            multipleIdentifiersPanel.clear();
            identifierInfoWidgetList = new ArrayList<>();

            for (PublicationIdentifier publicationIdentifier : publicationIdentifierList) {
                final IdentifierInfoWidget identifierInfoWidget = new IdentifierInfoWidget();
                IdentifierInfoWidget.DeleteIdentifierListener deleteIdentifierListener = new IdentifierInfoWidget.DeleteIdentifierListener() {
                    @Override
                    public void deleteIdentifier() {
                        identifierInfoWidgetList.remove(identifierInfoWidget);
                        multipleIdentifiersPanel.remove(identifierInfoWidget.asWidget());
                    }
                };
                identifierInfoWidget.setDeleteIdentifierListener(deleteIdentifierListener);
                identifierInfoWidget.loadPublicationIdentifier(publicationIdentifier);
                identifierInfoWidgetList.add(identifierInfoWidget);
                multipleIdentifiersPanel.add(identifierInfoWidget.asWidget());
            }
            multipleIdentifiersPanel.add(addMore);
        }
    }
}
