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.SubmitButton;
import com.github.gwtbootstrap.client.ui.TextBox;
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.Document;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.InputElement;
import com.google.gwt.dom.client.NodeList;
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.FAQService;
import eu.dnetlib.espas.gui.client.FAQServiceAsync;
import eu.dnetlib.espas.gui.shared.Question;
import eu.dnetlib.espas.gui.shared.Topic;

import java.util.*;

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

/**
 * Created by stefania on 10/14/15.
 */
public class FAQQuestionsWidget implements AdminWidget {

    private static FAQQuestionsWidget instance = null;

    private FlowPanel manageQuestionsPanel = new FlowPanel();

    private Alert errorAlert = new Alert();
    private Alert successAlert = new Alert();
    private Alert warningAlert = new Alert();

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

    private TextBox search = new TextBox();

    private FAQServiceAsync faqService = GWT.create(FAQService.class);

    private List<Question> news = new ArrayList<Question>();
    private List<Question> activeNews = new ArrayList<Question>();
    private List<Question> inactiveNews = new ArrayList<Question>();

    private List<Question> allMatchingNews = new ArrayList<Question>();
    private List<Question> activeMatchingNews = new ArrayList<Question>();
    private List<Question> inactiveMatchingNews = new ArrayList<Question>();

    private List<Topic> topicsList = new ArrayList<Topic>();
    private ListBox topicsListBox = new ListBox();

    private DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd");
    private TimeZone tz = TimeZone.createTimeZone(0);

    private Map<String, Question> messageMap = new HashMap<String, Question>();

    private FAQQuestionsWidget() {

        manageQuestionsPanel.addStyleName("contentPanel");

        errorAlert.setType(AlertType.ERROR);
        errorAlert.setVisible(false);
        errorAlert.setClose(false);
        manageQuestionsPanel.add(errorAlert);

        successAlert.setType(AlertType.SUCCESS);
        successAlert.setVisible(false);
        successAlert.setClose(false);
        manageQuestionsPanel.add(successAlert);

        warningAlert.setType(AlertType.WARNING);
        warningAlert.setVisible(false);
        warningAlert.setClose(false);
        manageQuestionsPanel.add(warningAlert);

        manageQuestionsPanel.add(pageControlsPanel);
        manageQuestionsPanel.add(newsPanel);

        pageControlsPanel.addStyleName("row");
        pageControlsPanel.addStyleName("page-controls");
    }

    public static final FAQQuestionsWidget getInstance() {

        if(instance==null)
            instance = new FAQQuestionsWidget();

        return instance;
    }

    @Override
    public void clear() {

        errorAlert.setVisible(false);
        successAlert.setVisible(false);
        warningAlert.setVisible(false);

        newsPanel.clear();
        pageControlsPanel.clear();

        search.setValue("");

        topicsList.clear();
        topicsListBox.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\">Questions</div>"));

        faqService.getTopics(new AsyncCallback<List<Topic>>() {

            @Override
            public void onFailure(Throwable caught) {

            }

            @Override
            public void onSuccess(List<Topic> topics) {

                topicsList.addAll(topics);

                topicsListBox.addItem("-- none selected --", "noneSelected");
                for(Topic topic : topicsList)
                    topicsListBox.addItem(topic.getTopicName(), topic.getId()+"");
                topicsListBox.setAlternateSize(AlternateSize.XXLARGE);
                topicsListBox.addChangeHandler(new ChangeHandler() {
                    @Override
                    public void onChange(ChangeEvent event) {

                        if(topicsListBox.getValue().equals("noneSelected"))
                            updateQuestions(true, null, null);
                        else
                            updateQuestions(true, null, topicsListBox.getValue());
                    }
                });

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

        Form searchForm = new Form();
        searchForm.addStyleName("search");

        search.setPlaceholder("Search questions (question, answer)...");
        searchForm.add(search);

        SubmitButton submitSearchButton = new SubmitButton();
        searchForm.add(submitSearchButton);

        searchForm.addSubmitHandler(new Form.SubmitHandler() {
            @Override
            public void onSubmit(Form.SubmitEvent event) {

                errorAlert.setVisible(false);
                successAlert.setVisible(false);
                warningAlert.setVisible(false);

                FAQQuestionsWidget.getInstance().allMatchingNews.clear();
                FAQQuestionsWidget.getInstance().activeMatchingNews.clear();
                FAQQuestionsWidget.getInstance().inactiveMatchingNews.clear();

                if(search.getValue()!=null && !search.getValue().trim().equals("")) {

                    for(Question question : news) {

                        if(question.getQuestion().toLowerCase().contains(search.getValue().trim().toLowerCase())
                                || question.getAnswer().toLowerCase().contains(search.getValue().trim().toLowerCase())) {
                            allMatchingNews.add(question);

                            if(question.isActive()) {
                                activeMatchingNews.add(question);
                            } else {
                                inactiveMatchingNews.add(question);
                            }
                        }
                    }

                } else {
                    allMatchingNews.addAll(news);
                    activeMatchingNews.addAll(activeNews);
                    inactiveMatchingNews.addAll(inactiveNews);
                }

                updateContents(allMatchingNews);
                updateControls();
            }
        });

        Admin.menuBar.add(searchForm);

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

                errorAlert.setVisible(false);
                successAlert.setVisible(false);
                warningAlert.setVisible(false);

                QuestionFormModal questionFormModal = new QuestionFormModal(null, topicsList);
                QuestionFormModal.QuestionFormListener questionFormListener = new QuestionFormModal.QuestionFormListener() {
                    @Override
                    public void onSaved() {
                        if(topicsListBox.getValue().equals("noneSelected"))
                            updateQuestions(false, "Question saved successfully", null);
                        else
                            updateQuestions(false, "Question saved successfully", topicsListBox.getValue());
                    }
                };
                questionFormModal.setQuestionFormListener(questionFormListener);
                questionFormModal.show();
            }
        });

        Admin.menuBar.add(addNewQuestion);
    }

    private void updateQuestions(final boolean clearAlerts, final String successMessage, String topicId) {

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

        faqService.getQuestions(topicId, new AsyncCallback<List<Question>>() {

            @Override
            public void onFailure(Throwable caught) {

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

                successAlert.setVisible(false);
                warningAlert.setVisible(false);

                errorAlert.setText("System error retrieving questions");
                errorAlert.setVisible(true);
            }

            @Override
            public void onSuccess(List<Question> questionsList) {

                messageMap.clear();
                for (Question question : questionsList)
                    messageMap.put(question.getId() + "", question);

                if(clearAlerts) {
                    errorAlert.setVisible(false);
                    successAlert.setVisible(false);
                    warningAlert.setVisible(false);
                }

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

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

                FAQQuestionsWidget.getInstance().news.clear();
                FAQQuestionsWidget.getInstance().news.addAll(questionsList);

                FAQQuestionsWidget.getInstance().allMatchingNews.clear();

                FAQQuestionsWidget.getInstance().activeNews.clear();
                FAQQuestionsWidget.getInstance().inactiveNews.clear();

                FAQQuestionsWidget.getInstance().activeMatchingNews.clear();
                FAQQuestionsWidget.getInstance().inactiveMatchingNews.clear();

                for (Question question : questionsList) {

                    if (question.isActive()) {
                        activeNews.add(question);
                    } else {
                        inactiveNews.add(question);
                    }
                }

                if (search.getValue() != null && !search.getValue().trim().equals("")) {

                    for (Question question : questionsList) {

                        if (question.getQuestion().toLowerCase().contains(search.getValue().trim().toLowerCase())
                                || question.getAnswer().toLowerCase().contains(search.getValue().trim().toLowerCase())) {
                            allMatchingNews.add(question);

                            if (question.isActive()) {
                                activeMatchingNews.add(question);
                            } else {
                                inactiveMatchingNews.add(question);
                            }
                        }
                    }

                } else {
                    allMatchingNews.addAll(news);
                    activeMatchingNews.addAll(activeNews);
                    inactiveMatchingNews.addAll(inactiveNews);
                }

                updateControls();
                updateContents(allMatchingNews);
            }
        });
    }

    @Override
    public void setToken(String token) {

    }

    @Override
    public void afterAdditionToRootPanel() {

    }

    public void updateControls() {

        pageControlsPanel.clear();

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

        pageControlsPanel.add(firstRowFilters);

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

        firstRowFilters.add(topicsSelection);

        Label topicFilterLabel = new Label("Filter by topic:");
        topicFilterLabel.addStyleName("filterLabel");
        topicsSelection.add(topicFilterLabel);

        topicsSelection.add(topicsListBox);

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

        pageControlsPanel.add(secondRowFilters);

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

        secondRowFilters.add(links);

        Label filterLabel = new Label("Filter questions:");
        filterLabel.addStyleName("filterLabel");
        links.add(filterLabel);

        final Anchor allQuestionsLink = new Anchor("All Questions (" + allMatchingNews.size() + ")");
        allQuestionsLink.addStyleName("active");
        links.add(allQuestionsLink);

        final Anchor activeQuestionsLink = new Anchor("Active (" + activeMatchingNews.size() + ")");
        links.add(activeQuestionsLink);

        final Anchor inactiveQuestionsLink = new Anchor("Inactive (" + inactiveMatchingNews.size() + ")");
        links.add(inactiveQuestionsLink);

        allQuestionsLink.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {

                allQuestionsLink.addStyleName("active");
                activeQuestionsLink.removeStyleName("active");
                inactiveQuestionsLink.removeStyleName("active");
                updateContents(allMatchingNews);
            }
        });

        activeQuestionsLink.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {

                allQuestionsLink.removeStyleName("active");
                activeQuestionsLink.addStyleName("active");
                inactiveQuestionsLink.removeStyleName("active");
                updateContents(activeMatchingNews);
            }
        });

        inactiveQuestionsLink.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {

                allQuestionsLink.removeStyleName("active");
                activeQuestionsLink.removeStyleName("active");
                inactiveQuestionsLink.addStyleName("active");
                updateContents(inactiveMatchingNews);
            }
        });


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

        secondRowFilters.add(actions);

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

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

                errorAlert.setVisible(false);
                successAlert.setVisible(false);
                warningAlert.setVisible(false);

                List<String> questionIds = getCheckedQuestions();

                if (!questionIds.isEmpty()) {
                    activateQuestions(questionIds);
                } else {
                    warningAlert.setText("You haven't selected any questions");
                    warningAlert.setVisible(true);
                }
            }
        });
        bulkActions.add(activateButton);

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

                errorAlert.setVisible(false);
                successAlert.setVisible(false);
                warningAlert.setVisible(false);

                List<String> questionIds = getCheckedQuestions();

                if (!questionIds.isEmpty()) {
                    deactivateQuestions(questionIds);
                } else {
                    warningAlert.setText("You haven't selected any questions");
                    warningAlert.setVisible(true);
                }
            }
        });
        bulkActions.add(deactivateButton);

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

                errorAlert.setVisible(false);
                successAlert.setVisible(false);
                warningAlert.setVisible(false);

                List<String> questionIds = getCheckedQuestions();

                if (!questionIds.isEmpty()) {
                    deleteQuestions(questionIds);
                } else {
                    warningAlert.setText("You haven't selected any questions");
                    warningAlert.setVisible(true);
                }
            }
        });
        bulkActions.add(deleteButton);

        actions.add(bulkActions);
    }

    public void updateContents(List<Question> questions) {

        newsPanel.clear();

        String contents = "<div class=\"row users-list\">";
        contents += "<div class=\"col-md-12\">";

        contents += "<div class=\"row headers\">" +
                "<div class=\"col-sm-1 header select-users\">" +
                "<input id=\"allQuestionsCheckbox\" type=\"checkbox\">" +
                "</div>" +
                "<div class=\"col-sm-1 header hidden-xs\">" +
                "<label><a href=\"#\">Date</a></label>" +
                "</div>" +
                "<div class=\"col-sm-2 header hidden-xs\">" +
                "<label><a href=\"#\">Question</a></label>" +
                "</div>" +
                "<div class=\"col-sm-3 header hidden-xs\">" +
                "<label><a href=\"#\">Answer</a></label>" +
                "</div>" +
                "<div class=\"col-sm-1 header hidden-xs\">" +
                "<label><a href=\"#\">Topic</a></label>" +
                "</div>" +
                "<div class=\"col-sm-1 header hidden-xs\">" +
                "<label><a href=\"#\">Weight</a></label>" +
                "</div>" +
                "<div class=\"col-sm-1 header hidden-xs\">" +
                "<label><a href=\"#\">Hit Count</a></label>" +
                "</div>" +
                "<div class=\"col-sm-1 header hidden-xs\">" +
                "<label><a href=\"#\">Active</a></label>" +
                "</div>" +
                "<div class=\"col-sm-1 header hidden-xs\">" +
                "<label><a href=\"#\">Actions</a></label>" +
                "</div>" +
                "</div>";

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

            contents += "<div class=\"row user\">" +
                    "<div class=\"col-md-12\"><div class=\"alert alert-warning\">No questions found</div></div>" +
                    "</div>";

        } else {

            for (Question question : questions) {

                contents += "<div class=\"row user\">" +
                        "<div class=\"col-sm-1 avatar\"><input id=\"" + question.getId() + "#checkBox\" class=\"checkBox\" type=\"checkbox\" name=\"select-user\"></div>" +
                        "<div class=\"col-sm-1\"><div class=\"date\" href=\"#\">" + dtf.format(question.getDate(), tz) + "</div></div>" +
                        "<div class=\"col-sm-2\"><div class=\"question\" href=\"#\">" + question.getQuestion() + "</div></div>" +
                        "<div class=\"col-sm-3\"><div class=\"answer\" href=\"#\">" + question.getAnswer() + "</div></div>" +
                        "<div class=\"col-sm-1\"><div class=\"topic\" href=\"#\">" + question.getTopic().getTopicName() + "</div></div>" +
                        "<div class=\"col-sm-1\"><div class=\"weight\" href=\"#\">" + Math.round(question.getWeight()*100) / 100.0 + "</div></div>" +
                        "<div class=\"col-sm-1\"><div class=\"hitCount\" href=\"#\">" + question.getHitCount() + "</div></div>";

                if (question.isActive()) {
                    contents += "<div class=\"col-sm-1\"><div class=\"activated\" href=\"#\"><input id=\"" + question.getId() +
                            "#deactivate\" class=\"deactivate\" type=\"image\" src=\"imgs/check-icon.png\" width=20 height=20 " +
                            "title=\"Deactivate\"></div></div>";
                } else {
                    contents += "<div class=\"col-sm-1\"><div class=\"activated\" href=\"#\"><input id=\"" + question.getId() +
                            "#activate\" class=\"activate\" type=\"image\" src=\"imgs/x-icon.png\" width=20 height=20 " +
                            "title=\"Activate\"></div></div>";
                }


                contents += "<div class=\"col-sm-1\"><div class=\"actions\" href=\"#\"><input id=\"" + question.getId() + "#edit\" type=\"image\" title=\"Edit\" src=\"imgs/icn_edit.png\" class=\"edit\">" +
                        "<input id=\"" + question.getId() + "#delete\" type=\"image\" title=\"Delete\" src=\"imgs/icn_trash.png\" class=\"delete\"></div></div>" +
                        "</div>";

            }
        }

        contents += "</div>";
        contents += "</div>";

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

        newsPanel.add(questionsList);

        addWidgetHandlers();
    }

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

    public void addWidgetHandlers() {

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

            public boolean f(Event e) {

                InputElement allUsers = (InputElement) Document.get().getElementById("allQuestionsCheckbox");

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

                if(allUsers.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) {

                errorAlert.setVisible(false);
                successAlert.setVisible(false);
                warningAlert.setVisible(false);

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

                QuestionFormModal questionFormModal = new QuestionFormModal(messageMap.get(questionId), topicsList);
                QuestionFormModal.QuestionFormListener questionFormListener = new QuestionFormModal.QuestionFormListener() {
                    @Override
                    public void onSaved() {
                        if(topicsListBox.getValue().equals("noneSelected"))
                            updateQuestions(false, "Question updated successfully", null);
                        else
                            updateQuestions(false, "Question updated successfully", topicsListBox.getValue());
                    }
                };
                questionFormModal.setQuestionFormListener(questionFormListener);
                questionFormModal.show();

                return true;
            }
        });

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

            public boolean f(Event e) {

                errorAlert.setVisible(false);
                successAlert.setVisible(false);
                warningAlert.setVisible(false);

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

                deleteQuestions(questionIds);

                return true;
            }
        });

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

            public boolean f(Event e) {

                errorAlert.setVisible(false);
                successAlert.setVisible(false);
                warningAlert.setVisible(false);

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

                activateQuestions(questionIds);

                return true;
            }
        });

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

            public boolean f(Event e) {

                errorAlert.setVisible(false);
                successAlert.setVisible(false);
                warningAlert.setVisible(false);

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

                deactivateQuestions(questionIds);

                return true;
            }
        });
    }

    private List<String> getCheckedQuestions() {

        List<String> questionIds = 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("#");
                questionIds.add(idParts[0]);
            }
        }

        return questionIds;
    }

    private void deleteQuestions(final List<String> questionIds) {

        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 question(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>");
                manageQuestionsPanel.addStyleName("loading-big");
                manageQuestionsPanel.add(loadingWheel);

                faqService.deleteQuestions(questionIds, new AsyncCallback<Void>() {

                    @Override
                    public void onFailure(Throwable caught) {

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

                        errorAlert.setText("Failed to delete the selected question(s)");
                        errorAlert.setVisible(true);
                    }

                    @Override
                    public void onSuccess(Void result) {

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

                        updateQuestions(false, "Question(s) deleted successfully", topicsListBox.getValue());
                    }
                });
            }
        });
        actionButtons.add(yes);

        deleteConfirmationPopup.show();
    }

    private void activateQuestions(List<String> questionIds) {

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

        faqService.setQuestionsActive(questionIds, new AsyncCallback<Void>() {

            @Override
            public void onFailure(Throwable caught) {

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

                errorAlert.setText("Failed to activate the selected question(s)");
                errorAlert.setVisible(true);
            }

            @Override
            public void onSuccess(Void result) {

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

                updateQuestions(false, "Question(s) activated successfully", topicsListBox.getValue());
            }
        });
    }

    private void deactivateQuestions(List<String> questionIds) {

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

        faqService.setQuestionsInactive(questionIds, new AsyncCallback<Void>() {

            @Override
            public void onFailure(Throwable caught) {

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

                errorAlert.setText("Failed to deactivate the selected question(s)");
                errorAlert.setVisible(true);
            }

            @Override
            public void onSuccess(Void result) {

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

                updateQuestions(false, "Question(s) deactivated successfully", topicsListBox.getValue());
            }
        });
    }

}
