export default {
  name: "custom-routes",
  initialize(app) {
    if (window.location.pathname.indexOf("/w/") < 0) return;

    const EmberObject = requirejs("@ember/object").default;
    const Router = requirejs("wizard/router").default;
    const ApplicationRoute = requirejs("wizard/routes/application").default;
    const CustomWizard = requirejs("discourse/plugins/discourse-custom-wizard/wizard/models/custom").default;
    const getUrl = requirejs("discourse-common/lib/get-url").default;
    const Store = requirejs("discourse/models/store").default;
    const registerRawHelpers = requirejs("discourse-common/lib/raw-handlebars-helpers").registerRawHelpers;
    const createHelperContext = requirejs("discourse-common/lib/helpers").createHelperContext;
    const RawHandlebars = requirejs("discourse-common/lib/raw-handlebars").default;
    const Site = requirejs("discourse/plugins/discourse-custom-wizard/wizard/models/site").default;
    const RestAdapter = requirejs("discourse/adapters/rest").default;
    const Session = requirejs("discourse/models/session").default;
    const setDefaultOwner = requirejs("discourse-common/lib/get-owner").setDefaultOwner;
    const messageBus = requirejs("message-bus-client").default;
    
    const container = app.__container__;
    Discourse.Model = EmberObject.extend();
    Discourse.__container__ = container;
    setDefaultOwner(container);
    registerRawHelpers(RawHandlebars, Handlebars);

    // IE11 Polyfill - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Polyfill
    if (!Object.entries) {
      Object.entries = function (obj) {
        var ownProps = Object.keys(obj),
          i = ownProps.length,
          resArray = new Array(i); // preallocate the Array
        while (i--) resArray[i] = [ownProps[i], obj[ownProps[i]]];

        return resArray;
      };
    }

    Object.keys(Ember.TEMPLATES).forEach((k) => {
      if (k.indexOf("select-kit") === 0) {
        let template = Ember.TEMPLATES[k];
        define(k, () => template);
      }
    });

    const targets = ["controller", "component", "route", "model", "adapter"];

    const siteSettings = Wizard.SiteSettings;
    app.register("site-settings:main", siteSettings, { instantiate: false });
    createHelperContext({ siteSettings });
    targets.forEach((t) => app.inject(t, "siteSettings", "site-settings:main"));

    app.register("message-bus:main", messageBus, { instantiate: false });
    targets.forEach((t) => app.inject(t, "messageBus", "message-bus:main"));

    app.register("service:store", Store);
    targets.forEach((t) => app.inject(t, "store", "service:store"));
    targets.forEach((t) => app.inject(t, "appEvents", "service:app-events"));

    app.register("adapter:rest", RestAdapter);

    const site = Site.current();
    app.register("site:main", site, { instantiate: false });
    targets.forEach((t) => app.inject(t, "site", "site:main"));

    site.set("can_create_tag", false);
    app.register("session:main", Session.current(), { instantiate: false });
    targets.forEach((t) => app.inject(t, "session", "session:main"));
    
    createHelperContext({
      siteSettings: container.lookup("site-settings:main"),
      currentUser: container.lookup("current-user:main"),
      site: container.lookup("site:main"),
      session: container.lookup("session:main"),
      capabilities: container.lookup("capabilities:main"),
    });
    
    const session = container.lookup("session:main");
    const setupData = document.getElementById("data-discourse-setup").dataset;
    session.set("highlightJsPath", setupData.highlightJsPath);
    
    Router.reopen({
      rootURL: getUrl("/w/")
    });

    Router.map(function () {
      this.route("custom", { path: "/:wizard_id" }, function () {
        this.route("steps");
        this.route("step", { path: "/steps/:step_id" });
      });
    });

    ApplicationRoute.reopen({
      redirect() {
        this.transitionTo("custom");
      },
      model() {},
    });
  },
};