/* eslint-disable
    max-len,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
 * decaffeinate suggestions:
 * DS102: Remove unnecessary code created because of implicit returns
 * DS207: Consider shorter variations of null checks
 * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
 */
import { captureException } from '../infrastructure/error-reporter'

const app = angular.module('ErrorCatcher', [])
const UNHANDLED_REJECTION_ERR_MSG = 'Possibly unhandled rejection: canceled'

app.config([
  '$provide',
  $provide =>
    $provide.decorator('$exceptionHandler', [
      '$log',
      '$delegate',
      ($log, $delegate) =>
        function (exception, cause) {
          if (
            exception === UNHANDLED_REJECTION_ERR_MSG &&
            cause === undefined
          ) {
            return
          }

          captureException(exception, scope => {
            scope.setTag('handler', 'angular-exception-handler')
            return scope
          })

          return $delegate(exception, cause)
        }
    ])
])

// Interceptor to check auth failures in all $http requests
// http://bahmutov.calepin.co/catch-all-errors-in-angular-app.html

app.factory('unAuthHttpResponseInterceptor', ($q, $location) => ({
  responseError(response) {
    // redirect any unauthorised or forbidden responses back to /login
    //
    // set disableAutoLoginRedirect:true in the http request config
    // to disable this behaviour
    if (
      [401, 403].includes(response.status) &&
      !(response.config != null
        ? response.config.disableAutoLoginRedirect
        : undefined)
    ) {
      // for /project urls set the ?redir parameter to come back here
      // otherwise just go to the login page
      if (window.location.pathname.match(/^\/project/)) {
        window.location = `/login?redir=${encodeURI(window.location.pathname)}`
      } else {
        window.location = '/login'
      }
    }
    // pass the response back to the original requester
    return $q.reject(response)
  }
}))

app.config([
  '$httpProvider',
  $httpProvider =>
    $httpProvider.interceptors.push('unAuthHttpResponseInterceptor')
])
