#!/usr/bin/env python3
# Copyright 2020 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.

"""Android Installer

This script will be called by push_to_device, chromeos-base/android-{container,
vm}-* ebuilds and board_specific_setup.
"""

from __future__ import print_function

import argparse
import enum
import sys
from typing import Dict, List


class AndroidInstallerCaller(enum.Enum):
  """Android Installer Caller"""
  PUSH_TO_DEVICE = 0
  EBUILD_SRC_COMPILE = 1
  EBUILD_SRC_INSTALL = 2
  EBUILD_SRC_TEST = 3
  BOARD_SPECIFIC_SETUP = 4
  BOARD_SPECIFIC_SETUP_TEST = 5

  @staticmethod
  def allowed_callers() -> List[str]:
    return [name.lower() for name in
            AndroidInstallerCaller.__members__.keys()]

  @staticmethod
  # TODO(boleynsu): annotate the return type once we are using python>3.6
  def from_str(caller: str):
    return AndroidInstallerCaller[caller.upper()]



class AndroidInstaller:
  """Android Installer"""

  # env variables used by Android Installer
  env: Dict[str, str]
  # use flags used by Android Installer
  use: Dict[str, bool]
  # caller of Android Installer
  caller: AndroidInstallerCaller

  def __init__(self, argv: List[str]) -> None:
    """Parse the arguments."""

    parser = argparse.ArgumentParser(
        usage=
        """
        Example:
          %(prog)s --env=ROOT=/build/rammus-arc-r --use=-cheets_local_img \\
            --caller push_to_device

          %(prog)s --env ROOT=/build/rammus-arc-r --env PV=9999 \\
            --env KEY_WITH_NO_VALUE= --use +cheets_local_img \\
            --use +chromeos-base/chromeos-cheets:android-container-pi \\
            --caller ebuild_src_compile
        Note:
          The dash used in --use is special so we must use --use=-use_flag
          instead of --use -use_flag
        """
    )
    parser.add_argument('--env', action='append',
                        help='the format is KEY=VALUE')
    parser.add_argument('--use', action='append',
                        help='the format is +use_flag or -use_flag')
    parser.add_argument(
        '--caller', choices=AndroidInstallerCaller.allowed_callers(),
        help='the caller of this script')

    args = parser.parse_args(args=argv)

    self.env = dict()
    if args.env:
      for e in args.env:
        kv = e.split('=', 1)
        if len(kv) < 2:
          raise ValueError(
              'Invalid --env %s argument.' % e +
              ' = is missing. For a key with no value, please use --env KEY=')
        key, value = kv
        if not key:
          raise ValueError(
              'Invalid --env %s argument.' % e +
              ' The key should not be empty.')
        # The later argument will overwrite the former one.
        self.env[key] = value

    self.use = dict()
    if args.use:
      for u in args.use:
        key = u[1:]
        if u[0] == '+':
          value = True
        elif u[0] == '-':
          value = False
        else:
          raise ValueError(
              'Invalid --use %s argument.' % u +
              ' The first character should be + or -.')
        # The later argument will overwrite the former one.
        self.use[key] = value

    if not args.caller:
      raise ValueError('--caller must be specified')
    self.caller = AndroidInstallerCaller.from_str(args.caller)

  def main(self) -> None:
    if self.caller in [AndroidInstallerCaller.PUSH_TO_DEVICE,
                       AndroidInstallerCaller.EBUILD_SRC_COMPILE]:
      self.ebuild_src_compile()
    if self.caller in [AndroidInstallerCaller.PUSH_TO_DEVICE,
                       AndroidInstallerCaller.EBUILD_SRC_TEST]:
      self.ebuild_src_test()
    if self.caller in [AndroidInstallerCaller.PUSH_TO_DEVICE,
                       AndroidInstallerCaller.EBUILD_SRC_INSTALL]:
      self.ebuild_src_install()
    if self.caller in [AndroidInstallerCaller.PUSH_TO_DEVICE,
                       AndroidInstallerCaller.BOARD_SPECIFIC_SETUP]:
      self.board_specific_setup()
    if self.caller in [AndroidInstallerCaller.PUSH_TO_DEVICE,
                       AndroidInstallerCaller.BOARD_SPECIFIC_SETUP_TEST]:
      self.board_specific_setup_test()

  def ebuild_src_compile(self) -> None:
    # TODO(boleynsu): implement this
    raise NotImplementedError()

  def ebuild_src_test(self) -> None:
    # TODO(boleynsu): implement this
    raise NotImplementedError()

  def ebuild_src_install(self) -> None:
    # TODO(boleynsu): implement this
    raise NotImplementedError()

  def board_specific_setup(self) -> None:
    # TODO(boleynsu): implement this
    raise NotImplementedError()

  def board_specific_setup_test(self) -> None:
    # TODO(boleynsu): implement this
    raise NotImplementedError()


if __name__ == '__main__':
  AndroidInstaller(sys.argv[1:]).main()
