# Copyright 2020 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/target_types.gni")
import("$dir_pw_chrono/backend.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_unit_test/test.gni")

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

pw_source_set("config") {
  sources = [ "public/pw_log_rpc/internal/config.h" ]
  public_configs = [ ":public_include_path" ]
  visibility = [ "./*" ]
  friend = [ "./*" ]
}

pw_source_set("log_config") {
  sources = [ "public/pw_log_rpc/internal/log_config.h" ]
  public_configs = [ ":public_include_path" ]
  public_deps = [ ":config" ]
  visibility = [ "./*" ]
  friend = [ "./*" ]
}

pw_source_set("log_service") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_log_rpc/log_service.h" ]
  sources = [ "log_service.cc" ]
  deps = [
    ":log_config",
    "$dir_pw_log",
    "$dir_pw_log:protos.pwpb",
  ]
  public_deps = [
    ":rpc_log_drain",
    "$dir_pw_log:protos.raw_rpc",
  ]
}

pw_source_set("log_filter_service") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_log_rpc/log_filter_service.h" ]
  sources = [ "log_filter_service.cc" ]
  deps = [
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_protobuf",
  ]
  public_deps = [
    ":log_filter",
    "$dir_pw_log:protos.raw_rpc",
    "$dir_pw_protobuf:bytes_utils",
  ]
}

pw_source_set("log_filter") {
  public_configs = [ ":public_include_path" ]
  public = [
    "public/pw_log_rpc/log_filter.h",
    "public/pw_log_rpc/log_filter_map.h",
  ]
  sources = [ "log_filter.cc" ]
  deps = [
    "$dir_pw_log",
    "$dir_pw_protobuf",
  ]
  public_deps = [
    ":config",
    "$dir_pw_assert",
    "$dir_pw_bytes",
    "$dir_pw_containers:vector",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_protobuf",
    "$dir_pw_status",
  ]
}

pw_source_set("rpc_log_drain") {
  public_configs = [ ":public_include_path" ]
  public = [
    "public/pw_log_rpc/rpc_log_drain.h",
    "public/pw_log_rpc/rpc_log_drain_map.h",
  ]
  sources = [ "rpc_log_drain.cc" ]
  public_deps = [
    ":config",
    ":log_filter",
    "$dir_pw_assert",
    "$dir_pw_chrono:system_clock",
    "$dir_pw_function",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_log:protos.raw_rpc",
    "$dir_pw_multisink",
    "$dir_pw_protobuf",
    "$dir_pw_result",
    "$dir_pw_status",
    "$dir_pw_sync:lock_annotations",
    "$dir_pw_sync:mutex",
  ]
}

pw_source_set("rpc_log_drain_thread") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_log_rpc/rpc_log_drain_thread.h" ]
  public_deps = [
    ":log_service",
    ":rpc_log_drain",
    "$dir_pw_chrono:system_clock",
    "$dir_pw_multisink",
    "$dir_pw_result",
    "$dir_pw_rpc/raw:server_api",
    "$dir_pw_status",
    "$dir_pw_sync:timed_thread_notification",
    "$dir_pw_thread:thread",
  ]
}

pw_source_set("test_utils") {
  public_deps = [
    "$dir_pw_bytes",
    "$dir_pw_containers:vector",
    "$dir_pw_log_tokenized:metadata",
    "$dir_pw_protobuf",
    "$dir_pw_unit_test",
  ]
  deps = [
    "$dir_pw_log",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_protobuf:bytes_utils",
  ]
  public = [ "pw_log_rpc_private/test_utils.h" ]
  sources = [ "test_utils.cc" ]
  visibility = [ ":*" ]
}

pw_test("log_service_test") {
  enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != ""
  sources = [ "log_service_test.cc" ]
  deps = [
    ":log_filter",
    ":log_service",
    ":test_utils",
    "$dir_pw_containers:vector",
    "$dir_pw_log",
    "$dir_pw_log:proto_utils",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_log_tokenized:metadata",
    "$dir_pw_protobuf",
    "$dir_pw_protobuf:bytes_utils",
    "$dir_pw_result",
    "$dir_pw_rpc/raw:test_method_context",
    "$dir_pw_status",
  ]
}

pw_test("log_filter_service_test") {
  sources = [ "log_filter_service_test.cc" ]
  deps = [
    ":log_filter",
    ":log_filter_service",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_protobuf",
    "$dir_pw_protobuf:bytes_utils",
    "$dir_pw_result",
    "$dir_pw_rpc/raw:test_method_context",
    "$dir_pw_status",
  ]
}

pw_test("log_filter_test") {
  sources = [ "log_filter_test.cc" ]
  deps = [
    ":log_filter",
    "$dir_pw_log:proto_utils",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_log_tokenized:metadata",
    "$dir_pw_result",
    "$dir_pw_status",
  ]
}

pw_test("rpc_log_drain_test") {
  enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != ""
  sources = [ "rpc_log_drain_test.cc" ]
  deps = [
    ":log_filter",
    ":log_service",
    ":rpc_log_drain",
    ":test_utils",
    "$dir_pw_bytes",
    "$dir_pw_log:proto_utils",
    "$dir_pw_log:protos.pwpb",
    "$dir_pw_log_tokenized:metadata",
    "$dir_pw_multisink",
    "$dir_pw_protobuf",
    "$dir_pw_rpc:common",
    "$dir_pw_rpc/raw:fake_channel_output",
    "$dir_pw_rpc/raw:server_api",
    "$dir_pw_rpc/raw:test_method_context",
    "$dir_pw_status",
    "$dir_pw_sync:mutex",
  ]
}

# TODO(cachinchilla): update docs.
pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}

pw_test_group("tests") {
  tests = [
    ":log_filter_test",
    ":log_filter_service_test",
    ":log_service_test",
    ":rpc_log_drain_test",
  ]
}
