# 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_v2.api import SubbuildResult

DEPS = [
    "flutter/display_util",
    "fuchsia/status_check",
    "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.status_check.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.status_check.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.status_check.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.status_check.test("all_passed") +
      # With just red failures, raise red.
      api.buildbucket.simulated_collect_output([
          success_build,
      ]))
