# Copyright 2024 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("@pigweed//pw_build:pigweed.bzl", "pw_cc_test")
load(
    "@pigweed//pw_protobuf_compiler:pw_proto_library.bzl",
    "nanopb_proto_library",
    "nanopb_rpc_proto_library",
)
load("@rules_python//python:proto.bzl", "py_proto_library")

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

cc_library(
    name = "blinky",
    srcs = ["blinky.cc"],
    hdrs = ["blinky.h"],
    implementation_deps = [
        "@pigweed//pw_log",
        "@pigweed//pw_preprocessor",
    ],
    deps = [
        "//system",
        "@pigweed//pw_async2:coro",
        "@pigweed//pw_async2:coro_or_else_task",
        "@pigweed//pw_async2:dispatcher",
        "@pigweed//pw_async2:time_provider",
        "@pigweed//pw_chrono:system_clock",
        "@pigweed//pw_function",
        "@pigweed//pw_sync:interrupt_spin_lock",
        "@pigweed//pw_sync:lock_annotations",
        "@pigweed//pw_system:async",
    ],
)

pw_cc_test(
    name = "blinky_test",
    srcs = ["blinky_test.cc"],
    deps = [
        ":blinky",
        "@pigweed//pw_allocator:testing",
        "@pigweed//pw_async2:dispatcher",
        "@pigweed//pw_async2:simulated_time_provider",
        "@pigweed//pw_digital_io:digital_io_mock",
        "@pigweed//pw_unit_test",
    ],
)

cc_library(
    name = "service",
    srcs = ["service.cc"],
    hdrs = ["service.h"],
    deps = [
        ":blinky",
        ":nanopb_rpc",
        "@pigweed//pw_allocator:allocator",
        "@pigweed//pw_assert:check",
        "@pigweed//pw_async2:dispatcher",
    ],
)

proto_library(
    name = "proto",
    srcs = ["blinky.proto"],
    import_prefix = "blinky_pb",
    strip_import_prefix = "/modules/blinky",
    deps = [
        "@pigweed//pw_protobuf:common_proto",
    ],
)

nanopb_proto_library(
    name = "nanopb",
    deps = [":proto"],
)

nanopb_rpc_proto_library(
    name = "nanopb_rpc",
    nanopb_proto_library_deps = [":nanopb"],
    deps = [":proto"],
)

py_proto_library(
    name = "py_pb2",
    deps = [":proto"],
)
