# Copyright 2026 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/testing/golden_files.gni")
import("//third_party/protobuf/proto_library.gni")

# Compiles a protocol buffer for Python and defines it as a golden checked-in
# file in the source tree.
#
# Parameters (all delegate to proto_library):
#
#   sources (required)
#       List of .proto files.
#
#   import_dirs (optional)
#       Additional import paths for .proto files.
#
template("golden_python_proto") {
  assert(defined(invoker.sources), "sources is a required parameter")

  _proto_name = "${target_name}_proto"

  proto_library(_proto_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "visibility",
                             "testonly",
                           ])
    generate_cc = false
    generate_go = false
    generate_python = true
  }

  _here = rebase_path(".", "//")
  _py_out_dir = "${root_out_dir}/pyproto/${_here}"
  _goldens = []
  _add_copyright_targets = []

  foreach(source, invoker.sources) {
    _name = get_path_info(source, "name")
    _dir = rebase_path(get_path_info(source, "dir"), ".")

    _output = "${_name}_pb2.py"
    _golden_name = "${_name}_pb2_py_diff"

    _golden = "${_dir}/${_output}"
    _candidate = "${_py_out_dir}/${_golden}"
    _copyrighted_candidate = "${target_out_dir}/${_golden}"

    _add_copyright_name = "${_name}_py_add_copyright"
    action(_add_copyright_name) {
      script = "//build/python/add_proto_copyright.py"
      inputs = [
        _candidate,
        source,
      ]
      outputs = [ _copyrighted_candidate ]
      args = [
        rebase_path(_candidate, root_build_dir),
        rebase_path(_copyrighted_candidate, root_build_dir),
        rebase_path(source, root_build_dir),
      ]
      deps = [ ":${_proto_name}" ]
    }

    golden_files(_golden_name) {
      comparisons = [
        {
          golden = _golden
          candidate = _copyrighted_candidate
        },
      ]
      deps = [ ":${_add_copyright_name}" ]
    }
    _goldens += [ ":${_golden_name}" ]
    _add_copyright_targets += [ ":${_add_copyright_name}" ]
  }

  group(target_name) {
    public_deps = [ ":${_proto_name}" ] + _goldens + _add_copyright_targets
  }
}
