package eu.dnetlib.client;

import com.github.gwtbootstrap.client.ui.Breadcrumbs;
import com.github.gwtbootstrap.client.ui.NavLink;
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;

import java.util.HashMap;
import java.util.Map;

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

    private Breadcrumbs breadcrumbsMenu = new Breadcrumbs();

    private NavLink home = new NavLink();

    private NavLink requests = new NavLink();
    private NavLink newFundingRequest = new NavLink();
    private NavLink existingFundingRequests = new NavLink();
    private NavLink newBudgetRequest = new NavLink();
    private NavLink existingBudgetRequests = new NavLink();

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

    private NavLink accountingMonitor = new NavLink();
    private NavLink accountingMonitorFundingRequests = new NavLink();
    private NavLink accountingMonitorBudgetRequests = new NavLink();

    private NavLink statistics = new NavLink();

    private NavLink support = new NavLink();
    private NavLink eligibleProjects = new NavLink();

    private NavLink login = new NavLink();
    private NavLink register = new NavLink();
    private NavLink myAccount = new NavLink();
    private NavLink editAccountInfo = new NavLink();

    private Map<String, NavLink> breadcrumbLinksMap = new HashMap<>();

    public BreadcrumbsMenu() {

        breadcrumbsMenu.setDivider("|");

        home.setHref("#home");
        home.setText("HOME");
        home.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("home");
            }
        });

        requests.setHref("#requests");
        requests.setText("MANAGE REQUESTS");
        requests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("requests");
            }
        });

        newFundingRequest.setHref("#newFundingRequest");
        newFundingRequest.setText("NEW FUNDING REQUEST");
        newFundingRequest.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("newFundingRequest");
            }
        });

        newBudgetRequest.setHref("#newBudgetRequest");
        newBudgetRequest.setText("NEW BUDGET REQUEST");
        newBudgetRequest.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("newBudgetRequest");
            }
        });

        existingFundingRequests.setHref("#existingFundingRequests");
        existingFundingRequests.setText("EXISTING FUNDING REQUESTS");
        existingFundingRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("existingFundingRequests");
            }
        });

        existingBudgetRequests.setHref("#existingBudgetRequests");
        existingBudgetRequests.setText("EXISTING BUDGET REQUESTS");
        existingBudgetRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("existingBudgetRequests");
            }
        });

        monitor.setHref("#monitor");
        monitor.setText("MONITOR");
        monitor.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("monitor");
            }
        });

        monitorFundingRequests.setHref("#monitorFundingRequests");
        monitorFundingRequests.setText("FUNDING REQUESTS");
        monitorFundingRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("monitorFundingRequests");
            }
        });

        monitorBudgetRequests.setHref("#monitorBudgets");
        monitorBudgetRequests.setText("BUDGETS");
        monitorBudgetRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("monitorBudgets");
            }
        });

        monitorUsers.setHref("#monitorUsers");
        monitorUsers.setText("USERS");
        monitorUsers.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("monitorUsers");
            }
        });

        monitorUserRoles.setHref("#monitorUserRoles");
        monitorUserRoles.setText("USER ROLES");
        monitorUserRoles.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("monitorUserRoles");
            }
        });

        monitorHelpTexts.setText("HELP TEXTS");
        monitorHelpTexts.setHref("#monitorHelpTexts");
        monitorHelpTexts.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("monitorHelpTexts");
            }
        });

        accountingMonitor.setHref("#accountingMonitor");
        accountingMonitor.setText("ACCOUNTING");
        accountingMonitor.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("accountingMonitor");
            }
        });

        accountingMonitorFundingRequests.setHref("#accountingMonitorFundingRequests");
        accountingMonitorFundingRequests.setText("FUNDING REQUESTS");
        accountingMonitorFundingRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("accountingMonitorFundingRequests");
            }
        });

        accountingMonitorBudgetRequests.setHref("#accountingMonitorBudgets");
        accountingMonitorBudgetRequests.setText("BUDGETS");
        accountingMonitorBudgetRequests.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("accountingMonitorBudgets");
            }
        });

        statistics.setHref("#statistics");
        statistics.setText("STATISTICS");
        statistics.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("statistics");
            }
        });

        support.setHref("#support");
        support.setText("SUPPORT");
        support.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("support");
            }
        });

        eligibleProjects.setText("ELIGIBLE PROJECTS");
        eligibleProjects.setHref("#eligibleProjects");
        eligibleProjects.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("eligibleProjects");
            }
        });

        login.setHref("#login");
        login.setText("LOGIN");
        login.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("login");
            }
        });

        register.setHref("#register");
        register.setText("REGISTER");
        register.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("register");
            }
        });

        myAccount.setHref("#myAccount");
        myAccount.setText("MY ACCOUNT");
        myAccount.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("myAccount");
            }
        });

        editAccountInfo.setHref("#editAccountInfo");
        editAccountInfo.setText("EDIT INFO");
        editAccountInfo.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                History.newItem("editAccountInfo");
            }
        });

        createBreadcrumbsMap();
    }

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

    public void updateBreadcrumbsMenu(String token) {

        String[] tokenParts = token.split("\\.");
        String menuToken = tokenParts[0];

        breadcrumbsMenu.clear();
        if(!menuToken.equals("home")) {
            if(breadcrumbLinksMap.get(menuToken)!=null) {
                breadcrumbsMenu.add(home);
                if(menuToken.equals("eligibleProjects"))
                    breadcrumbsMenu.add(support);
                if(menuToken.equals("editAccountInfo"))
                    breadcrumbsMenu.add(myAccount);
                if(menuToken.equals("monitorFundingRequests") || menuToken.equals("monitorBudgets")
                        || menuToken.equals("monitorUsers") || menuToken.equals("monitorUserRoles")
                        || menuToken.equals("monitorHelpTexts"))
                    breadcrumbsMenu.add(monitor);
                if(menuToken.equals("accountingMonitorFundingRequests") || menuToken.equals("accountingMonitorBudgets"))
                    breadcrumbsMenu.add(accountingMonitor);
                if(menuToken.equals("newFundingRequest") || menuToken.equals("existingFundingRequests")
                        || menuToken.equals("newBudgetRequest") || menuToken.equals("existingBudgetRequests"))
                    breadcrumbsMenu.add(requests);
                breadcrumbsMenu.add(breadcrumbLinksMap.get(menuToken));
            }
        }
    }

    private void createBreadcrumbsMap() {

        breadcrumbLinksMap.put("requests", requests);
        breadcrumbLinksMap.put("newFundingRequest", newFundingRequest);
        breadcrumbLinksMap.put("newBudgetRequest", newBudgetRequest);
        breadcrumbLinksMap.put("existingFundingRequests", existingFundingRequests);
        breadcrumbLinksMap.put("existingBudgetRequests", existingBudgetRequests);
        breadcrumbLinksMap.put("monitor", monitor);
        breadcrumbLinksMap.put("monitorFundingRequests", monitorFundingRequests);
        breadcrumbLinksMap.put("monitorBudgets", monitorBudgetRequests);
        breadcrumbLinksMap.put("monitorUsers", monitorUsers);
        breadcrumbLinksMap.put("monitorUserRoles", monitorUserRoles);
        breadcrumbLinksMap.put("monitorHelpTexts", monitorHelpTexts);
        breadcrumbLinksMap.put("accountingMonitor", accountingMonitor);
        breadcrumbLinksMap.put("accountingMonitorFundingRequests", accountingMonitorFundingRequests);
        breadcrumbLinksMap.put("accountingMonitorBudgets", accountingMonitorBudgetRequests);
        breadcrumbLinksMap.put("statistics", statistics);
        breadcrumbLinksMap.put("support", support);
        breadcrumbLinksMap.put("eligibleProjects", eligibleProjects);
        breadcrumbLinksMap.put("login", login);
        breadcrumbLinksMap.put("register", register);
        breadcrumbLinksMap.put("myAccount", myAccount);
        breadcrumbLinksMap.put("editAccountInfo", editAccountInfo);
    }
}
