'use strict'
var AstWalker = require('remix-lib').AstWalker
var list = require('./modules/list')

function staticAnalysisRunner () {
}

staticAnalysisRunner.prototype.run = function (compilationResult, toRun, callback) {
  var self = this
  var modules = toRun.map(function (i) {
    var m = self.modules()[i]
    return { 'name': m.name, 'mod': new m.Module() }
  })

  this.runWithModuleList(compilationResult, modules, callback)
}

staticAnalysisRunner.prototype.runWithModuleList = function (compilationResult, modules, callback) {
  var reports = []
  // Also provide convenience analysis via the AST walker.
  var walker = new AstWalker()
  for (var k in compilationResult.sources) {
    walker.walk(compilationResult.sources[k].legacyAST, {'*': function (node) {
      modules.map(function (item, i) {
        if (item.mod.visit !== undefined) {
          try {
            item.mod.visit(node)
          } catch (e) {
            reports.push({
              name: item.name, report: [{ warning: 'INTERNAL ERROR in module ' + item.name + ' ' + e.message }]
            })
          }
        }
      })
      return true
    }})
  }

  // Here, modules can just collect the results from the AST walk,
  // but also perform new analysis.
  reports = reports.concat(modules.map(function (item, i) {
    var report = null
    try {
      report = item.mod.report(compilationResult)
    } catch (e) {
      report = [{ warning: 'INTERNAL ERROR in module ' + item.name + ' ' + e.message }]
    }
    return { name: item.name, report: report }
  }))
  callback(reports)
}

staticAnalysisRunner.prototype.modules = function () {
  return list
}

module.exports = staticAnalysisRunner
