import 'app/polyfills';
import 'react-hot-loader';

import React from 'react';
import ReactDOM from 'react-dom';
import { factory as userFactory } from 'app/components/user/factory';
import authFlow from 'app/services/authFlow';
import storeFactory from 'app/storeFactory';
import bsodFactory from 'app/components/ui/bsod/factory';
import loader from 'app/services/loader';
import logger from 'app/services/logger';
import font from 'app/services/font';
import history, { browserHistory } from 'app/services/history';
import i18n from 'app/services/i18n';
import { loadScript, debounce } from 'app/functions';

import App from './shell/App';

const win: { [key: string]: any } = window as any;

history.init();

logger.init({
  sentryCdn: (window as any).SENTRY_CDN as string,
});

const store = storeFactory();

bsodFactory({
  store,
  history: browserHistory,
  stopLoading: () => loader.hide(),
});
authFlow.setStore(store);

Promise.all([
  userFactory(store),
  font.load(['Roboto', 'Roboto Condensed']),
  i18n.ensureIntl(), // ensure, that intl is polyfilled before any rendering
]).then(() => {
  ReactDOM.render(
    <App store={store} history={browserHistory} />,
    document.getElementById('app'),
  );

  initAnalytics();
});

const trackPageView = debounce(_trackPageView);
function initAnalytics() {
  if (!win.ga) {
    const ga: {
      [key: string]: any;
      (...args: any[]): void;
    } = function(...args) {
      // eslint-disable-next-line id-length
      (ga.q = ga.q || []).push(args);
    };
    win.ga = ga;
    ga.l = Date.now(); // eslint-disable-line

    if (win.GA_ID) {
      // when GA is not available, we will continue to push into array
      // for debug purposes
      // Catch to prevent "unhandled rejection" error
      loadScript(
        'https://www.google-analytics.com/analytics.js',
      ).catch(() => {});
    }

    ga('create', win.GA_ID, 'auto');
    trackPageView(location);

    browserHistory.listen(trackPageView);
  }
}

function _trackPageView(location) {
  const { ga } = win;

  ga('set', 'page', location.pathname + location.search);
  ga('send', 'pageview');
}
