# Copyright 2020 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.recipe_api import Property
from RECIPE_MODULES.flutter.shard_util.api import SubbuildResult

DEPS = [
    "flutter/display_util",
    "recipe_engine/buildbucket",
]

PROPERTIES = {
    "raise_on_failure": Property(kind=bool, default=True),
}

# Build ids used to inject mock build objects to the buildbucket API.
SUCCESS_BUILD_ID = 123456789012345678
INFRA_FAILURE_BUILD_ID = 987654321098765432
FAILURE_BUILD_ID = 112233445566778899
FAILURE_BUILD_ID_2 = 112233445566778890
SCHEDULED_BUILD_ID = 199887766554433221
CANCELED_BUILD_ID = 987654321098765433


def RunSteps(api, raise_on_failure):
  # Collect current build status using the buildbucket API. The build ids
  # list passed to the API is to limit the query to only the build ids that
  # we are interested on. This API return a Build oject only if the build
  # exists in buildbucket.
  builds = api.buildbucket.collect_builds(
      build_ids=[
          # Builds with the following ids are mocked in the GenTests section
          # with different properties and status depending on the test.
          SUCCESS_BUILD_ID,
          INFRA_FAILURE_BUILD_ID,
          FAILURE_BUILD_ID,
          SCHEDULED_BUILD_ID,
          CANCELED_BUILD_ID,
      ]
  )
  final_builds = {}
  for key in builds:
    build = builds[key]
    final_builds[build.id] = SubbuildResult(
        builder=build.builder.builder,
        build_id=build.id,
        build_name=build.builder.builder,
        build_proto=build,
        url='https://cr-buildbucket.appspot.com/build/%s' % build.id
    )
  api.display_util.display_subbuilds(
      step_name="display builds",
      subbuilds=final_builds,
      raise_on_failure=raise_on_failure,
  )


def GenTests(api):

  def build(summary_markdown=None, **kwargs):
    b = api.buildbucket.ci_build_message(**kwargs)
    if summary_markdown:
      b.summary_markdown = summary_markdown
    return b

  # Mock builds injected in the different tests.
  success_build = build(
      build_id=SUCCESS_BUILD_ID,
      status="SUCCESS",
  )
  infra_failure_build = build(
      build_id=INFRA_FAILURE_BUILD_ID,
      status="INFRA_FAILURE",
      summary_markdown="something failed related to infra",
  )
  failure_build = build(
      build_id=FAILURE_BUILD_ID,
      status="FAILURE",
      summary_markdown="something failed not related to infra",
  )
  # Do not include summary_markdown to ensure full coverage.
  failure_build_2 = build(
      build_id=FAILURE_BUILD_ID_2,
      status="FAILURE",
  )
  scheduled_build = build(
      build_id=SCHEDULED_BUILD_ID,
      status="SCHEDULED",
  )
  canceled_build = build(
      build_id=CANCELED_BUILD_ID,
      status="CANCELED",
      summary_markdown="something failed related to infra",
  )

  yield (
      api.test("mixed_with_infra_failures", status="INFRA_FAILURE") +
      # Exercise all status colors.
      # Purple failures prioritized over red failures.
      api.buildbucket.simulated_collect_output([
          success_build,
          infra_failure_build,
          failure_build,
          scheduled_build,
      ])
  )

  yield (
      api.test("canceled_builds", status="INFRA_FAILURE") +
      # Exercise all status colors.
      # Purple failures prioritized over red failures.
      api.buildbucket.simulated_collect_output([
          success_build,
          canceled_build,
          scheduled_build,
      ])
  )

  yield (
      api.test("mixed_without_infra_failures", status="FAILURE") +
      # With just red failures, raise red.
      api.buildbucket.simulated_collect_output([
          success_build,
          failure_build,
          failure_build_2,
          scheduled_build,
      ])
  )

  yield (
      api.test("all_passed") +
      # With just red failures, raise red.
      api.buildbucket.simulated_collect_output([
          success_build,
      ])
  )
