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

/**
 * Created by stefania on 5/7/15.
 */
public class CoFunderInfoWidget implements IsWidget {

    private boolean isValid = true;

    private FlowPanel coFunderInfoPanel = new FlowPanel();

    private AutoCompleteWidget coFunderAutoComplete = new AutoCompleteWidget("funder", "Search or insert funder");
    private TextBox percentageTextBox = new TextBox();
    private IconAnchor deleteIcon = new IconAnchor();
    private Label percentageLabel = new Label();

    private Label errorLabel = new Label();

    private Vocabulary funderVocabulary = null;

    private DeleteCoFunderListener deleteCoFunderListener;

    public CoFunderInfoWidget() {

        coFunderInfoPanel.addStyleName("coFunderInfoPanel");

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

        percentageTextBox.setAlternateSize(AlternateSize.MINI);
        percentageTextBox.addStyleName("inlineBlock");

        percentageLabel.setText(" %");
        percentageLabel.addStyleName("inlineBlock");

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

                if(deleteCoFunderListener !=null)
                    deleteCoFunderListener.deleteCoFunder();
            }
        });

        errorLabel.addStyleName("fontItalic");
        errorLabel.addStyleName("colorRed");

        coFunderInfoPanel.add(coFunderAutoComplete);
        coFunderInfoPanel.add(percentageTextBox);
        coFunderInfoPanel.add(percentageLabel);
        coFunderInfoPanel.add(deleteIcon);
    }

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

    public interface DeleteCoFunderListener {
        public void deleteCoFunder();
    }

    public void setDeleteCoFunderListener(DeleteCoFunderListener deleteCoFunderListener) {
        this.deleteCoFunderListener = deleteCoFunderListener;
    }

    public RequestCoFunder getCoFunder() {

        isValid = true;
        coFunderInfoPanel.remove(errorLabel);

        if(coFunderAutoComplete.getValue().trim().equals("") && percentageTextBox.getValue().trim().equals(""))
            return null;

        if(!isComplete()) {
            isValid = false;
            errorLabel.setText("Both fields are required");
            coFunderInfoPanel.add(errorLabel);
            return new RequestCoFunder();
        }

        if(isComplete()) {

            RequestCoFunder requestCoFunder = new RequestCoFunder();

            if(funderVocabulary!=null && funderVocabulary.getName().equals(coFunderAutoComplete.getValue())) {
                Funder funder = new Funder();
                funder.setName(funderVocabulary.getName());
                funder.setId(funderVocabulary.getId());
                requestCoFunder.setFunder(funder);
            } else {
                Funder funder = new Funder();
                funder.setName(coFunderAutoComplete.getValue());
            }

            String percentage =  percentageTextBox.getValue().trim();
            if(!isPercentage(percentage)) {

                isValid = false;
                errorLabel.setText("Not valid percentage");
                coFunderInfoPanel.add(errorLabel);

            } else {
                requestCoFunder.setPercentage(Float.parseFloat(percentageTextBox.getValue().trim()));

            }

            return requestCoFunder;
        }

        return null;
    }

    public void clear() {

        funderVocabulary = null;
        coFunderAutoComplete.setValue("");
        percentageTextBox.setValue("");
    }

    public void loadCoFunder(RequestCoFunder coFunder) {

        if(coFunder.getFunder()!=null) {
            funderVocabulary = new Vocabulary();
            funderVocabulary.setId(coFunder.getFunder().getId());
            funderVocabulary.setName(coFunder.getFunder().getName());
            coFunderAutoComplete.setValue(coFunder.getFunder().getName());
        }

        percentageTextBox.setValue(coFunder.getPercentage() + "");
    }

    private boolean isComplete() {

        if(!coFunderAutoComplete.getValue().trim().equals("") && !percentageTextBox.getValue().trim().equals(""))
            return true;

        return false;
    }

    private boolean isPercentage(String percentage) {

        try {

            Float percentageValue = Float.parseFloat(percentage);
            if(percentageValue>=0 && percentageValue<=100)
                return true;

        } catch(NumberFormatException nfe) {
            return false;
        }

        return false;
    }

    public boolean isValid() {
        return isValid;
    }
}
