#!/usr/bin/env python
# Copyright 2022 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Merge javascript results from code-coverage/pgo swarming runs.

Called by merge_results.py
"""

import argparse
import json
import logging
import os
import subprocess
import sys

import merge_lib as profile_merger
import merge_js_lib as javascript_merger


def _MergeAPIArgumentParser(*args, **kwargs):
    parser = argparse.ArgumentParser(*args, **kwargs)
    parser.add_argument('--task-output-dir', help=argparse.SUPPRESS)
    parser.add_argument('--javascript-coverage-dir',
                        help='directory for JavaScript coverage data')
    parser.add_argument('--chromium-src-dir',
                        help='directory for chromium/src checkout')
    parser.add_argument(
        '--build-dir',
        help='directory for the build directory in chromium/src')
    return parser


def main():
    parser = _MergeAPIArgumentParser()
    params = parser.parse_args()

    parsed_scripts = javascript_merger.write_parsed_scripts(
        params.task_output_dir)

    # Ensure JavaScript coverage dir exists.
    if not os.path.exists(params.javascript_coverage_dir):
        os.makedirs(params.javascript_coverage_dir)

    if not parsed_scripts:
        logging.warning('No parsed scripts written')
        return

    logging.info('Raw parsed scripts written out to %s', parsed_scripts)
    coverage_dirs = javascript_merger.get_raw_coverage_dirs(
        params.task_output_dir)
    logging.info('Identified directories containing coverage %s',
                 coverage_dirs)

    try:
        logging.info('Converting raw coverage to istanbul')
        javascript_merger.convert_raw_coverage_to_istanbul(
            coverage_dirs, parsed_scripts, params.task_output_dir)

        istanbul_coverage_dir = os.path.join(params.task_output_dir,
                                             'istanbul')
        output_dir = os.path.join(istanbul_coverage_dir, 'merged')
        os.makedirs(output_dir, exist_ok=True)

        coverage_file_path = os.path.join(output_dir, 'coverage.json')
        logging.info('Merging istanbul reports to %s', coverage_file_path)
        javascript_merger.merge_istanbul_reports(istanbul_coverage_dir,
                                                 parsed_scripts,
                                                 coverage_file_path)

        logging.info('Excluding uninteresting lines from coverage')
        javascript_merger.exclude_uninteresting_lines(coverage_file_path)

        logging.info(
            'Remapping all paths relative to the src dir and removing any ' +
            'files in the out dir')
        javascript_merger.remap_paths_to_relative(coverage_file_path,
                                                  params.chromium_src_dir,
                                                  params.build_dir)

        logging.info('Creating lcov report at %s',
                     params.javascript_coverage_dir)
        javascript_merger.generate_coverage_reports(
            output_dir, params.javascript_coverage_dir)
    except RuntimeError as e:
        logging.warning('Failed executing istanbul tasks: %s', e)


if __name__ == '__main__':
    logging.basicConfig(format='[%(asctime)s %(levelname)s] %(message)s',
                        level=logging.INFO)
    sys.exit(main())
