#!/usr/bin/env python
# Copyright (c) 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Launches Android Virtual Devices with a set configuration for testing Chrome.

The script will launch a specified number of Android Virtual Devices (AVD's).
"""


import install_emulator_deps
import logging
import optparse
import os
import re
import sys

from pylib import cmd_helper
from pylib import constants
from pylib.utils import emulator


def main(argv):
  # ANDROID_SDK_ROOT needs to be set to the location of the SDK used to launch
  # the emulator to find the system images upon launch.
  emulator_sdk = os.path.join(constants.EMULATOR_SDK_ROOT, 'sdk')
  os.environ['ANDROID_SDK_ROOT'] = emulator_sdk

  opt_parser = optparse.OptionParser(description='AVD script.')
  opt_parser.add_option('--name', help='Optinaly, name of existing AVD to '
                        'launch. If not specified, new AVD\'s will be created')
  opt_parser.add_option('-n', '--num', dest='emulator_count',
                        help='Number of emulators to launch (default is 1).',
                        type='int', default='1')
  opt_parser.add_option('--abi', default='x86',
                        help='Platform of emulators to launch (x86 default).')
  opt_parser.add_option('--api-level', dest='api_level',
                        help='API level for the image, e.g. 19 for Android 4.4',
                        type='int', default=constants.ANDROID_SDK_VERSION)

  options, _ = opt_parser.parse_args(argv[1:])

  logging.basicConfig(level=logging.INFO,
                      format='# %(asctime)-15s: %(message)s')
  logging.root.setLevel(logging.INFO)

  # Check if KVM is enabled for x86 AVD's and check for x86 system images.
  # TODO(andrewhayden) Since we can fix all of these with install_emulator_deps
  # why don't we just run it?
  if options.abi == 'x86':
    if not install_emulator_deps.CheckKVM():
      logging.critical('ERROR: KVM must be enabled in BIOS, and installed. '
                       'Enable KVM in BIOS and run install_emulator_deps.py')
      return 1
    elif not install_emulator_deps.CheckX86Image(options.api_level):
      logging.critical('ERROR: System image for x86 AVD not installed. Run '
                       'install_emulator_deps.py')
      return 1

  if not install_emulator_deps.CheckSDK():
    logging.critical('ERROR: Emulator SDK not installed. Run '
                     'install_emulator_deps.py.')
    return 1

  # If AVD is specified, check that the SDK has the required target. If not,
  # check that the SDK has the desired target for the temporary AVD's.
  api_level = options.api_level
  if options.name:
    android = os.path.join(constants.EMULATOR_SDK_ROOT, 'sdk', 'tools',
                           'android')
    avds_output = cmd_helper.GetCmdOutput([android, 'list', 'avd'])
    names = re.findall('Name: (\w+)', avds_output)
    api_levels = re.findall('API level (\d+)', avds_output)
    try:
      avd_index = names.index(options.name)
    except ValueError:
      logging.critical('ERROR: Specified AVD %s does not exist.' % options.name)
      return 1
    api_level = int(api_levels[avd_index])

  if not install_emulator_deps.CheckSDKPlatform(api_level):
    logging.critical('ERROR: Emulator SDK missing required target for API %d. '
                     'Run install_emulator_deps.py.')
    return 1

  if options.name:
    emulator.LaunchEmulator(options.name, options.abi)
  else:
    emulator.LaunchTempEmulators(options.emulator_count, options.abi,
                                 options.api_level, True)



if __name__ == '__main__':
  sys.exit(main(sys.argv))
