# Copyright 2021 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("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@sphinxdocs//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library")
load("//pw_build:compatibility.bzl", "incompatible_with_mcu")

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

licenses(["notice"])

cc_library(
    name = "id",
    hdrs = [
        "id_public_overrides/pw_thread_backend/id_inline.h",
        "id_public_overrides/pw_thread_backend/id_native.h",
        "public/pw_thread_embos/id_inline.h",
        "public/pw_thread_embos/id_native.h",
    ],
    includes = [
        "id_public_overrides",
        "public",
    ],
    target_compatible_with = [
        "//pw_build/constraints/rtos:embos",
    ],
    deps = [
        "//pw_assert:assert",
        "//pw_thread:id.facade",
    ],
    # TODO: b/234876414 - This should depend on embOS but our third parties
    # currently do not have Bazel support.
)

cc_library(
    name = "sleep",
    srcs = [
        "sleep.cc",
    ],
    hdrs = [
        "public/pw_thread_embos/sleep_inline.h",
        "sleep_public_overrides/pw_thread_backend/sleep_inline.h",
    ],
    implementation_deps = ["//pw_assert:check"],
    includes = [
        "public",
        "sleep_public_overrides",
    ],
    target_compatible_with = [
        "//pw_build/constraints/rtos:embos",
    ],
    deps = [
        "//pw_chrono:system_clock",
        "//pw_thread:sleep.facade",
    ],
    # TODO: b/234876414 - This should depend on embOS but our third parties
    # currently do not have Bazel support.
)

cc_library(
    name = "thread",
    srcs = [
        "thread.cc",
    ],
    hdrs = [
        "public/pw_thread_embos/config.h",
        "public/pw_thread_embos/context.h",
        "public/pw_thread_embos/options.h",
        "public/pw_thread_embos/thread_inline.h",
        "public/pw_thread_embos/thread_native.h",
        "thread_public_overrides/pw_thread_backend/thread_inline.h",
        "thread_public_overrides/pw_thread_backend/thread_native.h",
    ],
    implementation_deps = ["//pw_assert:check"],
    includes = [
        "public",
        "thread_public_overrides",
    ],
    deps = [
        ":config_override",
        ":id",
        "//pw_assert:assert",
        "//pw_function",
        "//pw_string",
        "//pw_thread:thread.facade",
    ],
    # TODO: b/234876414 - This should depend on embOS but our third parties
    # currently do not have Bazel support.
)

label_flag(
    name = "config_override",
    build_setting_default = "//pw_build:default_module_config",
)

cc_library(
    name = "non_portable_test_thread_options",
    srcs = [
        "test_threads.cc",
    ],
    implementation_deps = ["//pw_assert:check"],
    strip_include_prefix = "public",
    # TODO: b/260637734 - This target doesn't build
    tags = ["manual"],
    deps = [
        "//pw_chrono:system_clock",
        "//pw_thread:non_portable_test_thread_options",
        "//pw_thread:sleep",
        "//pw_thread:thread.facade",
    ],
)

cc_library(
    name = "yield",
    hdrs = [
        "public/pw_thread_embos/yield_inline.h",
        "yield_public_overrides/pw_thread_backend/yield_inline.h",
    ],
    includes = [
        "public",
        "yield_public_overrides",
    ],
    tags = ["noclangtidy"],
    deps = [
        "//pw_assert:assert",
        "//pw_thread:yield.facade",
    ],
    # TODO: b/234876414 - This should depend on embOS but our third parties
    # currently do not have Bazel support.
)

cc_library(
    name = "util",
    srcs = [
        "util.cc",
    ],
    hdrs = [
        "public/pw_thread_embos/util.h",
    ],
    strip_include_prefix = "public",
    # TODO: b/260637734 - This target doesn't build
    tags = ["manual"],
    deps = [
        "//pw_function",
        "//pw_status",
    ],
    # TODO: b/234876414 - This should depend on embOS but our third parties
    # currently do not have Bazel support.
)

cc_library(
    name = "snapshot",
    srcs = [
        "snapshot.cc",
    ],
    hdrs = [
        "public/pw_thread_embos/snapshot.h",
    ],
    strip_include_prefix = "public",
    # TODO: b/260637734 - This target doesn't build
    tags = ["manual"],
    deps = [
        ":util",
        "//pw_bytes",
        "//pw_function",
        "//pw_log",
        "//pw_protobuf",
        "//pw_status",
        "//pw_thread:snapshot",
    ],
    # TODO: b/234876414 - This should depend on embOS but our third parties
    # currently do not have Bazel support.
)

sphinx_docs_library(
    name = "docs",
    srcs = [
        "docs.rst",
    ],
    prefix = "pw_thread_embos/",
    target_compatible_with = incompatible_with_mcu(),
)
