/** @babel */

import { CompositeDisposable } from 'atom'

let reporter

function getReporter () {
  if (!reporter) {
    const Reporter = require('./reporter')
    reporter = new Reporter()
  }
  return reporter
}

export default {
  activate () {
    this.subscriptions = new CompositeDisposable()

    if (!atom.config.get('exception-reporting.userId')) {
      atom.config.set('exception-reporting.userId', require('node-uuid').v4())
    }

    this.subscriptions.add(
      atom.onDidThrowError(({ message, url, line, column, originalError }) => {
        try {
          getReporter().reportUncaughtException(originalError)
        } catch (secondaryException) {
          try {
            console.error(
              'Error reporting uncaught exception',
              secondaryException
            )
            getReporter().reportUncaughtException(secondaryException)
          } catch (error) {}
        }
      })
    )

    if (atom.onDidFailAssertion != null) {
      this.subscriptions.add(
        atom.onDidFailAssertion(error => {
          try {
            getReporter().reportFailedAssertion(error)
          } catch (secondaryException) {
            try {
              console.error(
                'Error reporting assertion failure',
                secondaryException
              )
              getReporter().reportUncaughtException(secondaryException)
            } catch (error) {}
          }
        })
      )
    }
  }
}
