# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")

import("$dir_pw_build/input_group.gni")
import("$dir_pw_build/python_action.gni")

# Defines a Python package. GN Python packages contain several GN targets:
#
#   - $name - Provides the Python files in the build, but does not take any
#         actions. All subtargets depend on this target.
#   - $name.lint - Runs static analyis tools on the Python code. This is a group
#     of two subtargets:
#     - $name.lint.mypy - Runs mypy.
#     - $name.lint.pylint - Runs pylint.
#   - $name.tests - Runs all tests for this package.
#   - $name.install - Installs the package in a venv. (Not implemented.)
#   - $name.wheel - Builds a Python wheel for the package. (Not implemented.)
#
# TODO(pwbug/239): Implement installation and wheel building.
#
# Args:
#   setup: List of setup file paths (setup.py or pyproject.toml & setup.cfg),
#       which must all be in the same directory.
#   sources: Python sources files in the package.
#   tests: Test files for this Python package.
#   python_deps: Dependencies on other pw_python_packages in the GN build.
#   other_deps: Dependencies on GN targets that are not pw_python_packages.
#   inputs: Other files to track, such as package_data.
#
template("pw_python_package") {
  if (defined(invoker.sources)) {
    _all_py_files = invoker.sources
  } else {
    _all_py_files = []
  }

  if (defined(invoker.tests)) {
    _test_sources = invoker.tests
  } else {
    _test_sources = []
  }

  _all_py_files += _test_sources

  assert(_all_py_files != [], "At least one source or test must be provided")

  # pw_python_script uses pw_python_package, but with a limited set of features.
  # _pw_standalone signals that this target is actually a pw_python_script.
  _is_package = !(defined(invoker._pw_standalone) && invoker._pw_standalone)

  if (_is_package) {
    assert(defined(invoker.setup) && invoker.setup != [],
           "pw_python_package requires 'setup' to point to a setup.py file " +
               "or pyproject.toml and setup.cfg files")

    _all_py_files += invoker.setup

    # Get the directories of the setup files. All files must be in the same dir.
    _setup_dirs = get_path_info(invoker.setup, "dir")
    _setup_dir = _setup_dirs[0]

    foreach(dir, _setup_dirs) {
      assert(dir == _setup_dir,
             "All files in 'setup' must be in the same directory")
    }

    # If sources are provided, make sure there is an __init__.py file.
    if (defined(invoker.sources)) {
      _found_init_py_in_sources = false
      foreach(source, invoker.sources) {
        if (get_path_info(source, "file") == "__init__.py") {
          _found_init_py_in_sources = true
        }
      }
      assert(_found_init_py_in_sources,
             "Python packages must have at least one __init__.py file")
    }
  }

  _python_deps = []
  if (defined(invoker.python_deps)) {
    foreach(dep, invoker.python_deps) {
      # Use the fully qualified name so the subtarget can be appended as needed.
      _python_deps += [ get_label_info(dep, "label_no_toolchain") ]
    }
  }

  # Declare the main Python package group. This represents the Python files, but
  # does not take any actions. GN targets can depend on the package name to run
  # when any files in the package change.
  pw_input_group(target_name) {
    inputs = _all_py_files
    if (defined(invoker.inputs)) {
      inputs += invoker.inputs
    }

    deps = _python_deps

    if (defined(invoker.other_deps)) {
      deps += invoker.other_deps
    }
  }

  _package_target = ":$target_name"

  if (_is_package) {
    # Install this Python package and its dependencies in the current Python
    # environment.
    pw_python_action("$target_name.install") {
      module = "pip"
      args = [
        "install",
        "--editable",
        rebase_path(_setup_dir),
      ]

      stamp = true

      # Parallel pip installations don't work, so serialize pip invocations.
      pool = "$dir_pw_build:pip_pool"

      deps = [ _package_target ]
      foreach(dep, _python_deps) {
        deps += [ "$dep.install" ]
      }
    }

    # TODO(pwbug/239): Add support for building groups of wheels. The code below
    #     is incomplete and untested.
    pw_python_action("$target_name.wheel") {
      script = "$dir_pw_build/py/pw_build/python_wheels.py"

      args = [
        "--out_dir",
        rebase_path(target_out_dir),
      ]
      args += rebase_path(_all_py_files)

      deps = [ _package_target ]
      stamp = true
    }
  } else {
    # If this is not a package, install or build wheels for its deps only.
    group("$target_name.install") {
      deps = []
      foreach(dep, _python_deps) {
        deps += [ "$dep.install" ]
      }
    }
    group("$target_name.wheel") {
      deps = []
      foreach(dep, _python_deps) {
        deps += [ "$dep.wheel" ]
      }
    }
  }

  # Define the static analysis targets for this package.
  group("$target_name.lint") {
    deps = [
      "$_package_target.lint.mypy",
      "$_package_target.lint.pylint",
    ]
  }

  pw_python_action("$target_name.lint.mypy") {
    module = "mypy"
    args = [
      "--pretty",
      "--show-error-codes",
      "--color-output",
    ]
    if (_is_package) {
      args += [ rebase_path(_setup_dir) ]
    } else {
      args += rebase_path(_all_py_files)
    }

    # Use this environment variable to force mypy to colorize output.
    # See https://github.com/python/mypy/issues/7771
    environment = [ "MYPY_FORCE_COLOR=1" ]

    stamp = true

    deps = [ _package_target ]
    foreach(dep, _python_deps) {
      deps += [ "$dep.lint.mypy" ]
    }
  }

  pw_python_action_foreach("$target_name.lint.pylint") {
    module = "pylint"
    args = [
      "{{source_root_relative_dir}}/{{source_file_part}}",
      "--jobs=1",
      "--output-format=colorized",
    ]

    if (host_os == "win") {
      # Allow CRLF on Windows, in case Git is set to switch line endings.
      args += [ "--disable=unexpected-line-ending-format" ]
    }

    sources = _all_py_files

    stamp = "$target_gen_dir/{{source_target_relative}}.pylint.pw_pystamp"

    # Run pylint from the source root so that pylint detects rcfiles (.pylintrc)
    # in the source tree.
    directory = rebase_path("//")

    deps = [ _package_target ]
    foreach(dep, _python_deps) {
      deps += [ "$dep.lint.pylint" ]
    }
  }

  # Create a target for each test file.
  _test_targets = []

  foreach(test, _test_sources) {
    _test_name = string_replace(test, "/", "_")
    _test_target = "$target_name.tests.$_test_name"

    pw_python_action(_test_target) {
      script = test
      stamp = true

      deps = [ _package_target ]
      foreach(dep, _python_deps) {
        deps += [ "$dep.tests" ]
      }
    }

    _test_targets += [ ":$_test_target" ]
  }

  group("$target_name.tests") {
    deps = _test_targets
  }
}

# Declares a group of Python packages or other Python groups. pw_python_groups
# expose the same set of subtargets as pw_python_package (e.g.
# "$group_name.lint" and "$group_name.tests"), but these apply to all packages
# in deps and their dependencies.
template("pw_python_group") {
  if (defined(invoker.python_deps)) {
    _python_deps = invoker.python_deps
  } else {
    _python_deps = []
  }

  group(target_name) {
    deps = _python_deps
  }

  _subtargets = [
    "tests",
    "lint",
    "lint.mypy",
    "lint.pylint",
    "install",
    "wheel",
  ]

  foreach(subtarget, _subtargets) {
    group("$target_name.$subtarget") {
      deps = []
      foreach(dep, _python_deps) {
        # Split out the toolchain to support deps with a toolchain specified.
        _target = get_label_info(dep, "label_no_toolchain")
        _toolchain = get_label_info(dep, "toolchain")
        deps += [ "$_target.$subtarget($_toolchain)" ]
      }
    }
  }
}

# Declares Python scripts or tests that are not part of a Python package.
# Similar to pw_python_package, but only supports a subset of its features.
#
# pw_python_script accepts the same arguments as pw_python_package, except
# `setup` cannot be provided.
#
# pw_python_script provides the same subtargets as pw_python_package, but
# $target_name.install and $target_name.wheel only affect the python_deps of
# this GN target, not the target itself.
template("pw_python_script") {
  _supported_variables = [
    "sources",
    "tests",
    "python_deps",
    "other_deps",
    "inputs",
  ]

  pw_python_package(target_name) {
    _pw_standalone = true
    forward_variables_from(invoker, _supported_variables)
  }
}
