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

"""Recipe for running Tricium analyzers."""

import functools
import collections

from recipe_engine.post_process import MustRun
from PB.recipes.fuchsia.tricium.tricium import InputProperties

DEPS = [
    "fuchsia/buildbucket_util",
    "fuchsia/git",
    "fuchsia/git_checkout",
    "fuchsia/tricium_analyze",
    "recipe_engine/cipd",
    "recipe_engine/context",
    "recipe_engine/path",
    "recipe_engine/properties",
    "recipe_engine/raw_io",
    "recipe_engine/step",
]

PROPERTIES = InputProperties

# We'll skip running checks on any files for which this git attribute is
# explicitly unset. We *will* run checks on all files for which this attribute
# is unspecified, or explicitly set.
TRICIUM_GIT_ATTR = "tricium"

# Namedtuple to simulate a class generated by jiri checkout because flutter is
# not using jiri.
_CheckoutResult = collections.namedtuple(
    '_CheckoutResult', ['root_dir', 'release_version']
)

REMOTE = 'https://flutter.googlesource.com/recipes'


def RunSteps(api, props):
  with api.context(infra_steps=True):
    checkout_path = api.path['start_dir'].join('recipes')
    api.git_checkout(REMOTE, path=checkout_path)
    # tricium is expecting a dictionary as a checkout.
    checkout = _CheckoutResult(checkout_path, '')

  # If specified, download CIPD packages.
  if props.cipd_packages:
    with api.step.nest("ensure_packages"):
      with api.context(infra_steps=True):
        cipd_dir = api.path['start_dir'].join("cipd")
        pkgs = api.cipd.EnsureFile()
        for package in props.cipd_packages:
          pkgs.add_package(package.name, package.version, subdir=package.subdir)
        api.cipd.ensure(cipd_dir, pkgs)
        api.tricium_analyze.yapf = cipd_dir.join("yapf")

  api.tricium_analyze.check_commit_message()
  with api.context(cwd=checkout_path):
    api.step('git log', ['git', 'log', '--oneline', '-n', '3'])
    paths = api.git.get_changed_files("get changed files")
    api.tricium_analyze.checkout = checkout
    api.tricium_analyze.suggest_fx = False
    api.tricium_analyze(
        paths,
        enabled_analyzers=props.analyses,
        enabled_luci_analyzers=props.luci_analyzers,
    )


def GenTests(api):
  DIFF = """diff --git a/{0} b/{0}
index e684c1e..a76a10e 100644
--- a/{0}
+++ b/{0}
@@ -1,2 +1,4 @@
+  foo
+  bar
"""

  def changed_files_data(files):
    return api.git.get_changed_files("get changed files", files)

  def change_diff_data(filename):
    return api.step_data(
        f"check for inclusivity.get change diff for {filename}",
        api.raw_io.stream_output_text(DIFF.format(filename)),
    )

  def formatted_diff_data(filename):
    return api.step_data(
        f"check for inclusivity.get change diff for {filename}",
        api.raw_io.stream_output_text(DIFF.format(filename)),
    )

  def properties(cipd_packages=(), **kwargs):
    defaults = dict(
        manifest="flower",
        remote="https://fuchsia.googlesource.com/integration",
    )
    # Using CIPD packages implies that we don't need to do a build, and
    # vice versa.
    if cipd_packages:
      defaults["cipd_packages"] = cipd_packages
    defaults.update(kwargs)
    return api.properties(**defaults)

  yield api.test(
      'basic', api.buildbucket_util.test("default", tryjob=True),
      properties(
          analyses=["yapf"],
          cipd_packages=[{
              "name": "fuchsia/go/${platform}",
              "version": "integration",
              "subdir": "go",
          }],
      ), changed_files_data(["engine.py"]), change_diff_data("engine.py"),
      formatted_diff_data("engine.py")
  )
