# Copyright 2016 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 GaeSdkApi(recipe_api.RecipeApi):

  PLAT_PYTHON = 'python'
  PLAT_GO = 'go'

  # Map of {Platform => {Arch => (base, dirname)}}. Platform names are
  # "recipe_engine/platform" values.
  _PKG_MAP = {
      PLAT_PYTHON: {
        'all': ('google_appengine_', 'google_appengine'),
      },
      PLAT_GO: {
        'linux-amd64': ('go_appengine_sdk_linux_amd64-', 'go_appengine'),
        'mac-amd64': ('go_appengine_sdk_darwin_amd64-', 'go_appengine'),
      },
  }

  # Map of architecture bitness to CIPD bitness suffix.
  _BITS_MAP = {
      64: 'amd64',
  }


  class PackageNotFound(Exception):
    def __init__(self, plat, arch):
      super(GaeSdkApi.PackageNotFound, self).__init__(
          'Package not found for %s on %s' % (plat, arch))
      self.plat = plat
      self.arch = arch

  @property
  def latest_ref(self):
    return 'latest'

  def package_spec(self, plat, arch):
    plat_dict = self._PKG_MAP.get(plat, {})
    for a in (arch, 'all'):
      spec = plat_dict.get(a)
      if spec:
        download_base, dirname = spec
        pkg_name = 'infra/gae_sdk/%s/%s' % (plat, a)
        return pkg_name, download_base, dirname
    raise self.PackageNotFound(plat, arch)

  def package(self, plat, arch=None):
    arch = arch or '%s-%s' % (
        self.m.platform.name, self._BITS_MAP[self.m.platform.bits])
    pkg_name, _, _ = self.package_spec(plat, arch)
    return pkg_name

  @property
  def platforms(self):
    return sorted(self._PKG_MAP.keys())

  @property
  def all_packages(self):
    for plat, arch_dict in sorted(self._PKG_MAP.items()):
      for arch in sorted(arch_dict.keys()):
        yield plat, arch

  def fetch(self, plat, dst):
    """Fetch the AppEngine SDK for the specified platform.

    Args:
      plat (str): platform string, one of the PLAT_ local variables.
      dst (path.Path): The destination directory to extract it.
    """
    pkg = self.package(plat)
    self.m.cipd.ensure(dst, {pkg: self.latest_ref})
