const log = require('./log')

// Match an object with a query.
// Ex: Querying a.* on { a: { b: 1, c: 2 }}} -> [1, 2]
// We stop recusively attempting if isLeaf(node) returns true.
module.exports = function match (object, query, isLeaf) {
  isLeaf = isLeaf || function () { return true }

  query = query || '*'
  query = query.split('.')

  return doMatch(object, query, isLeaf)
}

function nameMatches (query, name) {
  /// __group is a reserved name.
  if (name === '__group') {
    return false
  }

  if (query === '*') {
    return true
  } else if (query === name) {
    return true
  }

  return false
}

function doMatch (object, query, isLeaf) {
  query = query || []

  let result = []
  let level = query.shift() || '*'

  for (let [ key, value ] of Object.entries(object)) {
    // If the name doesn't match, continue.
    if (!nameMatches(level, key)) {
      continue
    }

    
    if (isLeaf(value)) {
      // If it's a leaf, add a result.
      result.push(value)
    } else {
      // Otherwise, add child results.
      // We must slice(0) the query, so that it is duplicated.
      result = [...result, ...doMatch(value, query.slice(0), isLeaf)]
    }

  }

  return result
}