# Copyright 2021 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.

import copy

from PB.go.chromium.org.luci.buildbucket.proto import common as common_pb2

DEPS = [
    'flutter/shard_util_v2',
    'fuchsia/buildbucket_util',
    'recipe_engine/buildbucket',
    'recipe_engine/path',
    'recipe_engine/platform',
    'recipe_engine/properties',
    'recipe_engine/step',
]


def RunSteps(api):
  build_configs = api.properties.get('builds', [])
  test_configs = api.properties.get('tests', [])
  props = api.shard_util_v2.pre_process_properties(
          {'properties': {
              '$flutter/osx_sdk': '{"cleanup_cache": true, "sdk_version": "14a5294e"}',
              'validation': 'docs'
              }
           }
  )
  assert isinstance(props['properties']['$flutter/osx_sdk'], dict)
  assert props['properties']['validation'] == 'docs'
  with api.step.nest("launch builds") as presentation:
    reqs = api.shard_util_v2.schedule_builds(build_configs, presentation)
  with api.step.nest("collect builds") as presentation:
    builds = api.shard_util_v2.collect(reqs, presentation)
    for build in builds.values():
      if build.build_proto.status != common_pb2.SUCCESS:
        raise api.step.StepFailure("build %s failed" % build.build_id)
    api.shard_util_v2.archive_full_build(api.path['start_dir'].join('out', 'host_debug'), 'host_debug')
    api.shard_util_v2.download_full_builds(builds, api.path['cleanup'].join('out'))
  with api.step.nest("launch builds") as presentation:
    reqs = api.shard_util_v2.schedule_tests(test_configs, builds, presentation)


def GenTests(api):
  try_subbuild1 = api.shard_util_v2.try_build_message(
      build_id=8945511751514863186,
      builder='ios_debug',
      input_props={'task_name': 'mytask'},
      output_props={
          'cas_output_hash': {'web_tests': 'abc', 'ios_debug': 'bcd', 'full_build': '123'}
      },
      status='SUCCESS',
  )
  try_subbuild2 = api.shard_util_v2.try_build_message(
      build_id=8945511751514863187,
      builder='builder-subbuild2',
      output_props={
          'cas_output_hash': {'web_tests': 'abc', 'ios_debug': 'bcd'}
      },
      status='SUCCESS',
  )
  try_failure = api.shard_util_v2.try_build_message(
      build_id=8945511751514863187,
      builder='builder-subbuild2',
      output_props={
          'cas_output_hash': {'web_tests': 'abc', 'ios_debug': 'bcd'}
      },
      status='FAILURE',
  )

  props = {
      'builds': [{
          'name': 'ios_debug', 'gn': [], 'ninja': ['ios_debug'],
          'dimensions': {'cpu': 'arm64'},
          'drone_dimensions': ['dimension1=abc']
      }],
      'tests': [{
          'name': 'felt_test', 'dependencies': ['ios_debug'],
          'scripts': ['out/script.sh'], 'parameters': ['test']
      }],
      'environment': 'Staging',
      'builder_name_suffix': '-try',
      'dependencies': [{'dependency': 'android_sdk'},
                       {'dependency': 'chrome_and_driver'}],
      '$recipe_engine/led': {
          'led_run_id':
              'flutter/led/abc_google.com/b9861e3db1034eee460599837221ab468e03bc43f9fd05684a08157fd646abfc',
          'rbe_cas_input': {
              'cas_instance':
                  'projects/chromium-swarm/instances/default_instance',
              'digest': {
                  'hash':
                      '146d56311043bb141309968d570e23d05a108d13ce2e20b5aeb40a9b95629b3e',
                  'size_bytes':
                      91
              }
          }
      },
  }
  props_bb = {
      'task_name': 'mytask', 'builds': [{
          'name': 'ios_debug', 'gn': ['--ios'],
          'dimensions': {'cpu': 'arm64'},
          'ninja': {'config': 'ios_debug',
                    'targets': []}, 'drone_dimensions': ['dimension1=abc'],
          'generators': [{'name': 'generator1', 'script': 'script1.sh'}]
      }], 'tests': [{
          'name': 'felt_test', 'dependencies': ['ios_debug'],
          'scripts': ['out/script.sh'], 'parameters': ['test']
      }], 'dependencies': [{'dependency': 'android_sdk'},
                           {'dependency': 'chrome_and_driver'}],
      'environment': 'Staging', 'builder_name_suffix': '-try'
  }

  presubmit_props = copy.deepcopy(props)
  presubmit_props['git_url'] = 'http://abc'
  presubmit_props['git_ref'] = 'refs/123/master'
  presubmit_props['builds'][0]['drone_builder_name'] = 'custom drone builder'

  yield api.test(
      'presubmit_led', api.properties(**presubmit_props),
      api.platform.name('linux'),
      api.buildbucket.try_build(
          project='proj',
          builder='try-builder',
          git_repo='https://github.com/repo/a',
          revision='a' * 40,
          build_number=123
      ),
      api.shard_util_v2.child_led_steps(
          subbuilds=[try_subbuild1, try_subbuild2],
          collect_step='collect builds',
      )
  )

  presubmit_props_bb = copy.deepcopy(props_bb)
  presubmit_props_bb['git_url'] = 'http://abc'
  presubmit_props_bb['git_ref'] = 'refs/123/master'
  presubmit_props_bb['builds'][0]['drone_builder_name'] = 'custom drone builder'
  presubmit_props_bb['no_goma'] = 'true'

  yield (
      api.buildbucket_util.test('presubmit_bb', tryjob=True, status='failure') +
      api.properties(**presubmit_props_bb) + api.platform.name('linux') +
      api.shard_util_v2.child_build_steps(
          subbuilds=[try_failure],
          launch_step='launch builds',
          collect_step='collect builds',
      )
  )
