/**
 * Freezes the Promise global and prevents its reassignment.
 */
const deepFreeze = require('deep-freeze-strict')

if (
  process.env.IN_TEST !== 'true' &&
  process.env.METAMASK_ENV !== 'test'
) {
  freeze(global, 'Promise')
}

/**
 * Makes a key:value pair on a target object immutable, with limitations.
 * The key cannot be reassigned or deleted, and the value is recursively frozen
 * using Object.freeze.
 *
 * Because of JavaScript language limitations, this is does not mean that the
 * value is completely immutable. It is, however, better than nothing.
 *
 * @param {Object} target - The target object to freeze a property on.
 * @param {String} key - The key to freeze.
 * @param {any} [value] - The value to freeze, if different from the existing value on the target.
 * @param {boolean} [enumerable=true] - If given a value, whether the property is enumerable.
 */
function freeze (target, key, value, enumerable = true) {

  const opts = {
    configurable: false, writable: false,
  }

  if (value !== undefined) {
    opts.value = deepFreeze(value)
    opts.enumerable = enumerable
  } else {
    target[key] = deepFreeze(target[key])
  }

  Object.defineProperty(target, key, opts)
}