# 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_build/module_config.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_protobuf_compiler/proto.gni")
import("$dir_pw_third_party/nanopb/nanopb.gni")
import("$dir_pw_third_party/protobuf/protobuf.gni")
import("$dir_pw_thread/backend.gni")
import("$dir_pw_unit_test/test.gni")

declare_args() {
  # The build target that overrides the default configuration options for this
  # module. This should point to a source set that provides defines through a
  # public config (which may -include a file or add defines directly).
  pw_software_update_CONFIG = pw_build_DEFAULT_MODULE_CONFIG
}

config("public_include_path") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

pw_source_set("config") {
  public = [ "public/pw_software_update/config.h" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [ pw_software_update_CONFIG ]
}

if (dir_pw_third_party_protobuf != "") {
  pw_proto_library("protos") {
    deps = [
      "$dir_pw_protobuf:common_protos",
      "$dir_pw_third_party/protobuf:wellknown_types",
      "$dir_pw_tokenizer:proto",
    ]
    sources = [
      "bundled_update.proto",
      "tuf.proto",
      "update_bundle.proto",
    ]
    inputs = [ "bundled_update.options" ]
    prefix = "pw_software_update"
    python_package = "py"
  }
} else {
  # placeholder target to allow py package to build
  pw_proto_library("protos") {
    deps = [
      "$dir_pw_protobuf:common_protos",
      "$dir_pw_tokenizer:proto",
    ]
    sources = [
      "bundled_update.proto",
      "tuf.proto",
      "update_bundle.proto",
    ]
    inputs = [ "bundled_update.options" ]
    prefix = "pw_software_update"
    python_package = "py"
  }
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}

pw_source_set("update_bundle") {
  public_configs = [ ":public_include_path" ]
  public_deps = [
    dir_pw_blob_store,
    dir_pw_kvs,
    dir_pw_protobuf,
    dir_pw_result,
    dir_pw_status,
    dir_pw_stream,
  ]
  public = [
    "public/pw_software_update/bundled_update_backend.h",
    "public/pw_software_update/manifest_accessor.h",
    "public/pw_software_update/update_bundle_accessor.h",
  ]
  deps = [
    ":config",
    ":protos.pwpb",
    dir_pw_log,
  ]
  sources = [ "update_bundle_accessor.cc" ]
}

if (dir_pw_third_party_nanopb != "" && dir_pw_third_party_protobuf != "") {
  pw_source_set("bundled_update_service") {
    public_configs = [ ":public_include_path" ]
    public_deps = [
      ":protos.nanopb_rpc",
      ":update_bundle",
      dir_pw_result,
      dir_pw_status,
      dir_pw_work_queue,
    ]
    deps = [
      ":config",
      ":protos.pwpb",
      "$dir_pw_sync:lock_annotations",
      "$dir_pw_sync:mutex",
      dir_pw_log,
      dir_pw_string,
      dir_pw_tokenizer,
    ]
    public = [ "public/pw_software_update/bundled_update_service.h" ]
    sources = [ "bundled_update_service.cc" ]
  }
} else {
  group("bundled_update_service") {
  }
}

pw_python_action("generate_test_bundle") {
  header_output = "$target_gen_dir/$target_name/test_bundles.h"
  script = "py/pw_software_update/generate_test_bundle.py"
  python_deps = [
    ":protos.python",
    "py",
  ]
  outputs = [ header_output ]
  args = [ rebase_path(header_output) ]
}

config("generated_test_bundle_include") {
  _generated_outputs = get_target_outputs(":generate_test_bundle")
  include_dirs = [ get_path_info(_generated_outputs[0], "dir") ]
}

pw_test("update_bundle_test") {
  enable_if =
      dir_pw_third_party_nanopb != "" && dir_pw_third_party_protobuf != "" &&
      pw_thread_THREAD_BACKEND != ""
  sources = [ "update_bundle_test.cc" ]
  public_deps = [
    ":bundled_update_service",
    ":generate_test_bundle",
    ":update_bundle",
    "$dir_pw_kvs:fake_flash",
    "$dir_pw_kvs:fake_flash_test_key_value_store",
  ]
  configs = [ ":generated_test_bundle_include" ]
}

pw_test_group("tests") {
  tests = [
    ":update_bundle_test",
    ":bundled_update_service_test",
  ]
}

pw_test("bundled_update_service_test") {
  enable_if =
      dir_pw_third_party_nanopb != "" && dir_pw_third_party_protobuf != "" &&
      pw_thread_THREAD_BACKEND != ""
  sources = [ "bundled_update_service_test.cc" ]
  public_deps = [ ":bundled_update_service" ]
}
