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

import("//build/python/python_validator.gni")

# Defines a Python binary.
#
# Example
#
# ```
# python_binary("main") {
#   main_source = "main.py"
#   main_callable = "main"
#   sources = [
#     "foo.py",
#     "bar.py",
#   ]
#   output_name = "main.pyz"
#   deps = [ "//path/to/lib" ]
# }
# ```
#
# Parameters
#
#   main_source (required)
#     Source file including the entry callable for this binary.
#     This file will typically contain
#     ```
#     if __name__ == "__main__":
#       main()
#     ```
#     Type: path
#
#   main_callable (optional)
#     Main callable, which serves as the entry point of the output zip archive.
#     In the example above, this is "main".
#     Type: string
#     Default: main
#
#   output_name (optional)
#     Name of the output Python zip archive, must have .pyz as extension.
#     Type: string
#     Default: ${target_name}.pyz
#
#   data_sources (optional)
#     List of data sources for this python binary. The sources are accessible
#     at runtime as below:
#     ```python
#     from importlib.resources import files
#     import <data_package_name>
#
#     with files(<data_package_name>).joinpath(<source_name>).open("rb"):
#       ...
#     ```
#     Type: list(path)
#
#   data_package_name (required if |data_sources| is provided, else optional)
#     Name of the data package to store |data_sources| in.
#     See "data_sources" above for more detail.
#     Type: string
#
#   enable_mypy (optional)
#     If true, enable MyPy type checking on the target and respective deps.
#     Type: boolean
#     Default: true
#
#   unbuffered_output (optional)
#     If true, run the Python interpreter in unbuffered mode (-u) by default.
#     WARNING: This only affects running the output as a binary without
#     specifying an interpreter (./foo.pyz, not python3 foo.pyz).
#     Type: boolean
#     Default: False
#
#   sources
#   deps
#   visibility
#   testonly
template("python_binary") {
  assert(defined(invoker.main_source), "main_source is required")

  # Enable mypy checks by default
  if (!(defined(invoker.enable_mypy) && !invoker.enable_mypy)) {
    mypy_checker = "${target_name}_mypy_checker"
  }

  _library_infos_target = "${target_name}.library_infos"
  _library_infos_json = "${target_gen_dir}/${target_name}.library_infos.json"
  generated_file(_library_infos_target) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]

    if (defined(invoker.deps)) {
      # Ensure dependent action() sees these dependencies as well.
      public_deps = invoker.deps
    }

    outputs = [ _library_infos_json ]
    output_conversion = "json"
    data_keys = [ "library_info" ]
    walk_keys = [ "library_info_barrier" ]
  }

  _data_sources = []
  if (defined(invoker.data_sources)) {
    assert(defined(invoker.data_package_name),
           "data_package_name is required if data_sources are provided")
    _data_sources = invoker.data_sources
  }

  _all_sources = [ invoker.main_source ]
  if (defined(invoker.sources)) {
    _all_sources += invoker.sources
  }

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    sources = _all_sources
    inputs = [ _library_infos_json ] + _data_sources

    # Note that this inherits invoker.deps, which is important for the case
    # where main_source is generated by one of them.
    deps = [ ":${_library_infos_target}" ]

    # Output must be a .pyz, so our build knows to use a vendored Python
    # interpreter to run them.
    #
    # Output a single .pyz file makes the output deterministic, otherwise we'd
    # have to list out all the library sources that will be copied to output
    # directory, which is not possible because they are not known until the
    # generated JSON file is parsed at build time.
    _output = "${target_out_dir}/${target_name}.pyz"
    if (defined(invoker.output_name)) {
      assert(get_path_info(invoker.output_name, "extension") == "pyz",
             "output_name must have .pyz as extension")
      _output = "${target_out_dir}/${invoker.output_name}"
    }
    outputs = [ _output ]

    _main_callable = "main"
    if (defined(invoker.main_callable)) {
      _main_callable = invoker.main_callable
    }

    inputs += [
      "//build/python/mypy_checker.py",
      "//pyproject.toml",
    ]
    script = "//build/python/package_python_binary.py"
    depfile = "${target_out_dir}/${target_name}.d"
    args = [ "--sources" ] + rebase_path(sources, root_build_dir) + [
             "--target_name",
             target_name,
             "--main_source",
             rebase_path(invoker.main_source, root_build_dir),
             "--main_callable",
             _main_callable,
             "--library_infos",
             rebase_path(_library_infos_json, root_build_dir),
             "--data_sources",
           ] + rebase_path(_data_sources, root_build_dir) +
           [
             "--depfile",
             rebase_path(depfile, root_build_dir),
             "--gen_dir",
             rebase_path(target_gen_dir, root_build_dir),
             "--output",
             rebase_path(_output, root_build_dir),
           ]
    if (defined(invoker.data_package_name)) {
      args += [
        "--data_package_name",
        invoker.data_package_name,
      ]
    }
    if (defined(invoker.unbuffered_output) && invoker.unbuffered_output) {
      args += [ "--unbuffered" ]
    }
    if (defined(mypy_checker)) {
      validations = [ ":${mypy_checker}" ]
    }
    metadata = {
      # Ensure validation dependencies are excluded from metadata walk!
      # TODO(https://fxbug.dev/517150685): Remove this once new GN binary has rolled.
      library_info_barrier = deps
    }
  }

  if (defined(mypy_checker)) {
    _main_target = target_name

    validate_python_binary(mypy_checker) {
      forward_variables_from(invoker,
                             [
                               "assert_no_deps",
                               "data_package_name",
                               "deps",
                               "testonly",
                             ])
      visibility = [ ":${_main_target}" ]

      sources = _all_sources
      library_infos = ":${_library_infos_target}"

      data_sources = _data_sources
    }
  }
}
