'use strict'
const typeOf = arg =>
  typeof arg === 'object' ? (arg ? 'object' : 'null')
  : typeof arg

module.exports = (name_, extra_, cb_, defaultName) => {
  let name
  let extra
  let cb

  const args = [name_, extra_, cb_]

  // this only works if it's literally the 4th argument.
  // used internally.
  defaultName = defaultName || ''

  for (let i = 0; i < 3 && i < args.length; i++) {
    const arg = args[i]
    const type = typeOf(arg)
    if (name === undefined && (type === 'string' || type === 'number'))
      name = '' + arg
    else if (type === 'object') {
      extra = arg
      if (name === undefined)
        name = null
    } else if (type === 'function') {
      if (extra === undefined)
        extra = {}
      if (name === undefined)
        name = null
      cb = arg
    } else if (arg === false) {
      // it's handy while developing to put a ! in front of a
      // function to temporarily make a test todo
      continue
    } else if (type !== 'undefined')
      throw new TypeError('unknown argument passed to parseTestArgs: ' + type)
  }

  if (!extra)
    extra = {}

  if (!cb && defaultName !== '/dev/stdin')
    extra.todo = true

  if (!name && extra.name)
    name = extra.name

  if (!name && cb && cb.name)
    name = cb.name

  name = name || defaultName
  extra.name = name
  extra.cb = cb || todoCb
  return extra
}

const todoCb = () => {
  throw new Error('callback called for TODO test')
}
