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

from recipe_engine import recipe_api

class AdbApi(recipe_api.RecipeApi):
  def __init__(self, **kwargs):
    super(AdbApi, self).__init__(**kwargs)
    self._custom_adb_path = None
    self._devices = None

  def __call__(self, cmd, serial=None, **kwargs):  # pragma: nocover
    """Run an ADB command."""
    cmd_prefix = [self.adb_path()]
    if serial:
      cmd_prefix.extend(['-s', serial])
    return self.m.step(cmd=cmd_prefix + cmd, **kwargs)

  def set_adb_path(self, adb_path):
    self._custom_adb_path = adb_path

  def adb_path(self):
    if self._custom_adb_path:
      return self._custom_adb_path
    return self.m.path['checkout'].join(
        'third_party', 'android_tools', 'sdk', 'platform-tools', 'adb')

  def list_devices(self, step_test_data=None, **kwargs):
    cmd = [
        str(self.adb_path()),
        'devices',
    ]

    result = self.m.python(
        'List adb devices',
        self.resource('list_devices.py'),
        args=[ repr(cmd), self.m.json.output() ],
        step_test_data=step_test_data or self.test_api.device_list,
        **kwargs)

    self._devices = result.json.output

  @property
  def devices(self):
    assert self._devices is not None, (
        "devices is only available after yielding list_devices()")
    return self._devices

  def root_devices(self, **kwargs):
    self.list_devices(**kwargs)
    self.m.python.inline(
        'Root devices',
        """
        import subprocess
        import sys
        adb_path = sys.argv[1]
        for device in sys.argv[2:]:
          print 'Attempting to root device %s ...' % (device)
          subprocess.check_call([adb_path, '-s', device, 'root'])
          subprocess.check_call([adb_path, '-s', device, 'wait-for-device'])
          print 'Finished rooting device %s' % (device)
        """,
        args=[self.adb_path()] + self.devices,
        **kwargs)
