# 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 recipe_engine.recipe_api import Property

PYTHON_VERSION_COMPATIBILITY = 'PY3'

DEPS = [
    'flutter/display_util',
    'flutter/repo_util',
    'recipe_engine/buildbucket',
    'recipe_engine/cipd',
    'recipe_engine/context',
    'recipe_engine/path',
    'recipe_engine/properties',
    'recipe_engine/step',
    'recipe_engine/swarming',
]


# This recipe builds the fuchsia_ctl CIPD package and tests it against the Linux
# Fuchsia builder.
def RunSteps(api):
  packages_dir = api.path['start_dir'].join('packages')
  packages_git_rev = api.repo_util.checkout(
      'packages',
      packages_dir,
      api.properties.get('git_url'),
      api.properties.get('git_ref'),
  )

  # Build and uploads a new version of the fuchsia_ctl CIPD package.
  fuchsia_ctl_path = packages_dir.join('packages', 'fuchsia_ctl')
  with api.context(cwd=fuchsia_ctl_path):
    api.step('run tool/build.sh', cmd=['tool/build.sh'])

  cipd_package_name = 'flutter/fuchsia_ctl/${platform}'
  cipd_zip_path = 'fuchsia_ctl.zip'
  api.cipd.build(
      fuchsia_ctl_path.join('build'), cipd_zip_path, cipd_package_name)
  pin = api.cipd.register(cipd_package_name, cipd_zip_path)

  # Test the new fuchsia_ctl CIPD package with a Linux Fuchsia build.
  props = {'fuchsia_ctl_version': pin.instance_id}
  builds = ScheduleBuilds(api, 'Linux Fuchsia', props)
  builds = CollectBuilds(api, builds)
  api.display_util.display_builds(
      step_name='display builds',
      builds=builds.values(),
      raise_on_failure=True,
  )


def ScheduleBuilds(api, builder_name, drone_props):
  req = api.buildbucket.schedule_request(
      swarming_parent_run_id=api.swarming.task_id,
      builder=builder_name,
      properties=drone_props,
      exe_cipd_version=api.properties.get('exe_cipd_version', 'refs/heads/main'))
  return api.buildbucket.schedule([req])


def CollectBuilds(api, builds):
  return api.buildbucket.collect_builds([build.id for build in builds],
                                        mirror_status=True)


def GenTests(api):
  yield api.test(
      'demo',
      api.properties(
          git_ref='refs/pull/123/head', git_url='https://abc.com/repo'),
  )
