# 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",
    ]
  }

  # Target that implements time(time_t*) to provide an injected time.
  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,
      ]
    }
  }

  # Target that provides a set of hardcoded root certificates.
  root_certificates = []
  if (defined(invoker.root_certificates)) {
    root_certificates += invoker.root_certificates
  }

  trust_store_target = target_name + "_trust_store"
  trust_store_code_output = "$target_gen_dir/$target_name/trust_store.cc"
  trust_store_code_path = rebase_path(trust_store_code_output)
  pw_python_action(trust_store_target) {
    script = "//applications/tls_example/trust_store/py" +
             "/trust_store_generation/generate_trust_store.py"
    outputs = [ trust_store_code_output ]
    args = [ trust_store_code_path ]
    foreach(cert, root_certificates) {
      args += [
        "-r",
        rebase_path(cert),
      ]
    }
    python_deps = [ "//applications/tls_example/trust_store/py" ]
  }

  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],
      trust_store_code_path,
    ]

    if (!defined(deps)) {
      deps = []
    }
    deps += [
      ":$time_injection_target_name",
      ":$trust_store_target",
      "$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) {
    }
  }
}
