# 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 += [
      dir_pw_span,
      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" ]
    }

    # 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) {
    }
  }
}
