# Copyright 2018 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.
"""Recipe for checking docs are properly formatted.
Requires topaz source to be present in the manifest.
"""

from recipe_engine.recipe_api import Property

DEPS = [
    'fuchsia/build',
    'fuchsia/checkout',
    'recipe_engine/buildbucket',
    'recipe_engine/context',
    'recipe_engine/file',
    'recipe_engine/path',
    'recipe_engine/platform',
    'recipe_engine/properties',
    'recipe_engine/step',
]

PROPERTIES = {
    'manifest':
        Property(kind=str, help='Jiri manifest to use. Should include //topaz'),
    'remote':
        Property(kind=str, help='Remote manifest repository'),
}


def RunSteps(api, remote, manifest):
  checkout_root_dir = api.path['start_dir']
  checkout = api.checkout.fuchsia_with_options(
      path=checkout_root_dir,
      build=api.buildbucket.build,
      manifest=manifest,
      remote=remote,
  )

  fuchsia_build_dir = checkout_root_dir.join('out', 'default')
  doc_checker_output_path = 'host_x64/dart-tools/doc_checker'
  with api.step.nest('build'):
    gn_results = api.build.gen(
        checkout_root=checkout_root_dir,
        fuchsia_build_dir=fuchsia_build_dir,
        # Target doesn't matter since it's a host-side target
        target='x64',
        build_type='debug',
        packages=['//topaz/packages/tools:doc_checker'],
        # Product doesn't matter; bringup.gni is faster that core.gni
        product='products/bringup.gni',
    )

    api.build.ninja(
        gn_results=gn_results,
        targets=[doc_checker_output_path],
        # Skip building zircon since it is unnecessary
        build_zircon=False,
    )

  doc_checker_path = fuchsia_build_dir.join(doc_checker_output_path)
  with api.context(cwd=checkout.root_dir):
    api.step('doc_check', [doc_checker_path, '--local-links-only'])


def GenTests(api):
  yield (api.test('default_ci') + api.buildbucket.ci_build(
      git_repo='https://fuchsia.googlesource.com/topaz') + api.properties(
          manifest='fuchsia',
          remote='https://fuchsia.googlesource.com/manifest',
      ))
  yield (api.test('default_cq') + api.buildbucket.try_build(
      git_repo='https://fuchsia.googlesource.com/topaz') + api.properties(
          manifest='fuchsia',
          remote='https://fuchsia.googlesource.com/manifest',
      ))
