package eu.dnetlib.client.adminpanel;

import com.github.gwtbootstrap.client.ui.*;
import com.github.gwtbootstrap.client.ui.Button;
import com.github.gwtbootstrap.client.ui.ListBox;
import com.github.gwtbootstrap.client.ui.constants.AlertType;
import com.github.gwtbootstrap.client.ui.constants.AlternateSize;
import com.github.gwtbootstrap.client.ui.constants.BackdropType;
import com.github.gwtbootstrap.client.ui.constants.ButtonType;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.*;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.TimeZone;
import com.google.gwt.query.client.Function;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.*;
import com.google.gwt.user.client.ui.Label;
import eu.dnetlib.client.Admin;
import eu.dnetlib.client.AdminWidget;
import eu.dnetlib.espas.gui.client.user.DataProviderAccessService;
import eu.dnetlib.espas.gui.client.user.DataProviderAccessServiceAsync;
import eu.dnetlib.espas.gui.shared.DataProvider;
import eu.dnetlib.shared.HarvestScheduleInfo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.google.gwt.query.client.GQuery.$;

public class HarvestDataProviderWidget implements AdminWidget {
	
	private static HarvestDataProviderWidget instance = null;

    private FlowPanel manageHarvestsPanel = new FlowPanel();

    private FlowPanel manualHarvestPanel = new FlowPanel();
    private FlowPanel manualHarvestFormPanel = new FlowPanel();

    private FlowPanel scheduleHarvestPanel = new FlowPanel();
    private Alert scheduleHarvestErrorAlert = new Alert();
    private Alert scheduleHarvestSuccessAlert = new Alert();
    private Alert scheduleHarvestWarningAlert = new Alert();

    private FlowPanel pageControlsPanel = new FlowPanel();
    private FlowPanel schedulesPanel = new FlowPanel();

    private ListBox dataProvidersListBox = new ListBox();

    private List<DataProvider> dataProviderList = new ArrayList<DataProvider>();

    private Map<String, HarvestScheduleInfo> harvestScheduleInfoMap = new HashMap<String, HarvestScheduleInfo>();

    private DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZ");
    private TimeZone tz = TimeZone.createTimeZone(0);
	
	private DataProviderAccessServiceAsync dataProviderAccessService = GWT.create(DataProviderAccessService.class);
    private HarvestInfoServiceAsync harvestInfoService = GWT.create(HarvestInfoService.class);
	
	private HarvestDataProviderWidget() {

        manageHarvestsPanel.addStyleName("contentPanel");

        manageHarvestsPanel.add(scheduleHarvestPanel);
        manageHarvestsPanel.add(manualHarvestPanel);

        HTML manualHarvestHeader = new HTML("<h3>Manual Harvest</h3>");
        manualHarvestPanel.add(manualHarvestHeader);
        manualHarvestPanel.add(manualHarvestFormPanel);

        HTML scheduledHarvestHeader = new HTML("<h3>Scheduled Harvests</h3>");
        scheduleHarvestPanel.add(scheduledHarvestHeader);

        manualHarvestPanel.addStyleName("manualHarvest");

        scheduleHarvestPanel.addStyleName("scheduleHarvest");

        scheduleHarvestErrorAlert.addStyleName("scheduleHarvestAlerts");
        scheduleHarvestErrorAlert.setType(AlertType.ERROR);
        scheduleHarvestErrorAlert.setVisible(false);
        scheduleHarvestErrorAlert.setClose(false);
        scheduleHarvestPanel.add(scheduleHarvestErrorAlert);

        scheduleHarvestSuccessAlert.addStyleName("scheduleHarvestAlerts");
        scheduleHarvestSuccessAlert.setType(AlertType.SUCCESS);
        scheduleHarvestSuccessAlert.setVisible(false);
        scheduleHarvestSuccessAlert.setClose(false);
        scheduleHarvestPanel.add(scheduleHarvestSuccessAlert);

        scheduleHarvestWarningAlert.addStyleName("scheduleHarvestAlerts");
        scheduleHarvestWarningAlert.setType(AlertType.WARNING);
        scheduleHarvestWarningAlert.setVisible(false);
        scheduleHarvestWarningAlert.setClose(false);
        scheduleHarvestPanel.add(scheduleHarvestWarningAlert);

        scheduleHarvestPanel.add(pageControlsPanel);
        scheduleHarvestPanel.add(schedulesPanel);

        pageControlsPanel.addStyleName("row");
        pageControlsPanel.addStyleName("page-controls");
    }
	
	public static final HarvestDataProviderWidget getInstance() {
		
		if(instance==null)
			instance = new HarvestDataProviderWidget();
		
		return instance;
	}

    @Override
    public void clear() {

        scheduleHarvestErrorAlert.setVisible(false);
        scheduleHarvestSuccessAlert.setVisible(false);
        scheduleHarvestWarningAlert.setVisible(false);

        manualHarvestFormPanel.clear();

        schedulesPanel.clear();
        pageControlsPanel.clear();

        dataProviderList.clear();
        dataProvidersListBox.clear();
    }

    @Override
    public void reload() {

        Admin.menuBar.clear();

        Admin.menuBar.add(new HTML("<div class=\"sidebar-toggler visible-xs\"><i class=\"ion-navicon\"></i></div>"));
        Admin.menuBar.add(new HTML("<div class=\"page-title\" id=\"pageTitle\">Harvest Data Providers</div>"));

        Button addNewHarvestSchedule = new Button();
        addNewHarvestSchedule.setText("New Harvest Schedule");
        addNewHarvestSchedule.setType(ButtonType.SUCCESS);
        addNewHarvestSchedule.addStyleName("pull-right");
        addNewHarvestSchedule.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {

                scheduleHarvestErrorAlert.setVisible(false);
                scheduleHarvestSuccessAlert.setVisible(false);
                scheduleHarvestWarningAlert.setVisible(false);

                ScheduledHarvestFormModal scheduledHarvestFormModal = new ScheduledHarvestFormModal(null, dataProviderList);
                ScheduledHarvestFormModal.ScheduledHarvestFormListener scheduledHarvestFormListener =
                        new ScheduledHarvestFormModal.ScheduledHarvestFormListener() {
                    @Override
                    public void onSaved() {
                        if(dataProvidersListBox.getValue().equals("noneSelected"))
                            updateHarvestSchedules(false, "Harvest schedule saved successfully", null);
                        else
                            updateHarvestSchedules(false, "Harvest schedule saved successfully", "http://resources.espas-fp7.eu/provider/" + dataProvidersListBox.getValue());
                    }
                };
                scheduledHarvestFormModal.setScheduledHarvestFormListener(scheduledHarvestFormListener);
                scheduledHarvestFormModal.show();
            }
        });

        Admin.menuBar.add(addNewHarvestSchedule);

        dataProviderAccessService.getDataProviders(new AsyncCallback<List<DataProvider>>() {

            @Override
            public void onFailure(Throwable arg0) {

            }

            @Override
            public void onSuccess(List<DataProvider> dataProviders) {

                dataProviderList.addAll(dataProviders);

                ManualHarvestForm manualHarvestForm = new ManualHarvestForm(dataProviders);
                manualHarvestFormPanel.add(manualHarvestForm.asWidget());

                updateHarvestSchedules(true, null, null);
                updateControls();
            }
        });
    }

    private void updateHarvestSchedules(final boolean clearAlerts, final String successMessage, String providerId) {

        final HTML loadingWheel = new HTML("<div class=\"loader-big\"></div><div class=\"whiteFilm\"></div>");
        scheduleHarvestPanel.addStyleName("loading-big");
        scheduleHarvestPanel.add(loadingWheel);

        harvestInfoService.getHarvestSchedules(providerId, new AsyncCallback<List<HarvestScheduleInfo>>() {

            @Override
            public void onFailure(Throwable caught) {

                scheduleHarvestPanel.removeStyleName("loading-big");
                scheduleHarvestPanel.remove(loadingWheel);

                scheduleHarvestSuccessAlert.setVisible(false);
                scheduleHarvestWarningAlert.setVisible(false);

                scheduleHarvestErrorAlert.setText("System error retrieving harvest schedules");
                scheduleHarvestErrorAlert.setVisible(true);
            }

            @Override
            public void onSuccess(List<HarvestScheduleInfo> harvestScheduleInfoList) {

                harvestScheduleInfoMap.clear();
                for (HarvestScheduleInfo harvestScheduleInfo : harvestScheduleInfoList)
                    harvestScheduleInfoMap.put(harvestScheduleInfo.getScheduleId(), harvestScheduleInfo);

                if(clearAlerts) {
                    scheduleHarvestErrorAlert.setVisible(false);
                    scheduleHarvestSuccessAlert.setVisible(false);
                    scheduleHarvestWarningAlert.setVisible(false);
                }

                if(successMessage!=null) {
                    scheduleHarvestSuccessAlert.setText(successMessage);
                    scheduleHarvestSuccessAlert.setVisible(true);
                }

                scheduleHarvestPanel.removeStyleName("loading-big");
                scheduleHarvestPanel.remove(loadingWheel);

                updateContents(harvestScheduleInfoList);
            }
        });
    }

    @Override
    public void setToken(String token) {

    }

    @Override
    public void afterAdditionToRootPanel() {

    }

    public void updateControls() {

        pageControlsPanel.clear();

        FlowPanel filters = new FlowPanel();
        filters.addStyleName("col-md-12");
        filters.addStyleName("filters");

        pageControlsPanel.add(filters);

        FlowPanel links = new FlowPanel();
        links.addStyleName("links");

        filters.add(links);

        Label filterLabel = new Label("Filter by data provider:");
        filterLabel.addStyleName("filterLabel");
        links.add(filterLabel);

        dataProvidersListBox.addItem("-- none selected --", "noneSelected");
        for(DataProvider dataProvider : dataProviderList)
            dataProvidersListBox.addItem(dataProvider.getName(), dataProvider.getNamespace());
        dataProvidersListBox.setAlternateSize(AlternateSize.XLARGE);
        dataProvidersListBox.addChangeHandler(new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {

                if(dataProvidersListBox.getValue().equals("noneSelected"))
                    updateHarvestSchedules(true, null, null);
                else
                    updateHarvestSchedules(true, null, "http://resources.espas-fp7.eu/provider/" + dataProvidersListBox.getValue());
            }
        });
        links.add(dataProvidersListBox);

        FlowPanel actions = new FlowPanel();
        actions.addStyleName("show-options");

        filters.add(actions);

        DropdownButton bulkActions = new DropdownButton();
        bulkActions.setText("Bulk Actions");
        bulkActions.setType(ButtonType.DEFAULT);

        NavLink resumeButton = new NavLink("Resume");
        resumeButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {

                scheduleHarvestErrorAlert.setVisible(false);
                scheduleHarvestSuccessAlert.setVisible(false);
                scheduleHarvestWarningAlert.setVisible(false);

                List<String> scheduleIds = getCheckedSchedules();

                if (!scheduleIds.isEmpty()) {
                    resume(scheduleIds);
                } else {
                    scheduleHarvestWarningAlert.setText("You haven't selected any harvest schedules");
                    scheduleHarvestWarningAlert.setVisible(true);
                }
            }
        });
        bulkActions.add(resumeButton);

        NavLink pauseButton = new NavLink("Pause");
        pauseButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {

                scheduleHarvestErrorAlert.setVisible(false);
                scheduleHarvestSuccessAlert.setVisible(false);
                scheduleHarvestWarningAlert.setVisible(false);

                List<String> scheduleIds = getCheckedSchedules();

                if (!scheduleIds.isEmpty()) {
                    pause(scheduleIds);
                } else {
                    scheduleHarvestWarningAlert.setText("You haven't selected any harvest schedules");
                    scheduleHarvestWarningAlert.setVisible(true);
                }
            }
        });
        bulkActions.add(pauseButton);

        NavLink deleteButton = new NavLink("Delete");
        deleteButton.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {

                scheduleHarvestErrorAlert.setVisible(false);
                scheduleHarvestSuccessAlert.setVisible(false);
                scheduleHarvestWarningAlert.setVisible(false);

                List<String> scheduleIds = getCheckedSchedules();

                if (!scheduleIds.isEmpty()) {
                    delete(scheduleIds);
                } else {
                    scheduleHarvestWarningAlert.setText("You haven't selected any harvest schedules");
                    scheduleHarvestWarningAlert.setVisible(true);
                }
            }
        });
        bulkActions.add(deleteButton);

        actions.add(bulkActions);
    }
	
	public void updateContents(List<HarvestScheduleInfo> harvestScheduleInfoList) {

        schedulesPanel.clear();

        String contents = "<table class=\"dataTable\">";
        contents += "<thead><tr role=\"row\">" +
                "<th colspan=\"1\" rowspan=\"1\" tabindex=\"0\" style=\"width: 4%;\"><input type=\"checkbox\" id=\"allSchedulesCheckbox\"></th>" +
                "<th colspan=\"1\" rowspan=\"1\" tabindex=\"0\" style=\"width: 8%;\">Namespace</th>" +
                "<th colspan=\"1\" rowspan=\"1\" tabindex=\"0\" style=\"width: 20%;\">Initial Date</th>" +
                "<th colspan=\"1\" rowspan=\"1\" tabindex=\"0\" style=\"width: 33%;\">Type(s)</th>" +
                "<th colspan=\"1\" rowspan=\"1\" tabindex=\"0\" style=\"width: 20%;\">Cron Expression</th>" +
                "<th colspan=\"1\" rowspan=\"1\" tabindex=\"0\" style=\"width: 7%;\">Running</th>" +
                "<th colspan=\"1\" rowspan=\"1\" tabindex=\"0\" style=\"width: 8%;\">Actions</th>" +
                "</tr></thead>";

        contents += "<tbody>";

        if(harvestScheduleInfoList.size()==0) {

            contents += "<tr class=\"even\"><td colspan=\"7\"><div class=\"alert alert-warning\">No harvest schedules found</div></td></tr>";

        } else {

            for(int i=0; i<harvestScheduleInfoList.size(); i++) {

                if(((i+1)%2)==1)
                    contents += "<tr class=\"odd\">";
                else
                    contents += "<tr class=\"even\">";

                contents += "<td class=\"selecting\"><input id=\"" + harvestScheduleInfoList.get(i).getScheduleId() +
                        "#checkbox\" type=\"checkbox\" class=\"checkBox\"></td>" +
                        "<td>" + harvestScheduleInfoList.get(i).getDataProviderId().split("http://resources.espas-fp7.eu/provider/")[1] + "</td>" +
                        "<td>" + dtf.format(harvestScheduleInfoList.get(i).getInitialModificationDate(), tz) + "</td>";

                contents += "<td>";
                for(int j=0; j<harvestScheduleInfoList.get(i).getTypes().size(); j++) {
                    if(j!=0)
                        contents += ", ";
                    contents += harvestScheduleInfoList.get(i).getTypes().get(j);
                }
                contents += "</td>";

                contents += "<td>" + harvestScheduleInfoList.get(i).getCronExpression() + "</td>";
                if(harvestScheduleInfoList.get(i).getScheduleStatus().equals(HarvestScheduleInfo.ScheduleStatus.RUNNING)) {
                    contents += "<td><input id=\"" + harvestScheduleInfoList.get(i).getScheduleId() + "#pause\" class=\"pause\" " +
                            "type=\"image\" src=\"imgs/check-icon.png\" width=20 height=20 title=\"Pause\"></td>";
                } else {
                    contents += "<td><input id=\"" + harvestScheduleInfoList.get(i).getScheduleId() + "#resume\" class=\"resume\" " +
                            "type=\"image\" src=\"imgs/x-icon.png\" width=20 height=20 title=\"Resume\"></td>";
                }

                contents += "<td><input id=\"" + harvestScheduleInfoList.get(i).getScheduleId() + "#edit\" type=\"image\" title=\"Edit\" src=\"imgs/icn_edit.png\" class=\"edit\">" +
                        "<input id=\"" + harvestScheduleInfoList.get(i).getScheduleId() + "#delete\" type=\"image\" title=\"Delete\" src=\"imgs/icn_trash.png\" class=\"delete\"></td>";

                contents += "</tr>";
            }
        }

        contents += "</tbody>";
        contents += "</table>";

        HTML usersList = new HTML();
        usersList.setHTML(contents);

        schedulesPanel.add(usersList);

        addWidgetHandlers();
	}

	@Override
	public Widget asWidget() {
		return manageHarvestsPanel;
	}
	
	public void addWidgetHandlers() {

        $("#allSchedulesCheckbox").click(new Function() {

            public boolean f(Event e) {

                InputElement allHistories = (InputElement) Document.get().getElementById("allSchedulesCheckbox");

                NodeList<Element> checkBoxes = $(".checkBox").get();

                if (allHistories.isChecked()) {
                    for (int i = 0; i < checkBoxes.getLength(); i++) {
                        InputElement checkBox = (InputElement) checkBoxes.getItem(i);
                        checkBox.setChecked(true);
                    }
                } else {
                    for (int i = 0; i < checkBoxes.getLength(); i++) {
                        InputElement checkBox = (InputElement) checkBoxes.getItem(i);
                        checkBox.setChecked(false);
                    }
                }

                return true;
            }
        });

        $(".edit").click(new Function() {

            public boolean f(Event e) {

                String[] idParts = $(e).get(0).getId().split("#");
                String scheduleId = idParts[0];

                scheduleHarvestErrorAlert.setVisible(false);
                scheduleHarvestSuccessAlert.setVisible(false);
                scheduleHarvestWarningAlert.setVisible(false);

                ScheduledHarvestFormModal scheduledHarvestFormModal = new ScheduledHarvestFormModal(harvestScheduleInfoMap.get(scheduleId), dataProviderList);
                ScheduledHarvestFormModal.ScheduledHarvestFormListener scheduledHarvestFormListener =
                        new ScheduledHarvestFormModal.ScheduledHarvestFormListener() {
                            @Override
                            public void onSaved() {
                                if(dataProvidersListBox.getValue().equals("noneSelected"))
                                    updateHarvestSchedules(false, "Harvest schedule updated successfully", null);
                                else
                                    updateHarvestSchedules(false, "Harvest schedule updated successfully", "http://resources.espas-fp7.eu/provider/" + dataProvidersListBox.getValue());
                            }
                        };
                scheduledHarvestFormModal.setScheduledHarvestFormListener(scheduledHarvestFormListener);
                scheduledHarvestFormModal.show();

                return true;
            }
        });

        $(".resume").click(new Function() {

            public boolean f(Event e) {

                scheduleHarvestErrorAlert.setVisible(false);
                scheduleHarvestSuccessAlert.setVisible(false);
                scheduleHarvestWarningAlert.setVisible(false);

                String[] idParts = $(e).get(0).getId().split("#");
                List<String> scheduleIds = new ArrayList<String>();
                scheduleIds.add(idParts[0]);

                resume(scheduleIds);

                return true;
            }
        });

        $(".pause").click(new Function() {

            public boolean f(Event e) {

                scheduleHarvestErrorAlert.setVisible(false);
                scheduleHarvestSuccessAlert.setVisible(false);
                scheduleHarvestWarningAlert.setVisible(false);

                String[] idParts = $(e).get(0).getId().split("#");
                List<String> scheduleIds = new ArrayList<String>();
                scheduleIds.add(idParts[0]);

                pause(scheduleIds);

                return true;
            }
        });

        $(".delete").click(new Function() {

            public boolean f(Event e) {

                scheduleHarvestErrorAlert.setVisible(false);
                scheduleHarvestSuccessAlert.setVisible(false);
                scheduleHarvestWarningAlert.setVisible(false);

                String[] idParts = $(e).get(0).getId().split("#");
                List<String> scheduleIds = new ArrayList<String>();
                scheduleIds.add(idParts[0]);

                delete(scheduleIds);

                return true;
            }
        });
    }

    private List<String> getCheckedSchedules() {

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

        NodeList<Element> checkBoxes = $(".checkBox").get();
        for(int i=0; i<checkBoxes.getLength(); i++) {
            InputElement checkBox = (InputElement) checkBoxes.getItem(i);
            if(checkBox.isChecked()) {
                String[] idParts = checkBox.getId().split("#");
                scheduleIds.add(idParts[0]);
            }
        }

        return scheduleIds;
    }

    private void resume(List<String> scheduleIds) {

        final HTML loadingWheel = new HTML("<div class=\"loader-big\"></div><div class=\"whiteFilm\"></div>");
        scheduleHarvestPanel.addStyleName("loading-big");
        scheduleHarvestPanel.add(loadingWheel);

        harvestInfoService.resumeHarvestSchedules(scheduleIds, new AsyncCallback<Void>() {

            @Override
            public void onFailure(Throwable throwable) {

                scheduleHarvestPanel.removeStyleName("loading-big");
                scheduleHarvestPanel.remove(loadingWheel);

                scheduleHarvestErrorAlert.setText("System error resuming the selected harvest schedule(s)");
                scheduleHarvestErrorAlert.setVisible(true);
            }

            @Override
            public void onSuccess(Void aVoid) {

                scheduleHarvestPanel.removeStyleName("loading-big");
                scheduleHarvestPanel.remove(loadingWheel);

                if (dataProvidersListBox.getValue().equals("noneSelected"))
                    updateHarvestSchedules(false, "Harvest schedule(s) resumed successfully", null);
                else
                    updateHarvestSchedules(false, "Harvest schedule(s) resumed successfully", "http://resources.espas-fp7.eu/provider/" + dataProvidersListBox.getValue());
            }
        });
    }

    private void pause(List<String> scheduleIds) {

        final HTML loadingWheel = new HTML("<div class=\"loader-big\"></div><div class=\"whiteFilm\"></div>");
        scheduleHarvestPanel.addStyleName("loading-big");
        scheduleHarvestPanel.add(loadingWheel);

        harvestInfoService.pauseHarvestSchedules(scheduleIds, new AsyncCallback<Void>() {

            @Override
            public void onFailure(Throwable throwable) {

                scheduleHarvestPanel.removeStyleName("loading-big");
                scheduleHarvestPanel.remove(loadingWheel);

                scheduleHarvestErrorAlert.setText("System error pausing the selected harvest schedule(s)");
                scheduleHarvestErrorAlert.setVisible(true);
            }

            @Override
            public void onSuccess(Void aVoid) {

                scheduleHarvestPanel.removeStyleName("loading-big");
                scheduleHarvestPanel.remove(loadingWheel);

                if (dataProvidersListBox.getValue().equals("noneSelected"))
                    updateHarvestSchedules(false, "Harvest schedule(s) paused successfully", null);
                else
                    updateHarvestSchedules(false, "Harvest schedule(s) paused successfully", "http://resources.espas-fp7.eu/provider/" + dataProvidersListBox.getValue());
            }
        });
    }

    private void delete(final List<String> scheduleIds) {

        final Modal deleteConfirmationPopup = new Modal();

        deleteConfirmationPopup.addStyleName("confirmationModal");
        deleteConfirmationPopup.setAnimation(true);
        deleteConfirmationPopup.setBackdrop(BackdropType.STATIC);

        deleteConfirmationPopup.setTitle("Delete Confirmation");

        HTML message = new HTML("Are you sure you want to delete the selected harvest schedule(s)?");
        deleteConfirmationPopup.add(message);

        FlowPanel actionButtons = new FlowPanel();
        actionButtons.addStyleName("confirmationModalButtons");

        ModalFooter modalFooter = new ModalFooter();
        modalFooter.add(actionButtons);
        deleteConfirmationPopup.add(modalFooter);

        Button no = new Button("Cancel");
        no.setType(ButtonType.DEFAULT);
        no.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                deleteConfirmationPopup.hide();
                deleteConfirmationPopup.removeFromParent();
            }
        });
        actionButtons.add(no);

        Button yes = new Button("Yes, delete them");
        yes.setType(ButtonType.DANGER);
        yes.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {

                deleteConfirmationPopup.hide();
                deleteConfirmationPopup.removeFromParent();

                final HTML loadingWheel = new HTML("<div class=\"loader-big\"></div><div class=\"whiteFilm\"></div>");
                scheduleHarvestPanel.addStyleName("loading-big");
                scheduleHarvestPanel.add(loadingWheel);

                harvestInfoService.cancelHarvestSchedules(scheduleIds, new AsyncCallback<Void>() {

                    @Override
                    public void onFailure(Throwable throwable) {

                        scheduleHarvestPanel.removeStyleName("loading-big");
                        scheduleHarvestPanel.remove(loadingWheel);

                        scheduleHarvestErrorAlert.setText("Failed to delete the selected harvest schedule(s)");
                        scheduleHarvestErrorAlert.setVisible(true);
                    }

                    @Override
                    public void onSuccess(Void aVoid) {

                        scheduleHarvestPanel.removeStyleName("loading-big");
                        scheduleHarvestPanel.remove(loadingWheel);

                        if(dataProvidersListBox.getValue().equals("noneSelected"))
                            updateHarvestSchedules(false, "Harvest Schedule(s) deleted successfully", null);
                        else
                            updateHarvestSchedules(false, "Harvest Schedule(s) deleted successfully", "http://resources.espas-fp7.eu/provider/" + dataProvidersListBox.getValue());

                        AdminPanelController.getInstance().updateNoOfActions();
                    }
                });
            }
        });
        actionButtons.add(yes);

        deleteConfirmationPopup.show();
    }
}
