package eu.dnetlib.client;

import com.github.gwtbootstrap.client.ui.Modal;
import com.github.gwtbootstrap.client.ui.constants.BackdropType;
import com.google.gwt.query.client.Function;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.RootPanel;
import eu.dnetlib.client.accountingmonitor.AccountingMonitorBudgetsWidget;
import eu.dnetlib.client.accountingmonitor.AccountingMonitorFundingRequestsWidget;
import eu.dnetlib.client.accountingmonitor.AccountingMonitorWidget;
import eu.dnetlib.client.fundingrequest.bulkimport.BulkImportWidget;
import eu.dnetlib.client.fundingrequest.existingrequests.ExistingFundingRequestsWidget;
import eu.dnetlib.client.fundingrequest.newrequest.*;
import eu.dnetlib.client.fundingrequest.newrequest.accountingstep.AccountingStepWidget;
import eu.dnetlib.client.fundingrequest.newrequest.projectstep.ProjectStepWidget;
import eu.dnetlib.client.fundingrequest.newrequest.publicationstep.PublicationStepWidget;
import eu.dnetlib.client.fundingrequest.newrequest.researcherstep.ResearcherStepWidget;
import eu.dnetlib.client.fundingrequest.newrequest.summarystep.SummaryStepWidget;
import eu.dnetlib.client.monitor.*;
import eu.dnetlib.client.statistics.StatisticsWidget;
import eu.dnetlib.client.support.EligibleProjectsWidget;
import eu.dnetlib.client.support.SupportWidget;
import eu.dnetlib.client.user.ForgotPasswordForm;
import eu.dnetlib.client.user.MyAccountWidget;
import eu.dnetlib.client.user.UserLoginForm;
import eu.dnetlib.client.user.UserRegistrationForm;

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

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

/**
 * Created by stefania on 3/6/15.
 */
public class ContentManager {

    private Map<String, MyWidget> widgetMap = new HashMap<>();

    public ContentManager() {

        UserLoginForm.getInstance().clear();
        widgetMap.put("login", UserLoginForm.getInstance());

        ForgotPasswordForm.getInstance().clear();
        widgetMap.put("forgotYourPassword", ForgotPasswordForm.getInstance());

        UserRegistrationForm userRegistrationForm = new UserRegistrationForm(false);
        widgetMap.put("register", userRegistrationForm);

        HomeWidget homeWidget = new HomeWidget();
        widgetMap.put("home", homeWidget);

        SupportWidget supportWidget = new SupportWidget();
        widgetMap.put("support", supportWidget);

        EligibleProjectsWidget eligibleProjectsWidget = new EligibleProjectsWidget();
        widgetMap.put("eligibleProjects", eligibleProjectsWidget);

        StatisticsWidget statisticsWidget = new StatisticsWidget();
        widgetMap.put("statistics", statisticsWidget);



        if(GoldOAPortal.currentUser!=null) {
            List<FundingWizardStepWidget> wizardStepWidgets = new ArrayList<>();

            ResearcherStepWidget researcherStepWidget = new ResearcherStepWidget("Researcher");
            wizardStepWidgets.add(researcherStepWidget);

            ProjectStepWidget projectStepWidget = new ProjectStepWidget("Project");
            wizardStepWidgets.add(projectStepWidget);

            PublicationStepWidget publicationStepWidget = new PublicationStepWidget("Publication");
            wizardStepWidgets.add(publicationStepWidget);

            AccountingStepWidget accountingStepWidget = new AccountingStepWidget("Accounting");
            wizardStepWidgets.add(accountingStepWidget);

            SummaryStepWidget summaryStepWidget = new SummaryStepWidget("Summary");
            wizardStepWidgets.add(summaryStepWidget);

            FundingWizardWidget fundingWizardWidget = new FundingWizardWidget(wizardStepWidgets);
            widgetMap.put("newFundingRequest", fundingWizardWidget);

            ExistingFundingRequestsWidget existingFundingRequestsWidget = new ExistingFundingRequestsWidget();
            widgetMap.put("existingFundingRequests", existingFundingRequestsWidget);

            BulkImportWidget bulkImportWidget = new BulkImportWidget();
            widgetMap.put("bulkImport", bulkImportWidget);

            NewBudgetRequestWidget newBudgetRequestWidget = new NewBudgetRequestWidget();
            widgetMap.put("newBudgetRequest", newBudgetRequestWidget);

            ExistingBudgetRequestsWidget existingBudgetRequestsWidget = new ExistingBudgetRequestsWidget();
            widgetMap.put("existingBudgetRequests", existingBudgetRequestsWidget);

            RequestsWidget requestsWidget = new RequestsWidget();
            widgetMap.put("requests", requestsWidget);

            MonitorWidget monitorWidget = new MonitorWidget();
            widgetMap.put("monitor", monitorWidget);

            MonitorFundingRequestsWidget monitorFundingRequestsWidget = new MonitorFundingRequestsWidget();
            widgetMap.put("monitorFundingRequests", monitorFundingRequestsWidget);

            MonitorAlternativeFundingBidsWidget monitorAlternativeFundingBidsWidget = new MonitorAlternativeFundingBidsWidget();
            widgetMap.put("monitorAlternativeFundingBids", monitorAlternativeFundingBidsWidget);

            MonitorBudgetsWidget monitorBudgetsWidget = new MonitorBudgetsWidget();
            widgetMap.put("monitorBudgets", monitorBudgetsWidget);

            MonitorUsersWidget monitorUsersWidget = new MonitorUsersWidget();
            widgetMap.put("monitorUsers", monitorUsersWidget);

            MonitorUserRolesWidget monitorUserRolesWidget = new MonitorUserRolesWidget();
            widgetMap.put("monitorUserRoles", monitorUserRolesWidget);

            MonitorHelpTextsWidget monitorHelpTextsWidget = new MonitorHelpTextsWidget();
            widgetMap.put("monitorHelpTexts", monitorHelpTextsWidget);

            AccountingMonitorWidget accountingMonitorWidget = new AccountingMonitorWidget();
            widgetMap.put("accountingMonitor", accountingMonitorWidget);

            AccountingMonitorFundingRequestsWidget accountingMonitorFundingRequestsWidget = new AccountingMonitorFundingRequestsWidget();
            widgetMap.put("accountingMonitorFundingRequests", accountingMonitorFundingRequestsWidget);

            AccountingMonitorBudgetsWidget accountingMonitorBudgetsWidget = new AccountingMonitorBudgetsWidget();
            widgetMap.put("accountingMonitorBudgets", accountingMonitorBudgetsWidget);

            MyAccountWidget myAccountWidget = new MyAccountWidget();
            widgetMap.put("myAccount", myAccountWidget);

            EditAccountInfoWidget editAccountInfoWidget = new EditAccountInfoWidget();
            widgetMap.put("editAccountInfo", editAccountInfoWidget);

        }
    }

    public void updateContent(String token) {

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

        if(widgetMap.get(menuToken)!=null) {
            if(widgetMap.get(GoldOAPortal.previousToken)!=null)
                widgetMap.get(GoldOAPortal.previousToken).clear();
            widgetMap.get(menuToken).clear();
        }

        RootPanel.get("content").clear();
        RootPanel.get("sidebar").clear();
        Window.scrollTo(0, 0);

        if(widgetMap.get(menuToken)!=null) {

            if(menuToken.equals("newFundingRequest")) {

                List<FundingWizardStepWidget> wizardStepWidgets = new ArrayList<>();

                ResearcherStepWidget researcherStepWidget = new ResearcherStepWidget("Researcher");
                wizardStepWidgets.add(researcherStepWidget);

                ProjectStepWidget projectStepWidget = new ProjectStepWidget("Project");
                wizardStepWidgets.add(projectStepWidget);

                PublicationStepWidget publicationStepWidget = new PublicationStepWidget("Publication");
                wizardStepWidgets.add(publicationStepWidget);

                AccountingStepWidget accountingStepWidget = new AccountingStepWidget("Accounting");
                wizardStepWidgets.add(accountingStepWidget);

                SummaryStepWidget summaryStepWidget = new SummaryStepWidget("Summary");
                wizardStepWidgets.add(summaryStepWidget);

                FundingWizardWidget fundingWizardWidget = new FundingWizardWidget(wizardStepWidgets);
                widgetMap.put("newFundingRequest", fundingWizardWidget);
            }

            widgetMap.get(menuToken).setToken(token);
            widgetMap.get(menuToken).reload();
            RootPanel.get("content").add(widgetMap.get(menuToken));
            widgetMap.get(menuToken).afterAdditionToRootPanel();

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

                public boolean f(Event e) {

                    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();

                    return true;
                }
            });


        } else {
            //TODO invalid token
        }
    }
}
