// Copyright 2022 The Android Open Source Project
//
// 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
//
//      http://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.

package {
    default_visibility: [
        "//tools/netsim:__subpackages__",
        "//device/google/cuttlefish/build:__subpackages__",
    ],
    default_applicable_licenses: ["tools_netsim_license"],
}

// Added automatically by a large-scale-change
// See: http://go/android-license-faq
license {
    name: "tools_netsim_license",
    visibility: [":__subpackages__"],
    license_kinds: [
        "SPDX-license-identifier-Apache-2.0",
    ],
    license_text: [
        "LICENSE",
    ],
}

cc_defaults {
    name: "netsim_defaults",
    cflags: [
        "-Wno-unused-parameter",
        "-g", // Produce debugging information.
    ],
    ldflags: ["-rdynamic"], // Allow obtaining backtraces for debugging.
    local_include_dirs: [
        "src",
    ],
    shared_libs: [
        "libgrpc++",
        "libprotobuf-cpp-full",
    ],
    generated_headers: [
        "FrontendStub_h",
    ],
    generated_sources: [
        "FrontendStub_cc",
    ],
}

rust_defaults {
    name: "libnetsim_daemon_defaults",
    features: ["cuttlefish"],
    rlibs: [
        "libbytes",
        "libclap",
        "libcxx",
        "libanyhow",
        "libdata_encoding",
        "libfutures",
        "libfutures_channel",
        "libfutures_executor",
        "libfutures_util",
        "libglam",
        "libgrpcio",
        "libnetsim_proto",
        "libhttp",
        "libnetsim_common",
        "libpdl_runtime",
        "libpica",
        "libprotobuf",
        "libprotobuf_json_mapping",
        "librand",
        "libregex",
        "libserde",
        "libserde_json",
        "libthiserror",
        "libtokio",
        "libtokio_stream",
        "libtungstenite",
        "liblazy_static",
        "liblog_rust",
        "libopenssl",
    ],
    static_libs: ["libgrpc_wrap"],
    srcs: [
        "rust/daemon/src/lib.rs",
        ":netsim_netlink_rust_gen",
        ":netsim_mac80211_hwsim_rust_gen",
        ":netsim_ieee80211_rust_gen",
        ":rootcanal_link_layer_packets_rust_gen",
    ],
}

rust_ffi_host_static {
    name: "libnetsim_daemon",
    crate_name: "netsim_daemon",
    defaults: ["libnetsim_daemon_defaults"],
}

rust_test_host {
    name: "libnetsim_daemon_tests",
    defaults: ["libnetsim_daemon_defaults"],
    test_suites: ["general_tests"],
}

genrule {
    name: "netsim_daemon_cc",
    tools: ["cxxbridge"],
    cmd: "$(location cxxbridge) $(in) --cfg feature=\\\"cuttlefish\\\" >> $(out)",
    srcs: ["rust/daemon/src/ffi.rs"],
    out: ["netsim-daemon/src/ffi.rs.cc"],
}

genrule {
    name: "netsim_daemon_h",
    tools: ["cxxbridge"],
    cmd: "$(location cxxbridge) $(in) --cfg feature=\\\"cuttlefish\\\" --header >> $(out)",
    srcs: ["rust/daemon/src/ffi.rs"],
    out: ["netsim-daemon/src/ffi.rs.h"],
}

genrule {
    name: "netsim_cli_cc",
    tools: ["cxxbridge"],
    cmd: "$(location cxxbridge) $(in) >> $(out)",
    srcs: ["rust/cli/src/ffi.rs"],
    out: ["netsim-cli/src/ffi.rs.cc"],
}

genrule {
    name: "netsim_cli_h",
    tools: ["cxxbridge"],
    cmd: "$(location cxxbridge) $(in) --header >> $(out)",
    srcs: ["rust/cli/src/ffi.rs"],
    out: ["netsim-cli/src/ffi.rs.h"],
}

genrule {
    name: "netsim_netlink_rust_gen",
    defaults: ["pdl_rust_generator_defaults"],
    srcs: ["pdl/netlink.pdl"],
    out: ["netlink_packets.rs"],
}

genrule {
    name: "netsim_mac80211_hwsim_rust_gen",
    defaults: ["pdl_rust_generator_defaults"],
    srcs: ["pdl/mac80211_hwsim.pdl"],
    out: ["mac80211_hwsim_packets.rs"],
}

genrule {
    name: "netsim_ieee80211_rust_gen",
    defaults: ["pdl_rust_generator_defaults"],
    srcs: ["pdl/ieee80211.pdl"],
    out: ["ieee80211_packets.rs"],
}

cc_library_host_static {
    name: "lib-netsim",
    defaults: ["netsim_defaults"],
    srcs: [
        "src/core/server.cc",
        "src/frontend/frontend_client_stub.cc",
        "src/frontend/frontend_server.cc",
        "src/backend/grpc_server.cc",
        "src/backend/grpc_client.cc",
        "src/hci/bluetooth_facade.cc",
        "src/hci/hci_packet_transport.cc",
        "src/hci/rust_device.cc",
        "src/util/crash_report.cc",
        "src/util/ini_file.cc",
        "src/util/log.cc",
        "src/util/os_utils.cc",
        "src/util/string_utils.cc",
        "src/wifi/wifi_facade.cc",
    ],
    generated_headers: [
        "cxx-bridge-header",
        "netsim_daemon_h",
        "PacketStreamerStub_h",
    ],
    generated_sources: [
        "netsim_daemon_cc",
        "PacketStreamerStub_cc",
    ],
    shared_libs: [
        "libbase",
        "libgrpc++",
        "libcrypto",
        "libunwindstack",
    ],
    static_libs: [
        "breakpad_client",
        "libjsoncpp",
        "libprotobuf-cpp-full",
        "libscriptedbeaconpayload-protos-lite",
        "lib-netsimd-proto",
    ],
    whole_static_libs: [
        "libbt-rootcanal",
    ],
}

netsim_ui_modules = [
    "netsim_ui_index.html",
    "netsim_ui_js_cube-sprite.js",
    "netsim_ui_js_customize-map-button.js",
    "netsim_ui_js_device-dragzone.js",
    "netsim_ui_js_device-dropzone.js",
    "netsim_ui_js_device-info.js",
    "netsim_ui_js_device-list.js",
    "netsim_ui_js_device-map.js",
    "netsim_ui_js_device-observer.js",
    "netsim_ui_js_license-info.js",
    "netsim_ui_js_navigation-bar.js",
    "netsim_ui_js_netsim-app.js",
    "netsim_ui_js_packet-info.js",
    "netsim_ui_js_pyramid-sprite.js",
    "netsim_ui_tslib",
    "netsim_ui_assets_grid-background.svg",
    "netsim_ui_assets_hexagonal-background.png",
    "netsim_ui_assets_netsim-logo-b.svg",
    "netsim_ui_assets_netsim-logo.svg",
    "netsim_ui_assets_polar-background.svg",
]

cc_binary_host {
    name: "netsimd",
    defaults: ["netsim_defaults"],
    srcs: [
        "rust/netsimd.cc",
    ],
    generated_headers: [
        "cxx-bridge-header",
        "netsim_daemon_h",
    ],
    shared_libs: [
        "libbase",
        "libgrpc++",
        "libcap",
        "libcrypto",
        "libssl",
        "libunwindstack",
        "libz", // TODO: Remove for native rust binary
    ],
    static_libs: [
        "breakpad_client",
        "libprotobuf-cpp-full",
        "libscriptedbeaconpayload-protos-lite", // TODO: Remove this after using pdl library.
        "lib-netsimd-proto",
        "lib-netsim",
        "lib-netsim-frontend-proto",
        "libgrpc_wrap",
        "librootcanal_rs",
    ],
    whole_static_libs: [
        "libnetsim_daemon",
        "libbt-rootcanal",
    ],
    ldflags: ["-Wl,--allow-multiple-definition"],
    required: netsim_ui_modules,
    strip: {
        keep_symbols_and_debug_frame: true,
    },
}

cc_test_host {
    name: "netsim-test",
    defaults: ["netsim_defaults"],
    srcs: [
        "src/util/ini_file_test.cc",
        "src/util/os_utils_test.cc",
        "src/util/string_utils_test.cc",
    ],
    generated_headers: [
        "cxx-bridge-header",
        "netsim_daemon_h",
    ],
    shared_libs: [
        "libgrpc++",
        "libcrypto",
        "libbase",
        "libunwindstack",
        "libssl",
        "libz", // TODO: Remove for native rust binary
    ],
    static_libs: [
        "breakpad_client",
        "libgrpc_wrap",
        "libjsoncpp",
        "libprotobuf-cpp-full",
        "libscriptedbeaconpayload-protos-lite", // TODO: Remove this after using pdl library.
        "lib-netsim-frontend-proto",
        "lib-netsim",
        "lib-netsimd-proto",
        "librootcanal_rs",
    ],
    whole_static_libs: [
        "libnetsim_daemon",
        "libbt-rootcanal",
    ],
    ldflags: ["-Wl,--allow-multiple-definition"],
}

rust_library_host {
    name: "libnetsim_proto",
    features: ["cuttlefish"],
    crate_name: "netsim_proto",
    srcs: ["rust/proto/src/lib.rs"],
    rustlibs: [
        "libprotobuf",
        "libgrpcio",
    ],
}

rust_defaults {
    name: "libnetsim_common_defaults",
    srcs: ["rust/common/src/lib.rs"],
    rustlibs: [
        "libanyhow",
        "libchrono",
        "librand",
        "liblibc",
        "liblog_rust",
        "libenv_logger",
        "libzip",
    ],
}

rust_library_host {
    name: "libnetsim_common",
    crate_name: "netsim_common",
    defaults: ["libnetsim_common_defaults"],
}

rust_test_host {
    name: "libnetsim_common_inline_tests",
    defaults: ["libnetsim_common_defaults"],
    test_suites: ["general_tests"],
}

cc_library_host_static {
    name: "lib-netsim-frontend-client",
    defaults: ["netsim_defaults"],
    srcs: [
        "src/frontend/frontend_client.cc",
        "src/util/ini_file.cc",
        "src/util/log.cc",
        "src/util/os_utils.cc",
        "src/util/string_utils.cc",
    ],
    generated_headers: [
        "cxx-bridge-header",
        "netsim_cli_h",
    ],
    shared_libs: ["libgrpc++"],
    generated_sources: ["netsim_cli_cc"],
    static_libs: [
        "libprotobuf-cpp-full",
        "lib-netsim-frontend-proto",
    ],
}

rust_defaults {
    name: "netsim_cli_defaults",
    rustlibs: [
        "libclap",
        "libcxx",
        "libhex",
        "libnetsim_common",
        "libnetsim_proto",
        "libprotobuf",
        "libtracing",
    ],
}

rust_defaults {
    name: "netsim_cli_cc_defaults",
    shared_libs: ["libgrpc++"],
    static_libs: [
        "lib-netsim-frontend-client",
        "lib-netsim-frontend-proto",
        "libprotobuf-cpp-full",
    ],
}

rust_test_host {
    name: "libnetsim_cli_tests",
    srcs: ["rust/cli/src/lib.rs"],
    defaults: ["netsim_cli_defaults"],
    test_suites: ["general_tests"],
}

rust_library_host {
    name: "libnetsim_cli",
    crate_name: "netsim_cli",
    srcs: ["rust/cli/src/lib.rs"],
    defaults: [
        "netsim_cli_defaults",
        "netsim_cli_cc_defaults",
    ],
}

rust_binary_host {
    name: "netsim",
    srcs: ["rust/cli/bin/netsim.rs"],
    rustlibs: [
        "libnetsim_cli",
    ],
}

rust_binary_host {
    name: "netsim_test_client",
    srcs: ["rust/frontend/src/netsim_test_client.rs"],
    rustlibs: [
        "libgrpcio",
        "libnetsim_proto",
        "libprotobuf",
        "libnetsim_common",
    ],
}

rust_binary_host {
    name: "netsim_test_server",
    srcs: ["rust/frontend/src/netsim_test_server.rs"],
    rustlibs: [
        "libgrpcio",
        "libnetsim_proto",
        "libprotobuf",
        "libnetsim_common",
        "libfutures",
    ],
}