package eu.dnetlib.client.widgets;

import com.github.gwtbootstrap.client.ui.base.IconAnchor;
import com.github.gwtbootstrap.client.ui.constants.AlternateSize;
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.Label;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.widget.core.client.info.Info;
import eu.dnetlib.goldoa.domain.Affiliation;
import eu.dnetlib.goldoa.domain.Organization;
import eu.dnetlib.goldoa.domain.Vocabulary;

/**
 * Created by stefania on 3/10/15.
 */
public class AffiliationInfoWidget implements IsWidget {

    private FlowPanel affiliationPanel = new FlowPanel();

    private AutoCompleteWidget organizationAutoComplete = new AutoCompleteWidget("organisation", "Search or insert institution");
    private TextBox departmentTextBox = new TextBox();
    private IconAnchor deleteIcon = new IconAnchor();
    private Label commentLabel = new Label();

    private Affiliation affiliation = new Affiliation();

    private Vocabulary organization = null;

    private DeleteAffiliationListener deleteAffiliationListener;

    public AffiliationInfoWidget() {

        affiliationPanel.addStyleName("affiliationPanel");

        AutoCompleteWidget.AutoCompleteListener organizationAutoCompleteListener = new AutoCompleteWidget.AutoCompleteListener() {
            @Override
            public void valueSelected(Vocabulary vocabulary) {
                organization = vocabulary;
            }
        };
        organizationAutoComplete.setAutoCompleteListener(organizationAutoCompleteListener);
        organizationAutoComplete.addStyleName("inlineBlock");

        departmentTextBox.setAlternateSize(AlternateSize.MEDIUM);
        departmentTextBox.setPlaceholder(" Department (optional)");
        departmentTextBox.addStyleName("inlineBlock");

        deleteIcon.setIcon(IconType.REMOVE);
        deleteIcon.addStyleName("inlineBlock");
        deleteIcon.addStyleName("deleteIcon");
        deleteIcon.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {

                if(deleteAffiliationListener !=null)
                    deleteAffiliationListener.deleteAffiliation();
            }
        });

        commentLabel.setText("Search using the name as it appears in CORDA");
        commentLabel.addStyleName("comment");
        commentLabel.addStyleName("fontItalic");

        affiliationPanel.add(organizationAutoComplete);
        affiliationPanel.add(departmentTextBox);
        affiliationPanel.add(deleteIcon);
        affiliationPanel.add(commentLabel);
    }

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

    public interface DeleteAffiliationListener {
        public void deleteAffiliation();
    }

    public void setDeleteAffiliationListener(DeleteAffiliationListener deleteAffiliationListener) {
        this.deleteAffiliationListener = deleteAffiliationListener;
    }

    public Affiliation getAffiliation() {

        if(!organizationAutoComplete.getValue().equals("")) {

            if(organization!=null && organization.getName().equals(organizationAutoComplete.getValue())) {

                Organization organization = new Organization();
                organization.setName(this.organization.getName());
                organization.setId(this.organization.getId());
                affiliation.setOrganization(organization);

            } else {

                Organization organization = new Organization();
                organization.setName(organizationAutoComplete.getValue());
                affiliation.setOrganization(organization);
            }

            if(!departmentTextBox.getValue().trim().equals(""))
                affiliation.setDepartment(departmentTextBox.getValue().trim());

            return affiliation;
        }

        return null;
    }

    public void clear() {

        organization = null;
        organizationAutoComplete.setValue("");
        departmentTextBox.setValue("");
    }

    public void loadAffiliation(Affiliation affiliation) {

        if(affiliation.getOrganization()!=null) {
            organization = new Vocabulary();
            organization.setId(affiliation.getOrganization().getId());
            organization.setName(affiliation.getOrganization().getName());
            organizationAutoComplete.setValue(affiliation.getOrganization().getName());
        }

        if(affiliation.getDepartment()!=null)
            departmentTextBox.setValue(affiliation.getDepartment());
    }
}
