package eu.dnetlib.client;

import com.github.gwtbootstrap.client.ui.*;
import com.github.gwtbootstrap.client.ui.constants.BackdropType;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;

/**
 * Created by stefania on 3/6/15.
 */
public class MainMenu implements IsWidget {

    private final NavPills mainMenu = new NavPills();

    private NavLink home = new NavLink();

    private Dropdown request = new Dropdown();
    private NavLink newRequest = new NavLink();
    private NavLink existingRequests = new NavLink();
    private NavLink bulkImport = new NavLink();
    private NavLink newBudgetRequest = new NavLink();
    private NavLink existingBudgetRequests = new NavLink();

    private Dropdown monitor = new Dropdown();
    private NavLink monitorFundingRequests = new NavLink();
    private NavLink monitorAlternativeFundingBids = new NavLink();
    private NavLink monitorBudgetRequests = new NavLink();
    private NavLink monitorUsers = new NavLink();
    private NavLink monitorUserRoles = new NavLink();
    private NavLink monitorHelpTexts = new NavLink();

    private Dropdown accountingMonitor = new Dropdown();
    private NavLink accountingMonitorFundingRequests = new NavLink();
    private NavLink accountingMonitorBudgets = new NavLink();

    private NavLink statistics = new NavLink();

    private Dropdown support = new Dropdown();
    private NavLink faq = new NavLink();
    private NavLink askAQuestion = new NavLink();
    private NavLink eligibleProjects = new NavLink();

    private NavLink contactUs = new NavLink();

    public MainMenu() {

        home.setText("HOME");
        home.setHref("#home");
        home.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("home"))
                    NavigationManager.getInstance().navigate("home");
                else
                    History.newItem("home");
            }
        });

        request.setText("MANAGE REQUESTS");
        request.getTriggerWidget().setHref("#requests");

        newRequest.setHref("#newFundingRequest");
        newRequest.setText("NEW FUNDING REQUEST");
        newRequest.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("newFundingRequest"))
                    NavigationManager.getInstance().navigate("newFundingRequest");
                else
                    History.newItem("newFundingRequest");
            }
        });
        newRequest.setActive(false);
        newRequest.setDisabled(true);

        bulkImport.setHref("#bulkImport");
        bulkImport.setText("BULK IMPORT");
        bulkImport.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("bulkImport"))
                    NavigationManager.getInstance().navigate("bulkImport");
                else
                    History.newItem("bulkImport");
            }
        });

        newBudgetRequest.setHref("#newBudgetRequest");
        newBudgetRequest.setText("NEW BUDGET REQUEST");
        newBudgetRequest.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("newBudgetRequest"))
                    NavigationManager.getInstance().navigate("newBudgetRequest");
                else
                    History.newItem("newBudgetRequest");
            }
        });

        existingRequests.setHref("#existingFundingRequests");
        existingRequests.setText("EXISTING FUNDING REQUESTS");
        existingRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("existingFundingRequests"))
                    NavigationManager.getInstance().navigate("existingFundingRequests");
                else
                    History.newItem("existingFundingRequests");
            }
        });

        existingBudgetRequests.setHref("#existingBudgetRequests");
        existingBudgetRequests.setText("EXISTING BUDGET REQUESTS");
        existingBudgetRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("existingBudgetRequests"))
                    NavigationManager.getInstance().navigate("existingBudgetRequests");
                else
                    History.newItem("existingBudgetRequests");
            }
        });

        monitor.setText("MONITOR");
        monitor.getTriggerWidget().setHref("#monitor");

        monitorFundingRequests.setText("FUNDING REQUESTS");
        monitorFundingRequests.setHref("#monitorFundingRequests");
        monitorFundingRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("monitorFundingRequests"))
                    NavigationManager.getInstance().navigate("monitorFundingRequests");
                else
                    History.newItem("monitorFundingRequests");
            }
        });

        monitorAlternativeFundingBids.setText("ALTERNATIVE FUNDING BIDS");
        monitorAlternativeFundingBids.setHref("#monitorAlternativeFundingBids");
        monitorAlternativeFundingBids.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("monitorAlternativeFundingBids"))
                    NavigationManager.getInstance().navigate("monitorAlternativeFundingBids");
                else
                    History.newItem("monitorAlternativeFundingBids");
            }
        });

        monitorBudgetRequests.setText("BUDGETS");
        monitorBudgetRequests.setHref("#monitorBudgets");
        monitorBudgetRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("monitorBudgets"))
                    NavigationManager.getInstance().navigate("monitorBudgets");
                else
                    History.newItem("monitorBudgets");
            }
        });

        monitorUsers.setText("USERS");
        monitorUsers.setHref("#monitorUsers");
        monitorUsers.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("monitorUsers"))
                    NavigationManager.getInstance().navigate("monitorUsers");
                else
                    History.newItem("monitorUsers");
            }
        });

        monitorUserRoles.setText("USER ROLES");
        monitorUserRoles.setHref("#monitorUserRoles");
        monitorUserRoles.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("monitorUserRoles"))
                    NavigationManager.getInstance().navigate("monitorUserRoles");
                else
                    History.newItem("monitorUserRoles");
            }
        });

        monitorHelpTexts.setText("HELP TEXTS");
        monitorHelpTexts.setHref("#monitorHelpTexts");
        monitorHelpTexts.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("monitorHelpTexts"))
                    NavigationManager.getInstance().navigate("monitorHelpTexts");
                else
                    History.newItem("monitorHelpTexts");
            }
        });

        monitor.add(monitorFundingRequests);
        monitor.add(monitorAlternativeFundingBids);
        monitor.add(monitorBudgetRequests);
        monitor.add(monitorUsers);
        monitor.add(monitorUserRoles);

        accountingMonitor.setText("ACCOUNTING");
        accountingMonitor.getTriggerWidget().setHref("#accountingMonitor");

        accountingMonitorFundingRequests.setText("FUNDING REQUESTS");
        accountingMonitorFundingRequests.setHref("#accountingMonitorFundingRequests");
        accountingMonitorFundingRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("accountingMonitorFundingRequests"))
                    NavigationManager.getInstance().navigate("accountingMonitorFundingRequests");
                else
                    History.newItem("accountingMonitorFundingRequests");
            }
        });

        accountingMonitorBudgets.setText("BUDGETS");
        accountingMonitorBudgets.setHref("#accountingMonitorBudgets");
        accountingMonitorBudgets.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("accountingMonitorBudgets"))
                    NavigationManager.getInstance().navigate("accountingMonitorBudgets");
                else
                    History.newItem("accountingMonitorBudgets");
            }
        });

        accountingMonitor.add(accountingMonitorFundingRequests);
        accountingMonitor.add(accountingMonitorBudgets);

        statistics.setText("STATISTICS");
        statistics.setHref("#statistics");
        statistics.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("statistics"))
                    NavigationManager.getInstance().navigate("statistics");
                else
                    History.newItem("statistics");
            }
        });

        support.setText("SUPPORT");
        support.getTriggerWidget().setHref("#support");

        faq.setText("FAQs");
        faq.setHref("https://www.openaire.eu/postgrantoapilot-faq");
        faq.setTarget("_blank");

        askAQuestion.setText("ASK A QUESTION");
        askAQuestion.setHref("https://www.openaire.eu/support/helpdesk");
        askAQuestion.setTarget("_blank");

        eligibleProjects.setText("FIND ELIGIBLE PROJECTS");
        eligibleProjects.setHref("#eligibleProjects");
        eligibleProjects.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                if(GoldOAPortal.currentToken.equals("eligibleProjects"))
                    NavigationManager.getInstance().navigate("eligibleProjects");
                else
                    History.newItem("eligibleProjects");
            }
        });

        support.add(faq);
        support.add(askAQuestion);
        support.add(eligibleProjects);

        contactUs.setText("CONTACT US");
        contactUs.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {

                final Modal contactUsModal = new Modal();

                contactUsModal.addStyleName("contactModal");
                contactUsModal.setTitle("Contact Us");
                contactUsModal.setAnimation(true);
                contactUsModal.setBackdrop(BackdropType.STATIC);
                contactUsModal.setDynamicSafe(true);

                ContactForm contactForm = new ContactForm();
                ContactForm.ContactSubmittedListener contactSubmittedListener = new ContactForm.ContactSubmittedListener() {
                    @Override
                    public void contactSubmitted() {
                        contactUsModal.hide();
                    }
                };
                contactForm.setContactSubmittedListener(contactSubmittedListener);

                contactUsModal.add(contactForm.asWidget());

                contactUsModal.show();
            }
        });

        mainMenu.add(home);
        if(GoldOAPortal.currentUser!=null) {

            mainMenu.add(request);
//            request.add(newRequest);
            request.add(existingRequests);

            if(Utils.currentUserHasRoleApproved("library_staff")) {
                request.add(bulkImport);
                request.add(newBudgetRequest);
                request.add(existingBudgetRequests);
            }

            if(Utils.currentUserHasRoleApproved("administrator"))
                monitor.add(monitorHelpTexts);

            if(Utils.currentUserHasRoleApproved("moderator") || Utils.currentUserHasRoleApproved("administrator")) {
                mainMenu.add(monitor);
                request.add(bulkImport);
            }

            if(Utils.currentUserHasRoleApproved("administrator") || Utils.currentUserHasRoleApproved("accounting"))
                mainMenu.add(accountingMonitor);
        }
        mainMenu.add(statistics);
        mainMenu.add(support);
        mainMenu.add(contactUs);
    }

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

    public void updateMainMenu(String token) {

        //TODO set active menu item
    }
}
