(function() {
  var ps = require("preload-store").default;
  var preloadedDataElement = document.getElementById("data-preloaded");
  var setupData = document.getElementById("data-discourse-setup").dataset;

  if (preloadedDataElement) {
    var preloaded = JSON.parse(preloadedDataElement.dataset.preloaded);

    Object.keys(preloaded).forEach(function(key) {
      ps.store(key, JSON.parse(preloaded[key]));

      if (setupData.debugPreloadedAppData === "true") {
        /* eslint-disable no-console */
        console.log(key, ps.get(key));
        /* eslint-enable no-console */
      }
    });
  }

  window.Logster = window.Logster || {};
  window.Logster.enabled = setupData.enableJsErrorReporting === "true";

  Discourse.CDN = setupData.cdn;
  Discourse.BaseUrl = setupData.baseUrl;
  Discourse.BaseUri = setupData.baseUri;
  Discourse.Environment = setupData.environment;
  Discourse.SiteSettings = ps.get("siteSettings");
  Discourse.ThemeSettings = ps.get("themeSettings");
  Discourse.LetterAvatarVersion = setupData.letterAvatarVersion;
  Discourse.MarkdownItURL = setupData.markdownItUrl;
  Discourse.ServiceWorkerURL = setupData.serviceWorkerUrl;
  I18n.defaultLocale = setupData.defaultLocale;
  Discourse.start();
  Discourse.set("assetVersion", setupData.assetVersion);

  let Session = require("discourse/models/session").default;
  Session.currentProp(
    "disableCustomCSS",
    setupData.disableCustomCss === "true"
  );

  if (setupData.safeMode) {
    Session.currentProp("safe_mode", setupData.safeMode);
  }

  Discourse.HighlightJSPath = setupData.highlightJsPath;
  Discourse.SvgSpritePath = setupData.svgSpritePath;

  if (Discourse.Environment === "development") {
    Discourse.SvgIconList = setupData.svgIconList;
  }

  if (setupData.s3BaseUrl) {
    Discourse.S3CDN = setupData.s3Cdn;
    Discourse.S3BaseUrl = setupData.s3BaseUrl;
  }

  Ember.RSVP.configure("onerror", function(e) {
    // Ignore TransitionAborted exceptions that bubble up
    if (e && e.message === "TransitionAborted") {
      return;
    }

    if (Discourse.Environment === "development") {
      /* eslint-disable no-console  */
      if (e) {
        if (e.message || e.stack) {
          console.log(e.message);
          console.log(e.stack);
        } else {
          console.log("Uncaught promise: ", e);
        }
      } else {
        console.log("A promise failed but was not caught.");
      }
      /* eslint-enable no-console  */
    }

    window.onerror(e && e.message, null, null, null, e);
  });
})();
