# Copyright (c) 2012 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.

"""This implements the metacommand cros.

This script is normally invoked via depot_tools/cros which discovers
where chromite is located and invokes this script.

In turn, this script looks for a subcommand based on how it was invoked. For
example: cros lint.

See cros/command/cros_XXX.py for actual command implementations.
"""

# pylint: disable=bad-whitespace

from __future__ import print_function

import sys

from chromite.cros import commands
from chromite.lib import commandline
from chromite.lib import stats


def GetOptions(my_commands):
  """Returns the argparse to use for Cros."""
  parser = commandline.ArgumentParser(caching=True)
  if not commands:
    return parser

  subparsers = parser.add_subparsers(title='cros commands')
  for cmd_name, class_def in sorted(my_commands.iteritems(), key=lambda x:x[0]):
    epilog = getattr(class_def, 'EPILOG', None)
    sub_parser = subparsers.add_parser(
        cmd_name, description=class_def.__doc__, epilog=epilog,
        caching=class_def.use_caching_options,
        formatter_class=commandline.argparse.RawDescriptionHelpFormatter)
    class_def.AddParser(sub_parser)

  return parser


def _RunSubCommand(subcommand):
  """Helper function for testing purposes."""
  return subcommand.Run()


def main(argv):
  parser = GetOptions(commands.ListCommands())
  # Cros currently does nothing without a subcmd. Print help if no args are
  # specified.
  if not argv:
    parser.print_help()
    return 1

  namespace = parser.parse_args(argv)
  subcommand = namespace.cros_class(namespace)
  with stats.UploadContext() as queue:
    if subcommand.upload_stats:
      cmd_base = subcommand.options.cros_class.command_name
      cmd_stats = stats.Stats.SafeInit(cmd_line=sys.argv, cmd_base=cmd_base)
      if cmd_stats:
        queue.put([cmd_stats, stats.StatsUploader.URL,
                   subcommand.upload_stats_timeout])
    # TODO: to make command completion faster, send an interrupt signal to the
    # stats uploader task after the subcommand completes.
    code = _RunSubCommand(subcommand)
    if code is not None:
      return code

  return 0
