#
#  Copyright 2021 Google, Inc.
#
#  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:
#
#  http://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.
#

# Generate pybind11 source files + headers
#
# Parameters:
#   include: Base include path (i.e. bt/gd)
#   source_root: Root of source relative to current BUILD.gn
#   sources: PDL files to use for generation.
#   shards [optional]: Shard generated source into N files.
#                      Default = 0. Max = 10.
template("packetgen_py") {
  action_name = "${target_name}_gen"

  all_dependent_config_name = "_${target_name}_all_dependent_config"
  config(all_dependent_config_name) {
    include_dirs = [ "${root_gen_dir}" ]
  }

  action(action_name) {
    forward_variables_from(invoker, [ "sources", "include", "shards", "source_root" ])
    assert(defined(sources), "sources must be set")
    assert(defined(include), "include must be set")
    assert(defined(source_root), "source root must be set")

    outdir = rebase_path(root_gen_dir)
    source_root = rebase_path(source_root)

    # Set shards cmd
    shards_cmd = ""
    outputs = []
    source_args = []
    if (defined(shards)) {
      shards_list = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
      foreach (source, sources) {
        rel_source = rebase_path(source, ".")
        source_args += [ rebase_path(source, source_root) ]
        shards_cmd = "--num_shards=${shards}"

        # TODO - GN reference doesn't explain how to programatically create
        # a range (i.e. range(shards)) so we use a fixed list and foreach loop to
        # work around it.
        assert(shards <= 10, "Maximum supported shards is 10.")
        index = 0
        outputs += [ string_replace("${outdir}/${rel_source}_python3.cc", ".pdl", "") ]
        foreach(num, shards_list) {
          if (index < shards) {
              outputs += [ string_replace("${outdir}/${rel_source}_python3_shard_${num}.cc", ".pdl", "") ]
          }

          index = index + 1
        }
      }
    }

    script = "//common-mk/file_generator_wrapper.py"
    binfile = "${root_out_dir}/bluetooth_packetgen"
    args = [
      binfile,
      "--include=${include}",
      "--out=${outdir}",
      "--source_root=${source_root}",
      shards_cmd,
    ] + source_args
  }

  # TODO: Make building with python-dev work.
  # source_set(target_name) {
  #   sources = get_target_outputs(":${action_name}")
  #   deps = [":${action_name}"]
  #   all_dependent_configs = [":${all_dependent_config_name}"]
  #   if (defined(invoker.all_dependent_configs)) {
  #     all_dependent_configs += invoker.all_dependent_configs
  #   }
  #   if (defined(invoker.configs)) {
  #     configs += invoker.configs
  #   }
  # }
}

# Generate single c++ headers for each pdl
#
# Parameters:
#   include: Base include path (i.e. bt/gd)
#   source_root: Root of source relative to current BUILD.gn
#   sources: PDL files to use for generation.
template("packetgen_headers") {
  all_dependent_config_name = "_${target_name}_all_dependent_config"
  config(all_dependent_config_name) {
    include_dirs = [ "${root_gen_dir}" ]
  }

  action(target_name) {
    forward_variables_from(invoker, [ "include", "sources", "source_root" ])
    assert(defined(sources), "sources must be set")
    assert(defined(include), "include must be set")
    assert(defined(source_root), "source root must be set")

    outdir = rebase_path(root_gen_dir)
    source_root = rebase_path(source_root)

    script = "//common-mk/file_generator_wrapper.py"
    binfile = "${root_out_dir}/bluetooth_packetgen"
    args = [
      binfile,
      "--include=${include}",
      "--out=${outdir}",
      "--source_root=${source_root}",
    ]

    outputs = []
    foreach (source, sources) {
      rel_source = rebase_path(source, ".")
      args += [ rebase_path(source, source_root) ]
      outputs += [ string_replace("${outdir}/${rel_source}.h", ".pdl", "") ]
    }

    all_dependent_configs = [ ":${all_dependent_config_name}" ]
    if (defined(invoker.all_dependent_configs)) {
      all_dependent_configs += invoker.all_dependent_configs
    }

    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
  }
}

# Generate single Rust files for each pdl
#
# Parameters:
#   include: Base include path (i.e. bt/gd)
#   source_root: Root of source relative to current BUILD.gn
#   sources: PDL files to use for generation.
template("packetgen_rust") {
  action_name = "${target_name}_gen"
  all_dependent_config_name = "_${target_name}_all_dependent_config"
  config(all_dependent_config_name) {
    include_dirs = [ "${root_gen_dir}" ]
  }

  action(action_name) {
    forward_variables_from(invoker, [ "include", "sources", "source_root" ])
    assert(defined(sources), "sources must be set")
    assert(defined(include), "include must be set")
    assert(defined(source_root), "source root must be set")

    outdir = rebase_path(root_gen_dir)
    source_root = rebase_path(source_root)

    script = "//common-mk/file_generator_wrapper.py"
    binfile = "${root_out_dir}/bluetooth_packetgen"
    args = [
      binfile,
      "--include=${include}",
      "--out=${outdir}",
      "--source_root=${source_root}",
      "--rust",
    ]

    outputs = []
    foreach (source, sources) {
      rel_source = rebase_path(source, ".")
      args += [ rebase_path(source, source_root) ]
      outputs += [ string_replace("${outdir}/${rel_source}.rs", ".pdl", "") ]
    }
  }

  # TODO: Rust source_set is not supported by gn.
  # source_set(target_name) {
  #   sources = get_target_outputs(":${action_name}")
  #   deps = [ ":${action_name}" ]
  #   all_dependent_configs = [":${all_dependent_config_name}"]
  #   if (defined(invoker.all_dependent_configs)) {
  #     all_dependent_configs += invoker.all_dependent_configs
  #   }
  #   if (defined(invoker.configs)) {
  #     configs += invoker.configs
  #   }
  # }
}
