/**
 * @license
 * Copyright 2019-2020 The Go Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style
 * license that can be found in the LICENSE file.
 */

(function setupGoogleTagManager() {
  window.dataLayer = window.dataLayer || [];
  window.dataLayer.push({
    'gtm.start': new Date().getTime(),
    event: 'gtm.js',
  });
})();

/**
 * trackErrors creates an event listener that reports unhandled exceptions
 * to Google Tag Manager.
 */
(function trackErrors() {
  const loadErrorEvents = (window.__err && window.__err.p) || [];
  const trackError = error => {
    window.dataLayer.push({
      event: 'error',
      event_category: 'Script',
      event_action: 'uncaught error',
      event_label: (error && (error.stack || `${error.name}: ${error.message}`)) || '(not set)',
    });
  };

  for (let event of loadErrorEvents) {
    trackError(event.error);
  }

  window.addEventListener('error', event => {
    trackError(event.error);
  });
})();

/**
 * trackRejections creates an event listener that reports unhandled
 * promise rejections to Google Tag Manager.
 */
(function trackRejections() {
  const rejectionEvents = new Map();
  const reportUnhandledRejections = () => {
    for (var reason of rejectionEvents.values()) {
      window.dataLayer.push({
        event: 'error',
        event_category: 'Script',
        event_action: 'unhandled rejection',
        event_label: (reason && (reason.stack || reason.message)) || '(not set)',
      });
    }
    rejectionEvents.clear();
  };

  window.addEventListener('unhandledrejection', event => {
    rejectionEvents.set(event.promise, event.reason);
    // Checking for requestIdleCallback compatibility and
    // falling back to setTimeout with arbitrary timeout
    // of 250ms.
    if (typeof window.requestIdleCallback !== 'undefined') {
      window.requestIdleCallback(
        () => {
          reportUnhandledRejections();
        },
        { timeout: 1000 }
      );
    } else {
      window.setTimeout(() => {
        reportUnhandledRejections();
      }, 250);
    }
  });

  window.addEventListener('rejectionhandled', event => {
    rejectionEvents.delete(event.promise);
  });
})();
