# Copyright 2018 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.
"""Recipe for downloading and packaging Vulkan SDK."""

from recipe_engine.recipe_api import Property

DEPS = [
    'fuchsia/upload',
    'recipe_engine/archive',
    'recipe_engine/cipd',
    'recipe_engine/url',
    'recipe_engine/context',
    'recipe_engine/file',
    'recipe_engine/path',
    'recipe_engine/platform',
    'recipe_engine/properties',
    'recipe_engine/step',
]

PROPERTIES = {
    'version': Property(kind=str, help='SDK version', default='1.1.92.1')
}

# These target spellings are used by Vulkan SDK.
PLATFORMS_TO_TARGETS = {
    'linux-amd64': 'linux-x86_64',
    'mac-amd64': 'macos',
}
PLATFORMS = PLATFORMS_TO_TARGETS.keys()

URL_TEMPLATE = 'https://sdk.lunarg.com/sdk/download/{0}/{1}/vulkansdk-{2}-{0}.tar.gz'


def RunSteps(api, version):
  for platform in PLATFORMS:
    with api.step.nest(platform):
      url = URL_TEMPLATE.format(version,
                                platform.split('-')[0],
                                PLATFORMS_TO_TARGETS[platform])
      sdk_tarball = api.path['start_dir'].join('vulkansdk-%s.tar.gz' % platform)
      api.url.get_file(url, sdk_tarball, step_name='fetch sdk')
      sdk_path = api.path['start_dir'].join('vulkansdk-%s' % platform)
      api.archive.extract('extract sdk', sdk_tarball, sdk_path)

      pkg_dir = sdk_path.join({
          'linux-amd64': version,
          'mac-amd64': 'vulkansdk-macos-' + version,
      }[platform])
      api.upload.cipd_package('fuchsia/third_party/vulkansdk/%s' % platform,
                              pkg_dir, [api.upload.DirectoryPath(pkg_dir)],
                              {'version': version})


def GenTests(api):
  version = '1.2.30.4'
  cipd_search_step_data = []
  for platform in PLATFORMS:
    pkg_name = 'fuchsia/third_party/vulkansdk/' + platform
    cipd_search_step_data.append(
        api.step_data(
            platform + '.cipd.cipd search ' + pkg_name + ' version:' + version,
            api.cipd.example_search(pkg_name + platform, [])))
  yield (api.test('existing') + api.properties(version=version) +
         reduce(lambda a, b: a + b, cipd_search_step_data))
  yield (api.test('new') + api.properties(version=version))
