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