# 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.

load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
load("@npm//@bazel/concatjs:index.bzl", "karma_web_test")
load("@npm//@bazel/esbuild:index.bzl", "esbuild")
load("@npm//@bazel/typescript:index.bzl", "ts_library", "ts_project")
load("@npm//http-server:index.bzl", "http_server")
load("//pw_protobuf_compiler/ts:ts_proto_collection.bzl", "ts_proto_collection")
load("@rules_proto_grpc//js:defs.bzl", "js_proto_library")

package(default_visibility = ["//visibility:public"])

filegroup(
    name = "echo_service",
    srcs = [
        "@//pw_rpc:echo",
    ],
)

proto_library(
    name = "rpc_protos",
    srcs = [
        ":echo_service",
    ],
)

js_proto_library(
    name = "rpc_protos_tspb",
    protos = [":rpc_protos"],
)

ts_proto_collection(
    name = "web_proto_collection",
    js_proto_library = "@//pw_web_ui:rpc_protos_tspb",
    proto_library = "@//pw_web_ui:rpc_protos",
)

ts_project(
    name = "lib",
    srcs = [
        "index.ts",
        "src/frontend/app.tsx",
        "src/frontend/index.tsx",
        "src/frontend/log.tsx",
        "src/frontend/serial_log.tsx",
        "src/transport/device_transport.ts",
        "src/transport/serial_mock.ts",
        "src/transport/web_serial_transport.ts",
        "types/serial.d.ts",
    ],
    declaration = True,
    source_map = True,
    deps = [
        ":web_proto_collection",
        "//pw_hdlc/ts:pw_hdlc",
        "//pw_rpc/ts:pw_rpc",
        "//pw_status/ts:pw_status",
        "@npm//:node_modules",
    ],  # can't use fine-grained deps
)

js_library(
    name = "pw_web_ui",
    package_name = "@pigweed/pw_web_ui",
    srcs = ["package.json"],
    deps = [":lib"],
)

ts_library(
    name = "web_ui_test_lib",
    srcs = [
        "src/transport/web_serial_transport_test.ts",
    ],
    deps = [
        ":lib",
        "@npm//rxjs",
    ],
)

esbuild(
    name = "web_ui_test_bundle",
    entry_point = "src/transport/web_serial_transport_test.ts",
    deps = [":web_ui_test_lib"],
)

esbuild(
    name = "app_bundle",
    args = {
        "resolveExtensions": [
            ".mjs",
            ".js",
        ],
    },
    entry_point = "src/frontend/index.tsx",
    target = "es2021",
    deps = [":lib"],
)

karma_web_test(
    name = "web_ui_test",
    srcs = [
        ":web_ui_test_bundle",
    ],
)

http_server(
    name = "devserver",
    args = ["pw_web_ui/"],
    data = [
        "index.html",
        ":app_bundle",
    ],
)

# needed for embedding into downstream projects
filegroup(name = "pw_web_ui__contents")

filegroup(name = "pw_web_ui__files")

filegroup(name = "pw_web_ui__nested_node_modules")
