'use strict'
const fs = require('fs')
const path = require('path')
const makeDir = require('make-dir')

var NYC
try {
  NYC = require('../../index.covered.js')
} catch (e) {
  NYC = require('../../index.js')
}

exports.command = 'merge <input-directory> [output-file]'

exports.describe = 'merge istanbul format coverage output in a given folder'

exports.builder = function (yargs) {
  return yargs
    .positional('input-directory', {
      describe: 'directory containing multiple istanbul coverage files',
      type: 'text',
      default: './.nyc_output'
    })
    .positional('output-file', {
      describe: 'file to output combined istanbul format coverage to',
      type: 'text',
      default: 'coverage.json'
    })
    .option('temp-dir', {
      alias: 't',
      describe: 'directory to read raw coverage information from',
      default: './.nyc_output'
    })
    .option('temp-directory', {
      hidden: true
    })
    .example('$0 merge ./out coverage.json', 'merge together reports in ./out and output as coverage.json')
}

exports.handler = function (argv) {
  process.env.NYC_CWD = process.cwd()
  const nyc = new NYC(argv)
  let inputStat
  try {
    inputStat = fs.statSync(argv.inputDirectory)
    if (!inputStat.isDirectory()) {
      console.error(`${argv.inputDirectory} was not a directory`)
      process.exit(1)
    }
  } catch (err) {
    console.error(`failed access input directory ${argv.inputDirectory} with error:\n\n${err.message}`)
    process.exit(1)
  }
  makeDir.sync(path.dirname(argv.outputFile))
  const map = nyc.getCoverageMapFromAllCoverageFiles(argv.inputDirectory)
  fs.writeFileSync(argv.outputFile, JSON.stringify(map, null, 2), 'utf8')
  console.info(`coverage files in ${argv.inputDirectory} merged into ${argv.outputFile}`)
}
