#!/usr/bin/env node
/**
 *
 *    Copyright (c) 2020 Silicon Labs
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

const scriptUtil = require('./script-util.js')
const fsExtra = require('fs-extra')

//workaround: executeCmd()/spawn() fails silently without complaining about missing path to electron
process.env.PATH = process.env.PATH + ':/usr/local/bin/'

/**
 * Execute the coverage report script.
 */
async function executeScript() {
  try {
    // Create directory if it does not exist
    await fsExtra.ensureDir('reports')

    if (fsExtra.existsSync('cypress-coverage/coverage-final.json')) {
      await fsExtra.copy(
        'cypress-coverage/coverage-final.json',
        'reports/from-cypress.json'
      )
    }

    if (fsExtra.existsSync('jest-coverage/coverage-final.json')) {
      await fsExtra.copy(
        'jest-coverage/coverage-final.json',
        'reports/from-jest.json'
      )
    }

    scriptUtil.executeCmd({}, 'npx', ['nyc', 'merge', 'reports'])

    await fsExtra.move('coverage.json', '.nyc_output/out.json', {
      overwrite: true
    })

    scriptUtil.executeCmd(
      {},
      'npx',
      'nyc report --reporter lcov --reporter text --report-dir coverage'.split(
        ' '
      )
    )

    console.log(
      `✅ Please find the combined report (Jest & Cypress) at ./coverage/lcov-report/index.html`
    )
  } catch (err) {
    console.log(
      'Error in generating reports at zap-combine-reports.js file and executeScript function: ' +
        err
    )
  }
}

executeScript()
