# Copyright 2021 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_bloat/bloat.gni")
import("$dir_pw_build/python_action.gni")
import("$dir_pw_build/target_types.gni")

# A convenient template for generating example applications with different
# tls/transport backends.
#
# The template accepts the following arguments:
#
#   tls_backend         Required. A target specifying the tls library.
#
#   transport_backend:  Required. A target specifying the transport implementation.
#
#   no_bloaty:          Whether to generate bloaty size report. Default
#                       to true
#
#   bloaty_config:      An optional config file for bloaty report
#
#   time:               An optional date string to inject as time. If not spedified,
#                       build time will be used. Must be format
#                       month/day/year hour:minute:second
template("tls_client_example") {
  assert(defined(invoker.tls_backend) && invoker.tls_backend != "",
         "must provide a tls backend")
  assert(defined(invoker.transport_backend) && invoker.transport_backend != "",
         "must provide a transport backend")

  example_binary_target_name = target_name + "_binary"
  size_report_target_name = target_name + "_tls_size_report"

  group(target_name) {
    deps = [
      ":$example_binary_target_name",
      ":$size_report_target_name",
    ]
  }

  time_injection_target_name = target_name + "_time_injection"
  time_source_code_output = "$target_gen_dir/$target_name/injected_time.c"
  pw_python_action(time_injection_target_name) {
    script = "//applications/tls_example/time_injection/generate_time_code.py"
    outputs = [ time_source_code_output ]
    args = [ rebase_path(time_source_code_output) ]
    if (defined(invoker.time)) {
      args += [
        "-t",
        invoker.time,
      ]
    }
  }

  executable_exclude_vars = [
    "tls_backend",
    "transport_backend",
    "no_bloaty",
    "bloaty_config",
  ]

  executable_common_vars = {
    forward_variables_from(invoker, "*", executable_exclude_vars)
    if (!defined(sources)) {
      sources = []
    }
    time_source_file = get_target_outputs(":$time_injection_target_name")
    sources += [
      "sysdeps.cc",
      "tls_client_example.cc",
      time_source_file[0],
    ]

    if (!defined(deps)) {
      deps = []
    }
    deps += [
      ":$time_injection_target_name",
      "$dir_pw_log",
      "$dir_pw_spin_delay",
      "$dir_pw_sys_io",
      invoker.transport_backend,
    ]
  }

  # Runnable target
  pw_executable(example_binary_target_name) {
    forward_variables_from(executable_common_vars, "*")
    deps += [ invoker.tls_backend ]
  }

  # Size report target.
  if (!defined(invoker.no_bloaty) || !invoker.no_bloaty) {
    # A similar target but with a noop tls backend for size comparison
    base_target_name = example_binary_target_name + "_without_tls"
    pw_executable(base_target_name) {
      forward_variables_from(executable_common_vars, "*")
      deps += [ "//applications/tls_example/backends/tls/dummy:dummy" ]
    }

    # Bloaty size report.
    pw_size_report(size_report_target_name) {
      title = size_report_target_name
      base = ":$base_target_name"
      full_report = true
      binaries = [
        {
          target = ":$example_binary_target_name"
          label = "$example_binary_target_name"
          if (defined(invoker.bloaty_config)) {
            bloaty_config = invoker.bloaty_config
          }
        },
      ]
    }
  } else {
    group(size_report_target_name) {
    }
  }
}
