#!/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', 'check_compat']

  _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)
