'use strict'

function getObjectKeys (obj, excludeListItemAccessorsBelowLength) {
  const keys = []
  let size = 0

  // Sort property names, they should never be order-sensitive
  const nameCandidates = Object.getOwnPropertyNames(obj).sort()
  // Comparators should verify symbols in an order-insensitive manner if
  // possible.
  const symbolCandidates = Object.getOwnPropertySymbols(obj)

  for (let i = 0; i < nameCandidates.length; i++) {
    const name = nameCandidates[i]

    let accept = true
    if (excludeListItemAccessorsBelowLength > 0) {
      const index = Number(name)
      accept = (index % 1 !== 0) || index >= excludeListItemAccessorsBelowLength
    }

    if (accept && Object.getOwnPropertyDescriptor(obj, name).enumerable) {
      keys[size++] = name
    }
  }

  for (let i = 0; i < symbolCandidates.length; i++) {
    const symbol = symbolCandidates[i]
    if (Object.getOwnPropertyDescriptor(obj, symbol).enumerable) {
      keys[size++] = symbol
    }
  }

  return { keys, size }
}
module.exports = getObjectKeys