# 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.
"""Recipe for building Fuchsia SDKs."""

from recipe_engine.config import List
from recipe_engine.recipe_api import Property

DEPS = [
    'fuchsia/build',
    'fuchsia/buildbucket_util',
    'fuchsia/checkout',
    'fuchsia/fuchsia',
    'fuchsia/gsutil',
    'fuchsia/jiri',
    'recipe_engine/buildbucket',
    'recipe_engine/isolated',
    'recipe_engine/path',
    'recipe_engine/properties',
    'recipe_engine/step',
]

# These represent the location of the isolated hash in the output of this
# recipe.  They need to be kept in sync with sdk.py
ISOLATE_STEP_NAME = 'isolate artifacts'
ISOLATED_OUTPUT_KEY = 'isolated_output_hash'

PROPERTIES = {
    'manifest':
        Property(kind=str, help='Jiri manifest to use'),
    'remote':
        Property(kind=str, help='Remote manifest repository'),
    'checkout_snapshot':
        Property(
            kind=bool,
            help='Whether or not to checkout from a Jiri snapshot.'
            ' Snapshot is expected to be found at the location specified by'
            ' BuildBucket input.',
            default=False),
    'ninja_targets':
        Property(
            kind=List(basestring),
            help='Ninja targets to build',
            default=[
                'sdk/archive/core.tar.gz',
                'sdk/archive/fuchsia_dart.tar.gz',
            ]),
    'packages':
        Property(
            kind=List(basestring),
            help='Packages to build',
            default=['//topaz/packages/sdk:topaz']),
    'sdk_id':
        Property(kind=str, help='SDK version id'),
    'target':
        Property(kind=str, help='target CPU architecture'),
}


def RunSteps(api, manifest, remote, checkout_snapshot, ninja_targets, packages,
             sdk_id, target):
  build = api.buildbucket.build

  checkout_root = api.path['start_dir'].join('fuchsia')
  if checkout_snapshot:
    if api.buildbucket_util.is_tryjob:
      assert len(build.input.gerrit_changes) == 1
      checkout = api.checkout.from_patchset_snapshot(
          path=checkout_root, gerrit_change=build.input.gerrit_changes[0])
    else:
      checkout = api.checkout.from_commit_snapshot(
          path=checkout_root, gitiles_commit=build.input.gitiles_commit)
  else:
    assert manifest
    assert remote
    checkout = api.checkout.fuchsia_with_options(
        path=checkout_root,
        build=build,
        manifest=manifest,
        remote=remote,
    )

  build_output = api.build.with_options(
      build_dir=checkout.root_dir.join('out'),
      build_images=False,
      checkout=checkout,
      target=target,
      build_type='release',
      product='products/core.gni',
      # TODO(DX-1415): move SDK tools back to universe_packages.
      packages=packages + ['//sdk/bundles:tools'],
      gn_args=['build_sdk_archives=true',
               'sdk_id="%s"' % sdk_id],
      ninja_targets=ninja_targets,
  )

  sdk_archive_path = build_output.fuchsia_build_dir.join('sdk', 'archive')
  isolated = api.isolated.isolated(sdk_archive_path)

  for ninja_target in ninja_targets:
    isolated.add_file(
        path=build_output.fuchsia_build_dir.join(*ninja_target.split('/')))

  # Archive the isolated.
  sdk_archive_isolated_hash = isolated.archive(ISOLATE_STEP_NAME)

  api.step.active_result.presentation.properties[
      ISOLATED_OUTPUT_KEY] = sdk_archive_isolated_hash


def GenTests(api):
  topaz_properties = api.properties(
      project='integration',
      manifest='fuchsia/topaz/topaz',
      remote='https://fuchsia.googlesource.com/integration',
      sdk_id='###SDK_ID###',
      target='x64')

  yield (api.test('basic') + topaz_properties)
  yield (api.test('snapshot') + topaz_properties +
         api.properties(checkout_snapshot=True) + api.buildbucket.ci_build())
  yield (api.test('snapshot_cq') + topaz_properties +
         api.properties(checkout_snapshot=True) + api.buildbucket.try_build())
