// this is a weird meta test.  It verifies that all the instances of
// `npm.config.get(...)` are:
// a) Simple strings, and not variables
// b) Documented
// c) Defined in the `npmconf` package.

var test = require("tap").test
var fs = require("fs")
var path = require("path")
var root = path.resolve(__dirname, "..", "..")
var lib = path.resolve(root, "lib")
var nm = path.resolve(root, "node_modules")
var doc = path.resolve(root, "doc/misc/npm-config.md")
var FILES = []
var CONFS = {}
var DOC = {}

var exceptions = [
  path.resolve(lib, "config.js"),
  path.resolve(lib, "utils", "lifecycle.js")
]

test("get files", function (t) {
  walk(nm)
  walk(lib)
  t.pass("got files")
  t.end()

  function walk(lib) {
    var files = fs.readdirSync(lib).map(function (f) {
      return path.resolve(lib, f)
    })
    files.forEach(function (f) {
      if (fs.statSync(f).isDirectory())
        walk(f)
      else if (f.match(/\.js$/))
        FILES.push(f)
    })
  }
})

test("get lines", function (t) {
  FILES.forEach(function (f) {
    console.error(f)
    var lines = fs.readFileSync(f, 'utf8').split('\n')
    lines.forEach(function (l, i) {
      var matches = l.split(/conf(?:ig)?\.get\(/g)
      matches.shift()
      matches.forEach(function (m) {
        m = m.split(')').shift()
        var literal = m.match(/^['"].+['"]$/)
        if (literal) {
          m = m.slice(1, -1)
          if (!m.match(/^\_/) && m !== 'argv')
            CONFS[m] = {
              file: f,
              line: i
            }
        } else if (exceptions.indexOf(f) === -1) {
          t.fail("non-string-literal config used in " + f + ":" + i)
        }
      })
    })
  })
  t.pass("got lines")
  t.end()
})

test("get docs", function (t) {
  var d = fs.readFileSync(doc, "utf8").split("\n")
  // walk down until the "## Config Settings" section
  for (var i = 0; i < d.length && d[i] !== "## Config Settings"; i++);
  i++
  // now gather up all the ^###\s lines until the next ^##\s
  var doclines = []
  for (; i < d.length && !d[i].match(/^## /); i++) {
    if (d[i].match(/^### /))
      DOC[ d[i].replace(/^### /, '').trim() ] = true
  }
  t.pass("read the docs")
  console.error(DOC)
  t.end()
})

test("check configs", function (t) {
  var defs = require("npmconf/config-defs.js")
  var types = Object.keys(defs.types)
  var defaults = Object.keys(defs.defaults)

  for (var c in CONFS) {
    if (CONFS[c].file.indexOf(lib) === 0) {
      t.ok(DOC[c], "should be documented " + c + " "
          + CONFS[c].file + ":" + CONFS[c].line)
      t.ok(types.indexOf(c) !== -1, "should be defined in npmconf " + c)
      t.ok(defaults.indexOf(c) !== -1, "should have default in npmconf " + c)
    }
  }

  for (var c in DOC) {
    if (c !== "versions" && c !== "version") {
      t.ok(CONFS[c], "config in doc should be used somewhere " + c)
      t.ok(types.indexOf(c) !== -1, "should be defined in npmconf " + c)
      t.ok(defaults.indexOf(c) !== -1, "should have default in npmconf " + c)
    }
  }

  types.forEach(function(c) {
    if (!c.match(/^\_/) && c !== 'argv' && !c.match(/^versions?$/)) {
      t.ok(DOC[c], 'defined type should be documented ' + c)
      t.ok(CONFS[c], 'defined type should be used ' + c)
    }
  })

  defaults.forEach(function(c) {
    if (!c.match(/^\_/) && c !== 'argv' && !c.match(/^versions?$/)) {
      t.ok(DOC[c], 'defaulted type should be documented ' + c)
      t.ok(CONFS[c], 'defaulted type should be used ' + c)
    }
  })

  t.end()
})
