# Copyright 2021 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//third_party/grpc/grpc_library.gni")
import("//third_party/protobuf/proto_library.gni")

# NOTE: Our local lite versions of the builtin protos have to retain their
# "google/protobuf" path in order to generate certain correct symbols.  However,
# this leads to include confusion with the default committed full versions.  The
# work-around is to force an extra include path to reach our local compiled
# versions.
config("force_local_well_known_protos") {
  include_dirs = [ "$target_gen_dir" ]
}

proto_library("base_protos") {
  generate_python = false
  proto_in_dir = "//third_party/protobuf/src"
  proto_out_dir = rebase_path(".", "//")
  sources = [ "//third_party/protobuf/src/google/protobuf/duration.proto" ]
  cc_generator_options = "lite"
  extra_configs = [ ":force_local_well_known_protos" ]
}

template("cast_core_proto_library_base") {
  target(invoker.target_type, target_name) {
    proto_in_dir = "//" + rebase_path("../../..", "//")
    generate_python = false

    # NOTE: For using built-in proto files like empty.proto.
    import_dirs = [ "//third_party/protobuf/src" ]

    forward_variables_from(invoker,
                           [
                             "deps",
                             "sources",
                           ])
    if (!defined(deps)) {
      deps = []
    }
    deps += [ ":base_protos" ]
    extra_configs = [ ":force_local_well_known_protos" ]
  }
}

# For .proto files without RPC definitions.
template("cast_core_proto_library") {
  cast_core_proto_library_base(target_name) {
    target_type = "proto_library"
    forward_variables_from(invoker,
                           [
                             "deps",
                             "sources",
                           ])
  }
}

# For .proto files with RPC definitions.
template("cast_core_grpc_library") {
  cast_core_proto_library_base(target_name) {
    target_type = "grpc_library"
    forward_variables_from(invoker,
                           [
                             "deps",
                             "sources",
                           ])
  }
}

group("api") {
  public_deps = [
    ":api_bindings_proto",
    ":application_config_proto",
    ":cast_audio_channel_service_proto",
    ":cast_core_service_proto",
    ":cast_message_proto",
    ":core_application_service_proto",
    ":message_channel_proto",
    ":metrics_recorder_proto",
    ":platform_service_proto",
    ":runtime_application_service_proto",
    ":runtime_message_port_application_service_proto",
    ":runtime_metadata_proto",
    ":runtime_service_proto",
    ":service_info_proto",
    ":url_rewrite_proto",
  ]
}

cast_core_proto_library("api_bindings_proto") {
  sources = [ "bindings/api_bindings.proto" ]
  deps = [ ":message_channel_proto" ]
}

cast_core_proto_library("application_config_proto") {
  sources = [ "common/application_config.proto" ]
}

cast_core_proto_library("runtime_metadata_proto") {
  sources = [ "common/runtime_metadata.proto" ]
}

cast_core_proto_library("service_info_proto") {
  sources = [ "common/service_info.proto" ]
}

cast_core_grpc_library("cast_core_service_proto") {
  sources = [ "core/cast_core_service.proto" ]
  deps = [ ":runtime_metadata_proto" ]
}

cast_core_grpc_library("platform_service_proto") {
  sources = [ "platform/platform_service.proto" ]
  deps = [ ":service_info_proto" ]
}

cast_core_grpc_library("cast_audio_channel_service_proto") {
  sources = [ "runtime/cast_audio_channel_service.proto" ]
}

cast_core_grpc_library("runtime_service_proto") {
  sources = [ "runtime/runtime_service.proto" ]
  deps = [
    ":application_config_proto",
    ":service_info_proto",
    ":url_rewrite_proto",
  ]
}

cast_core_proto_library("cast_message_proto") {
  sources = [ "v2/cast_message.proto" ]
}

cast_core_grpc_library("core_application_service_proto") {
  sources = [ "v2/core_application_service.proto" ]
  deps = [
    ":api_bindings_proto",
    ":application_config_proto",
    ":cast_message_proto",
    ":message_channel_proto",
    ":service_info_proto",
    ":url_rewrite_proto",
  ]
}

cast_core_grpc_library("runtime_application_service_proto") {
  sources = [ "v2/runtime_application_service.proto" ]
  deps = [
    ":cast_message_proto",
    ":message_channel_proto",
    ":url_rewrite_proto",
  ]
}

cast_core_grpc_library("runtime_message_port_application_service_proto") {
  sources = [ "v2/runtime_message_port_application_service.proto" ]
  deps = [ ":message_channel_proto" ]
}

cast_core_proto_library("url_rewrite_proto") {
  sources = [ "v2/url_rewrite.proto" ]
}

cast_core_proto_library("message_channel_proto") {
  sources = [ "web/message_channel.proto" ]
}

cast_core_grpc_library("metrics_recorder_proto") {
  sources = [ "metrics/metrics_recorder.proto" ]
}
