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.Affiliation;

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

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

    private FlowPanel multipleAffiliationsPanel = new FlowPanel();
    private List<AffiliationInfoWidget> affiliationInfoWidgetList = new ArrayList<>();

    private IconAnchor addMore = new IconAnchor();

    public MultipleAffiliationsWidget() {

        final AffiliationInfoWidget affiliationInfoWidget = new AffiliationInfoWidget();
        affiliationInfoWidgetList.add(affiliationInfoWidget);
        multipleAffiliationsPanel.add(affiliationInfoWidget.asWidget());
        AffiliationInfoWidget.DeleteAffiliationListener deleteAffiliationListener = new AffiliationInfoWidget.DeleteAffiliationListener() {
            @Override
            public void deleteAffiliation() {
                affiliationInfoWidgetList.remove(affiliationInfoWidget);
                multipleAffiliationsPanel.remove(affiliationInfoWidget.asWidget());
            }
        };
        affiliationInfoWidget.setDeleteAffiliationListener(deleteAffiliationListener);

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

                final AffiliationInfoWidget affiliationInfoWidget = new AffiliationInfoWidget();
                affiliationInfoWidgetList.add(affiliationInfoWidget);
                multipleAffiliationsPanel.insert(affiliationInfoWidget.asWidget(), multipleAffiliationsPanel.getWidgetIndex(addMore));
                AffiliationInfoWidget.DeleteAffiliationListener deleteAffiliationListener = new AffiliationInfoWidget.DeleteAffiliationListener() {
                    @Override
                    public void deleteAffiliation() {
                        affiliationInfoWidgetList.remove(affiliationInfoWidget);
                        multipleAffiliationsPanel.remove(affiliationInfoWidget.asWidget());
                    }
                };
                affiliationInfoWidget.setDeleteAffiliationListener(deleteAffiliationListener);
            }
        });
        multipleAffiliationsPanel.add(addMore);
    }

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

    public List<Affiliation> getAffiliations() {

        List<Affiliation> affiliationList = new ArrayList<>();

        for(AffiliationInfoWidget affiliationInfoWidget : affiliationInfoWidgetList) {

            if(affiliationInfoWidget.getAffiliation()!=null)
                affiliationList.add(affiliationInfoWidget.getAffiliation());

        }

        return affiliationList;
    }

    public void clear() {

        multipleAffiliationsPanel.clear();
        affiliationInfoWidgetList = new ArrayList<>();

        final AffiliationInfoWidget affiliationInfoWidget = new AffiliationInfoWidget();
        AffiliationInfoWidget.DeleteAffiliationListener deleteAffiliationListener = new AffiliationInfoWidget.DeleteAffiliationListener() {
            @Override
            public void deleteAffiliation() {
                affiliationInfoWidgetList.remove(affiliationInfoWidget);
                multipleAffiliationsPanel.remove(affiliationInfoWidget.asWidget());
            }
        };
        affiliationInfoWidget.setDeleteAffiliationListener(deleteAffiliationListener);
        affiliationInfoWidgetList.add(affiliationInfoWidget);
        multipleAffiliationsPanel.add(affiliationInfoWidget.asWidget());
        multipleAffiliationsPanel.add(addMore);
    }

    public void loadAffiliations(List<Affiliation> affiliationList) {

        if(!affiliationList.isEmpty()) {
            multipleAffiliationsPanel.clear();
            affiliationInfoWidgetList = new ArrayList<>();

            for (Affiliation affiliation : affiliationList) {
                final AffiliationInfoWidget affiliationInfoWidget = new AffiliationInfoWidget();
                AffiliationInfoWidget.DeleteAffiliationListener deleteAffiliationListener = new AffiliationInfoWidget.DeleteAffiliationListener() {
                    @Override
                    public void deleteAffiliation() {
                        affiliationInfoWidgetList.remove(affiliationInfoWidget);
                        multipleAffiliationsPanel.remove(affiliationInfoWidget.asWidget());
                    }
                };
                affiliationInfoWidget.setDeleteAffiliationListener(deleteAffiliationListener);
                affiliationInfoWidget.loadAffiliation(affiliation);
                affiliationInfoWidgetList.add(affiliationInfoWidget);
                multipleAffiliationsPanel.add(affiliationInfoWidget.asWidget());
            }
            multipleAffiliationsPanel.add(addMore);
        }
    }
}
