# Copyright 2019 The Fuchsia 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 GCloudApi(recipe_api.RecipeApi):
  """GCloudApi provides support for common gcloud operations."""

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.gcloud_patched = False

  @property
  def _gcloud_executable(self):
    with self.m.step.nest('ensure gcloud'):
      gcloud_dir = self.m.path.start_dir / 'gcloud'
      gcloud_package = 'infra/3pp/tools/gcloud/${platform}'
      gcloud = self.m.cipd.EnsureFile().add_package(
          gcloud_package, "version:2@428.0.0.chromium.3"
      )
      self.m.cipd.ensure(gcloud_dir, gcloud)
      tool_name = 'gcloud.cmd' if self.m.platform.is_win else 'gcloud'
      return gcloud_dir / 'bin' / tool_name

  def __call__(self, *args, **kwargs):
    """Executes specified gcloud command."""
    step_name = kwargs.pop("step_name", f"gcloud {args[0]}")
    cmd = [self._gcloud_executable] + list(args)
    return self.m.step(step_name, cmd, **kwargs)

  def container_image_exists(self, image):
    step_result = self(
        "container",
        "images",
        "describe",
        image,
        ok_ret="any",
        step_name=f"check existence of {image}",
    )
    return step_result.retcode == 0

  def patch_gcloud_invoker(self):
    """GCloud invoker has issues when running on bots, this API
        patches the invoker to make it compatible with bots' python binary.
        """
    if self.gcloud_patched or not self._gcloud_executable:
      return
    gcloud_path = self.m.path.join(
        self.m.path.dirname(self.m.path.dirname(self._gcloud_executable)),
        "bin",
        "gcloud",
    )
    self.m.file.remove("remove gcloud wrapper", gcloud_path)
    self.m.file.copy(
        "copy patched gcloud",
        self.resource("gcloud"),
        gcloud_path,
    )
    self.gcloud_patched = True
