#!/usr/bin/env python
#
# Copyright 2017 - The Android Open Source Project
#
# 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.

"""gsi_util command-line utility."""

import argparse
import logging
import sys


class GsiUtil(object):
  """Object for gsi_util command line tool."""

  _GSI_UTIL_VERSION = '1.0'

  # Adds gsi_util COMMAND here.
  # TODO(bowgotsai): auto collect from gsi_util/commands/*.py
  _COMMANDS = ['flash_gsi', 'pull', 'dump', 'hello']

  _LOGGING_FORMAT = '%(message)s'
  _LOGGING_LEVEL = logging.WARNING

  @staticmethod
  def _get_module_name(command):
    return 'gsi_util.commands.' + command

  def run(self, argv):
    """Command-line processor."""

    # Sets up default logging.
    logging.basicConfig(format=self._LOGGING_FORMAT, level=self._LOGGING_LEVEL)

    # Adds top-level --version/--debug argument.
    parser = argparse.ArgumentParser()
    parser.add_argument('-v', '--version', action='version',
                        version='%(prog)s {}'.format(self._GSI_UTIL_VERSION))
    parser.add_argument(
        '-d', '--debug', help='debug mode.', action='store_true')

    # Adds subparsers for each COMMAND.
    subparsers = parser.add_subparsers(title='COMMAND')
    for command in self._COMMANDS:
      module_name = self._get_module_name(command)
      mod = __import__(module_name, globals(), locals(), ['setup_command_args'])
      mod.setup_command_args(subparsers)

    args = parser.parse_args(argv[1:])
    if args.debug:
      logging.getLogger().setLevel(logging.DEBUG)

    try:
      args.func(args)
    except Exception as e:
      logging.error('%s: %s', argv[0], e.message)
      logging.exception(e)
      sys.exit(1)


if __name__ == '__main__':
  tool = GsiUtil()
  tool.run(sys.argv)
