#!/usr/bin/env python
# Copyright 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Generate a report on a given suite run."""

from __future__ import print_function

import common
import sys

from autotest_lib.server.lib import suite_report
from chromite.lib import commandline
from chromite.lib import cros_logging as logging

def GetParser():
    """Creates the argparse parser."""
    parser = commandline.ArgumentParser(description=__doc__)
    parser.add_argument('job_ids', type=int, nargs='+',
                        help='Suite job ids to dump')
    parser.add_argument('--output', '-o', type=str, action='store',
                        help='Path to write JSON file to')
    return parser


def main(argv):
    """Standard main() for command line processing.

    @param argv Command line arguments (normally sys.argv).
    """

    parser = GetParser()
    options = parser.parse_args(argv[1:])

    # Look up and generate entries for all jobs.
    entries = []
    for suite_job_id in options.job_ids:
        logging.debug('Suite job %s:' % suite_job_id)
        suite_entries = suite_report.generate_suite_report(suite_job_id)
        logging.debug('... generated %d entries' % len(suite_entries))
        entries.extend(suite_entries)

    # Write all entries as JSON.
    if options.output:
        with open(options.output, 'w') as f:
            suite_report.dump_entries_as_json(entries, f)
    else:
        suite_report.dump_entries_as_json(entries, sys.stdout)


if __name__ == '__main__':
    main(sys.argv)
