text: /*
   Copyright 2012-2015, Yahoo Inc.
   Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
   */
  var path = require('path'),
      configuration = require('./config'),
      inputError = require('./input-error'),
      libReport = require('istanbul-lib-report'),
      libReports = require('istanbul-reports'),
      minimatch = require('minimatch');
  
  function Reporter(cfg, opts) {
      opts = opts || {};
      this.config = cfg || configuration.loadFile();
      this.dir = path.resolve(this.config.reporting.dir());
      this.reports = {};
  
      var summarizer = opts.summarizer,
          s = this.config.reporting.summarizer();
  
      if (summarizer && typeof summarizer === 'function') {
          this.summarizer = summarizer;
      } else {
          summarizer = libReport.summarizers[s];
          if (!summarizer) {
              throw inputError.create(
                  'Invalid summarizer in report config: ' + s
              );
          }
          this.summarizer = summarizer;
      }
  }
  
  Reporter.prototype = {
      /**
       * adds a report to be generated. Must be one of the entries returned
       * by `Report.getReportList()`
       * @method add
       * @param {String} fmt the format of the report to generate
       */
      add: function(fmt) {
          if (this.reports[fmt]) {
              // already added
              return;
          }
          var config = this.config,
              rptConfig = config.reporting.reportConfig()[fmt] || {};
          rptConfig.verbose = config.verbose;
          try {
              if (this.config.verbose) {
                  console.error('Create report', fmt, ' with', rptConfig);
              }
              this.reports[fmt] = libReports.create(fmt, rptConfig);
          } catch (ex) {
              throw inputError.create('Invalid report format [' + fmt + ']');
          }
      },
      /**
       * adds an array of report formats to be generated
       * @method addAll
       * @param {Array} fmts an array of report formats
       */
      addAll: function(fmts) {
          var that = this;
          fmts.forEach(function(f) {
              that.add(f);
          });
      },
      /**
       * writes all reports added
       * @method write
       */
      write: function(coverageMap, opts) {
          opts = opts || {};
          var that = this,
              sourceFinder = opts.sourceFinder || null,
              context,
              tree;
  
          context = libReport.createContext({
              dir: this.dir,
              watermarks: this.config.reporting.watermarks(),
              sourceFinder: sourceFinder
          });
  
          var excludes = this.config.instrumentation.excludes() || [];
  
          coverageMap.filter(function(file) {
              return !excludes.some(function(exclude) {
                  return minimatch(file, exclude, { dot: true });
              });
          });
  
          tree = this.summarizer(coverageMap);
          Object.keys(this.reports).forEach(function(name) {
              var report = that.reports[name];
              tree.visit(report, context);
          });
      }
  };
  
  module.exports = Reporter;
  