#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019 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.

"""Updates the status of all tryjobs to the result of `cros buildresult`."""

from __future__ import print_function

import argparse
import json
import os

import chroot
import update_tryjob_status


def GetPathToUpdateAllTryjobsWithAutoScript():
  """Returns the absolute path to this script."""

  return os.path.abspath(__file__)


def GetCommandLineArgs():
  """Parses the command line for the command line arguments."""

  # Default absoute path to the chroot if not specified.
  cros_root = os.path.expanduser('~')
  cros_root = os.path.join(cros_root, 'chromiumos')

  # Create parser and add optional command-line arguments.
  parser = argparse.ArgumentParser(description=__doc__)

  # Add argument for the JSON file to use for the update of a tryjob.
  parser.add_argument(
      '--last_tested',
      required=True,
      help='The absolute path to the JSON file that contains the tryjobs used '
      'for bisecting LLVM.')

  # Add argument for a specific chroot path.
  parser.add_argument(
      '--chroot_path',
      default=cros_root,
      help='the path to the chroot (default: %(default)s)')

  args_output = parser.parse_args()

  if not os.path.isfile(args_output.last_tested) or \
      not args_output.last_tested.endswith('.json'):
    raise ValueError('File does not exist or does not ending in ".json" '
                     ': %s' % args_output.last_tested)

  return args_output


def main():
  """Updates the status of a tryjob."""

  chroot.VerifyOutsideChroot()

  args_output = GetCommandLineArgs()

  with open(args_output.last_tested) as tryjobs:
    bisect_contents = json.load(tryjobs)

  for tryjob in bisect_contents['jobs']:
    if tryjob['status'] == update_tryjob_status.TryjobStatus.PENDING.value:
      tryjob['status'] = update_tryjob_status.GetAutoResult(
          args_output.chroot_path, tryjob['buildbucket_id'])

  new_file = '%s.new' % args_output.last_tested
  with open(new_file, 'w') as update_tryjobs:
    json.dump(bisect_contents, update_tryjobs, indent=4, separators=(',', ': '))
  os.rename(new_file, args_output.last_tested)


if __name__ == '__main__':
  main()
