package eu.dnetlib.espas.gui.client;

import com.github.gwtbootstrap.client.ui.Dropdown;
import com.github.gwtbootstrap.client.ui.NavHeader;
import com.github.gwtbootstrap.client.ui.NavLink;
import com.github.gwtbootstrap.client.ui.NavPills;
import com.google.gwt.core.client.GWT;
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.Window;
import com.google.gwt.user.client.ui.IsWidget;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.widget.core.client.info.Info;
import eu.dnetlib.espas.gui.shared.User;

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

/**
 * Created by stefania on 10/3/14.
 */
public class MainMenu implements IsWidget {

    private static MainMenu instance = null;

    private final NavPills mainMenu = new NavPills();

    private NavLink home = new NavLink();

    private NavLink dataSearch = new NavLink();
//    private Dropdown dataSearch = new Dropdown();
//    private NavLink timePeriod = new NavLink();
//    private NavLink assets = new NavLink();
//    private NavLink observedProperties = new NavLink();
//    private NavLink observationCollections = new NavLink();
//    private NavLink timeLocation = new NavLink();

    private Dropdown dataOverview = new Dropdown();
//    private NavLink summary = new NavLink();
    private NavLink browseMetadata = new NavLink();
    private NavLink browseOntology = new NavLink();
    private final NavLink browseSupportingVocabularies = new NavLink();
//    private NavLink statistics = new NavLink();

    private NavLink dataPolicies = new NavLink();

    private Dropdown valueAddedServices = new Dropdown();
    private NavLink tecPlotter = new NavLink();
    private NavLink idlPlottingTool = new NavLink();

    private Dropdown support = new Dropdown();
    private NavLink aboutESPAS = new NavLink();
    private NavLink dataModelOverview = new NavLink();
    private NavLink ontologyOverview = new NavLink();
    private NavLink glossary = new NavLink();
    private NavLink faq = new NavLink();
    private NavLink usersManual = new NavLink();
    private NavLink forDataProviders = new NavLink();
    private NavLink dataProvidersStatus = new NavLink();
    private NavLink contactUs = new NavLink();

    private Dropdown myAccount = new Dropdown();
    private NavLink myPersonalInfo = new NavLink();
    private NavLink myFileDownloads = new NavLink();
    private NavLink myDataDownloads = new NavLink();
    private NavLink myLocationSearches = new NavLink();
    private NavLink dataProviderManagement = new NavLink();
    private NavLink dataRegistration = new NavLink();

    private static Map<String, String> urls = new HashMap<String, String>();
    private static Map<String, ClickHandler> menuHandlers = new HashMap<String, ClickHandler>();

    static {

        urls.put("home", GWT.getHostPageBaseURL() + "index.html");
        urls.put("search", GWT.getHostPageBaseURL() + "search.html#search");
//        urls.put("timePeriod", GWT.getHostPageBaseURL() + "search.html?menuItem=timePeriod");
//        urls.put("assets", GWT.getHostPageBaseURL() + "search.html?menuItem=assets");
//        urls.put("observedProperties", GWT.getHostPageBaseURL() + "search.html?menuItem=observedProperties");
//        urls.put("observationCollections", GWT.getHostPageBaseURL() + "search.html?menuItem=observationCollections");
//        urls.put("timeLocation", GWT.getHostPageBaseURL() + "search.html?menuItem=timeLocation");
//        urls.put("overview", GWT.getHostPageBaseURL() + "browse.html#overview");
        urls.put("metadata", GWT.getHostPageBaseURL() + "browse.html#metadata");
        urls.put("ontology", GWT.getHostPageBaseURL() + "browse.html#ontology");
        urls.put("supportingVocabularies", GWT.getHostPageBaseURL() + "browse.html#supportingVocabularies");
//        urls.put("statistics", GWT.getHostPageBaseURL() + "browse.html#statistics");
        urls.put("dataPolicies", GWT.getHostPageBaseURL() + "dataPolicies.html");
        urls.put("tecPlotter", GWT.getHostPageBaseURL() + "valueAddedServices.html#tecPlotter");
        urls.put("idlPlottingTool", GWT.getHostPageBaseURL() + "valueAddedServices.html#idlPlottingTool");
        urls.put("aboutESPAS", GWT.getHostPageBaseURL() + "userSupport.html#aboutESPAS");
        urls.put("dataModelOverview", GWT.getHostPageBaseURL() + "userSupport.html#dataModelOverview");
        urls.put("ontologyOverview", GWT.getHostPageBaseURL() + "userSupport.html#ontologyOverview");
        urls.put("glossary", GWT.getHostPageBaseURL() + "userSupport.html#glossary");
        urls.put("faq", GWT.getHostPageBaseURL() + "userSupport.html#faq");
        urls.put("userManual", GWT.getHostPageBaseURL() + "userSupport.html#userManual");
        urls.put("forDataProviders", GWT.getHostPageBaseURL() + "userSupport.html#forDataProviders");
        urls.put("dataProvidersStatus", GWT.getHostPageBaseURL() + "userSupport.html#dataProvidersStatus");
        urls.put("contactUs", GWT.getHostPageBaseURL() + "userSupport.html#contactUs");
        urls.put("myPersonalInfo", GWT.getHostPageBaseURL() + "myAccount.html#myPersonalInfo");
        urls.put("myDatasetFileDownloads", GWT.getHostPageBaseURL() + "myAccount.html#myDatasetFileDownloads");
        urls.put("myDataValueDownloads", GWT.getHostPageBaseURL() + "myAccount.html#myDataValueDownloads");
        urls.put("myLocationSearches", GWT.getHostPageBaseURL() + "myAccount.html#myLocationSearches");
        urls.put("registerDataProvider", GWT.getHostPageBaseURL() + "myAccount.html#registerDataProvider");
        urls.put("manageDataSource", GWT.getHostPageBaseURL() + "myAccount.html#manageDataSource");

        menuHandlers.put("home", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("home"));
            }
        });

        menuHandlers.put("search", new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {

                if(Window.Location.getHref().equals(GWT.getHostPageBaseURL() + "search.html#search"))
                    Window.Location.reload();
                else
                    Window.Location.replace(urls.get("search"));
            }
        });

//        menuHandlers.put("timePeriod", new ClickHandler() {
//            @Override
//            public void onClick(ClickEvent event) {
//                Window.Location.replace(urls.get("timePeriod"));
//            }
//        });
//
//        menuHandlers.put("assets", new ClickHandler() {
//            @Override
//            public void onClick(ClickEvent event) {
//                Window.Location.replace(urls.get("assets"));
//            }
//        });
//
//        menuHandlers.put("observedProperties", new ClickHandler() {
//            @Override
//            public void onClick(ClickEvent event) {
//                Window.Location.replace(urls.get("observedProperties"));
//            }
//        });
//
//        menuHandlers.put("observationCollections", new ClickHandler() {
//            @Override
//            public void onClick(ClickEvent event) {
//                Window.Location.replace(urls.get("observationCollections"));
//            }
//        });
//
//        menuHandlers.put("timeLocation", new ClickHandler() {
//            @Override
//            public void onClick(ClickEvent event) {
//                Window.Location.replace(urls.get("timeLocation"));
//            }
//        });

//        menuHandlers.put("overview", new ClickHandler() {
//            @Override
//            public void onClick(ClickEvent event) {
//                Window.Location.replace(urls.get("overview"));
//            }
//        });

        menuHandlers.put("metadata", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("metadata"));
            }
        });

        menuHandlers.put("ontology", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("ontology"));
            }
        });

        menuHandlers.put("supportingVocabularies", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("supportingVocabularies"));
            }
        });

//        menuHandlers.put("statistics", new ClickHandler() {
//            @Override
//            public void onClick(ClickEvent event) {
//                Window.Location.replace(urls.get("statistics"));
//            }
//        });

        menuHandlers.put("dataPolicies", new ClickHandler() {
            @Override
            public void onClick(ClickEvent clickEvent) {
                Window.Location.replace(urls.get("dataPolicies"));
            }
        });

        menuHandlers.put("tecPlotter", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("tecPlotter"));
            }
        });

        menuHandlers.put("idlPlottingTool", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("idlPlottingTool"));
            }
        });

        menuHandlers.put("aboutESPAS", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("aboutESPAS"));
            }
        });

        menuHandlers.put("dataModelOverview", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("dataModelOverview"));
            }
        });

        menuHandlers.put("ontologyOverview", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("ontologyOverview"));
            }
        });

        menuHandlers.put("glossary", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("glossary"));
            }
        });

        menuHandlers.put("faq", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("faq"));
            }
        });

        menuHandlers.put("userManual", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("userManual"));
            }
        });

        menuHandlers.put("forDataProviders", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("forDataProviders"));
            }
        });

        menuHandlers.put("dataProvidersStatus", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("dataProvidersStatus"));
            }
        });

        menuHandlers.put("contactUs", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("contactUs"));
            }
        });

        menuHandlers.put("myPersonalInfo", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("myPersonalInfo"));
            }
        });

        menuHandlers.put("myDatasetFileDownloads", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("myDatasetFileDownloads"));
            }
        });

        menuHandlers.put("myDataValueDownloads", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("myDataValueDownloads"));
            }
        });

        menuHandlers.put("myLocationSearches", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("myLocationSearches"));
            }
        });

        menuHandlers.put("registerDataProvider", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("registerDataProvider"));
            }
        });

        menuHandlers.put("manageDataSource", new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                Window.Location.replace(urls.get("manageDataSource"));
            }
        });
    }

    private MainMenu() {

        home.setText("HOME");
        home.setHref(urls.get("home"));
        mainMenu.add(home);

        dataSearch.setText("SEARCH");
        dataSearch.setHref(urls.get("search"));

//        NavHeader progressiveSearch = new NavHeader();
//        progressiveSearch.setText("Progressive search");
//        dataSearch.add(progressiveSearch);
//
//        timePeriod.setHref(urls.get("timePeriod"));
//        timePeriod.setText("Time Period");
//        dataSearch.add(timePeriod);
//
//        assets.setHref(urls.get("assets"));
//        assets.setText("Assets");
//        dataSearch.add(assets);
//
//        observedProperties.setHref(urls.get("observedProperties"));
//        observedProperties.setText("Observed Properties");
//        dataSearch.add(observedProperties);
//
//        observationCollections.setHref(urls.get("observationCollections"));
//        observationCollections.setText("Observation Collections");
//        dataSearch.add(observationCollections);
//
//        NavHeader spatialTemporalSearch = new NavHeader();
//        spatialTemporalSearch.setText("Spatial/Temporal Search");
//        dataSearch.add(spatialTemporalSearch);
//
//        timeLocation.setHref(urls.get("timeLocation"));
//        timeLocation.setText("Time/Location");
//        dataSearch.add(timeLocation);

        mainMenu.add(dataSearch);

        dataOverview.setText("BROWSE");

//        summary.setHref(urls.get("overview"));
//        summary.setText("Overview");
//        dataOverview.add(summary);

        browseMetadata.setHref(urls.get("metadata"));
        browseMetadata.setText("ESPAS Metadata");
        dataOverview.add(browseMetadata);

        browseOntology.setHref(urls.get("ontology"));
        browseOntology.setText("ESPAS Space Physics Ontology");
        dataOverview.add(browseOntology);

        browseSupportingVocabularies.setHref(urls.get("supportingVocabularies"));
        browseSupportingVocabularies.setText("ESPAS Supporting Vocabularies");
        dataOverview.add(browseSupportingVocabularies);

//        statistics.setHref(urls.get("statistics"));
//        statistics.setText("Statistics");
//        dataOverview.add(statistics);

        mainMenu.add(dataOverview);

        dataPolicies.setText("ESPAS POLICIES");
        dataPolicies.setHref(urls.get("dataPolicies"));

        mainMenu.add(dataPolicies);

        valueAddedServices.setText("VALUE ADDED SERVICES");

        tecPlotter.setHref(urls.get("tecPlotter"));
        tecPlotter.setText("TEC Time Series Plotter");
        valueAddedServices.add(tecPlotter);

        idlPlottingTool.setHref(urls.get("idlPlottingTool"));
        idlPlottingTool.setText("Plotting tool for OGC SWE data files");
        valueAddedServices.add(idlPlottingTool);

        mainMenu.add(valueAddedServices);

        support.setText("SUPPORT");

        aboutESPAS.setHref(urls.get("aboutESPAS"));
        aboutESPAS.setText("About ESPAS");
        support.add(aboutESPAS);

        dataModelOverview.setHref(urls.get("dataModelOverview"));
        dataModelOverview.setText("ESPAS Data Model");
        support.add(dataModelOverview);

        ontologyOverview.setHref(urls.get("ontologyOverview"));
        ontologyOverview.setText("ESPAS Space Physics Ontology");
        support.add(ontologyOverview);

        glossary.setHref(urls.get("glossary"));
        glossary.setText("Glossary");
        support.add(glossary);

        faq.setHref(urls.get("faq"));
        faq.setText("FAQ");
        support.add(faq);

        usersManual.setHref(urls.get("userManual"));
        usersManual.setText("ESPAS User's Manual");
        support.add(usersManual);

        forDataProviders.setHref(urls.get("forDataProviders"));
        forDataProviders.setText("For Data Providers");
        support.add(forDataProviders);

        dataProvidersStatus.setHref(urls.get("dataProvidersStatus"));
        dataProvidersStatus.setText("Data Providers' Status");
        support.add(dataProvidersStatus);

        contactUs.setHref(urls.get("contactUs"));
        contactUs.setText("Contact Us");
        support.add(contactUs);

        mainMenu.add(support);

        myAccount.setText("MY ACCOUNT");

        myPersonalInfo.setHref(urls.get("myPersonalInfo"));
        myPersonalInfo.setText("My Personal Info");
        myAccount.add(myPersonalInfo);

        myFileDownloads.setHref(urls.get("myDatasetFileDownloads"));
        myFileDownloads.setText("My Dataset File Downloads");
        myAccount.add(myFileDownloads);

        myDataDownloads.setHref(urls.get("myDataValueDownloads"));
        myDataDownloads.setText("My Data Values Downloads");
        myAccount.add(myDataDownloads);

        myLocationSearches.setHref(urls.get("myLocationSearches"));
        myLocationSearches.setText("My Location Searches");
        myAccount.add(myLocationSearches);

        dataProviderManagement.setText("Register Data Provider");
        dataProviderManagement.setHref(urls.get("registerDataProvider"));
        myAccount.add(dataProviderManagement);

        dataRegistration.setText("Manage Data Source");
        dataRegistration.setHref(urls.get("manageDataSource"));
        myAccount.add(dataRegistration);

        mainMenu.add(myAccount);

    }

    public static final MainMenu getInstance() {

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

        return instance;
    }

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

    public void update() {

        if(User.currentUser==null) {

            myAccount.setVisible(false);

        } else {

            myAccount.setVisible(true);
            dataProviderManagement.setVisible(false);
            dataRegistration.setVisible(false);

            for(String role : User.currentUser.getRoles()) {
                if(role.equals("dataprovider")) {

                    dataProviderManagement.setVisible(true);
                    dataRegistration.setVisible(true);

                    break;
                }
            }
        }
    }

    private void setAllInactive() {
        home.removeStyleName("activeMenuItem");
        dataSearch.removeStyleName("activeMenuItem");
        dataOverview.removeStyleName("activeMenuItem");
        dataPolicies.removeStyleName("activeMenuItem");
        valueAddedServices.removeStyleName("activeMenuItem");
        support.removeStyleName("activeMenuItem");
        myAccount.removeStyleName("activeMenuItem");
    }

    public void setHomeActive() {
        setAllInactive();
        home.addStyleName("activeMenuItem");
    }

    public void setDataOverviewActive() {
        setAllInactive();
        dataOverview.addStyleName("activeMenuItem");
    }

    public void setDataSearchActive() {
        setAllInactive();
        dataSearch.addStyleName("activeMenuItem");
    }

    public void setDataPoliciesActive() {
        setAllInactive();
        dataPolicies.addStyleName("activeMenuItem");
    }

    public void setValueAddedServicesActive() {
        setAllInactive();
        valueAddedServices.addStyleName("activeMenuItem");
    }

    public void setSupportActive() {
        setAllInactive();
        support.addStyleName("activeMenuItem");
    }

    public void setMyAccountActive() {
        setAllInactive();
        myAccount.addStyleName("activeMenuItem");
    }

    public static void setOverrideHandlers(Map<String, ClickHandler> overrideMenuHandlers) {
        menuHandlers.putAll(overrideMenuHandlers);
    }

    public void addHandlers() {

        home.addClickHandler(menuHandlers.get("home"));
        dataSearch.addClickHandler(menuHandlers.get("search"));
//        timePeriod.addClickHandler(menuHandlers.get("timePeriod"));
//        assets.addClickHandler(menuHandlers.get("assets"));
//        observedProperties.addClickHandler(menuHandlers.get("observedProperties"));
//        observationCollections.addClickHandler(menuHandlers.get("observationCollections"));
//        timeLocation.addClickHandler(menuHandlers.get("timeLocation"));
//        summary.addClickHandler(menuHandlers.get("overview"));
        browseMetadata.addClickHandler(menuHandlers.get("metadata"));
        browseOntology.addClickHandler(menuHandlers.get("ontology"));
        browseSupportingVocabularies.addClickHandler(menuHandlers.get("supportingVocabularies"));
//        statistics.addClickHandler(menuHandlers.get("statistics"));
        dataPolicies.addClickHandler(menuHandlers.get("dataPolicies"));
        tecPlotter.addClickHandler(menuHandlers.get("tecPlotter"));
        idlPlottingTool.addClickHandler(menuHandlers.get("idlPlottingTool"));
        aboutESPAS.addClickHandler(menuHandlers.get("aboutESPAS"));
        dataModelOverview.addClickHandler(menuHandlers.get("dataModelOverview"));
        ontologyOverview.addClickHandler(menuHandlers.get("ontologyOverview"));
        glossary.addClickHandler(menuHandlers.get("glossary"));
        faq.addClickHandler(menuHandlers.get("faq"));
        usersManual.addClickHandler(menuHandlers.get("userManual"));
        forDataProviders.addClickHandler(menuHandlers.get("forDataProviders"));
        dataProvidersStatus.addClickHandler(menuHandlers.get("dataProvidersStatus"));
        contactUs.addClickHandler(menuHandlers.get("contactUs"));
        myPersonalInfo.addClickHandler(menuHandlers.get("myPersonalInfo"));
        myFileDownloads.addClickHandler(menuHandlers.get("myDatasetFileDownloads"));
        myDataDownloads.addClickHandler(menuHandlers.get("myDataValueDownloads"));
        myLocationSearches.addClickHandler(menuHandlers.get("myLocationSearches"));
        dataProviderManagement.addClickHandler(menuHandlers.get("registerDataProvider"));
        dataRegistration.addClickHandler(menuHandlers.get("manageDataSource"));
    }
}
