# Copyright 2020 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 contextlib import contextmanager
from recipe_engine import recipe_api


class AndroidSdkApi(recipe_api.RecipeApi):
  """Provides Android SDK environment.

  Expects the android29 cache to be mounted on the swarming bot.
  """

  def install(self):
    """Installs Android SDK in cache."""
    with self.m.step.nest('download Android SDK components'):
      self.m.cipd.ensure(
          self._root().join('tools'),
          self.m.cipd.EnsureFile().add_package(
              'flutter/android/sdk/tools/${platform}',
              'version:26.1.1',
          ),
      )
      self.m.cipd.ensure(
          self._root().join('platform-tools'),
          self.m.cipd.EnsureFile().add_package(
              'flutter/android/sdk/platform-tools/${platform}',
              'version:29.0.2',
          ),
      )
      self.m.cipd.ensure(
          self._root().join('platforms'),
          self.m.cipd.EnsureFile().add_package(
              'flutter/android/sdk/platforms',
              'version:29r1',
          ),
      )
      self.m.cipd.ensure(
          self._root().join('build-tools'),
          self.m.cipd.EnsureFile().add_package(
              'flutter/android/sdk/build-tools/${platform}',
              'version:29.0.1',
          ),
      )

    with self.m.step.nest('add Android SDK licenses'):
      self.m.file.ensure_directory('mkdir licenses',
                                   self._root().join('licenses'))
      self.m.file.write_text(
          'android sdk license',
          self._root().join('licenses', 'android-sdk-license'),
          str(self.m.properties['android_sdk_license']),
      )
      self.m.file.write_text(
          'android sdk preview license',
          self._root().join('licenses', 'android-sdk-preview-license'),
          str(self.m.properties['android_sdk_preview_license']),
      )

  @contextmanager
  def context(self):
    """Yields a context that contains Android SDK environment.

    Must call api.android_sdk.install() first.
    """
    with self.m.context(
        env={'ANDROID_SDK_ROOT': self._root()},
        env_prefixes={
            'PATH': [
                self._root().join('platform-tools'),
                self._root().join('tools')
            ]
        }):
      yield

  def _root(self):
    return self.m.path['cache'].join('android29')
