# 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 = "air_sensor",
    srcs = ["air_sensor.cc"],
    hdrs = ["air_sensor.h"],
    implementation_deps = [
        "@pigweed//pw_log",
    ],
    deps = [
        "//modules/pubsub:events",
        "@pigweed//pw_metric:metric",
        "@pigweed//pw_result",
        "@pigweed//pw_status",
        "@pigweed//pw_sync:interrupt_spin_lock",
        "@pigweed//pw_sync:lock_annotations",
        "@pigweed//pw_sync:thread_notification",
    ],
)

cc_library(
    name = "air_sensor_fake",
    hdrs = ["air_sensor_fake.h"],
    deps = [
        ":air_sensor",
        "@pigweed//pw_assert",
        "@pigweed//pw_status",
        "@pigweed//pw_sync:thread_notification",
    ],
)

pw_cc_test(
    name = "air_sensor_test",
    srcs = ["air_sensor_test.cc"],
    deps = [
        ":air_sensor",
        ":air_sensor_fake",
        "@pigweed//pw_sync:thread_notification",
        "@pigweed//pw_thread:test_thread_context",
        "@pigweed//pw_thread:thread",
        "@pigweed//pw_unit_test",
    ],
)

proto_library(
    name = "proto",
    srcs = ["air_sensor.proto"],
    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"],
)

cc_library(
    name = "service",
    srcs = ["service.cc"],
    hdrs = ["service.h"],
    implementation_deps = [
        "@pigweed//pw_log",
    ],
    deps = [
        ":air_sensor",
        ":nanopb_rpc",
        "//modules/worker",
        "@pigweed//pw_assert:check",
        "@pigweed//pw_chrono:system_clock",
        "@pigweed//pw_chrono:system_timer",
        "@pigweed//pw_sync:thread_notification",
    ],
)
