# Copyright (c) 2020, the Dart project 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 api import BisectApi

from recipe_engine import recipe_test_api

from google.protobuf import json_format
from google.protobuf.struct_pb2 import Struct

from PB.go.chromium.org.luci.buildbucket.proto import build as build_pb2
from PB.go.chromium.org.luci.buildbucket.proto import builder as builder_pb2
from PB.go.chromium.org.luci.buildbucket.proto import builds_service as builds_service_pb2


class BisectBuildTestApi(recipe_test_api.RecipeTestApi):

  def build(self,
            api,
            builder_name,
            build_number,
            revision,
            is_bisection=False,
            is_success=True):
    builder = builder_pb2.BuilderID(
        project='dart', bucket='ci', builder=builder_name)
    properties = Struct()
    properties.update({'got_revision': revision})
    if is_bisection:
      properties.update({'bisect_reason': 'failure'})
    status = 'SUCCESS' if is_success else 'FAILURE'
    return build_pb2.Build(
        builder=builder,
        status=status,
        number=build_number,
        output=build_pb2.Build.Output(properties=properties),
    )

  def fetch_previous_builds(self, api, builds, start_number=0):
    name = '%s.%s' % (BisectApi.FIND_BASE_BUILD_STEP_NAME,
                      BisectApi.FETCH_BUILDS_STEP_NAME)
    return api.buildbucket.simulated_search_results(builds, step_name=name)
