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

import("//build_overrides/pigweed.gni")

import("$dir_pw_async/async.gni")
import("$dir_pw_async/fake_dispatcher_fixture.gni")
import("$dir_pw_async/fake_dispatcher_test.gni")
import("$dir_pw_async/heap_dispatcher.gni")
import("$dir_pw_bloat/bloat.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_chrono/backend.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_sync/backend.gni")
import("$dir_pw_thread/backend.gni")
import("$dir_pw_unit_test/test.gni")

config("public_include_path") {
  include_dirs = [ "public" ]
}

config("backend_config") {
  include_dirs = [ "public_overrides" ]
  visibility = [ ":*" ]
}

# Backend for //pw_async:task
pw_source_set("task") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  public = [
    "public/pw_async_basic/task.h",
    "public_overrides/pw_async_backend/task.h",
  ]

  public_deps = [
    "$dir_pw_async:task.facade",
    "$dir_pw_containers:intrusive_list",
  ]
  visibility = [
                 ":*",
                 "$dir_pw_async:*",
                 "size_report:*",
               ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

# Backend for //pw_async:fake_dispatcher
pw_source_set("fake_dispatcher") {
  public_configs = [
    ":public_include_path",
    ":backend_config",
  ]
  sources = [ "fake_dispatcher.cc" ]
  public = [
    "public/pw_async_basic/fake_dispatcher.h",
    "public_overrides/pw_async_backend/fake_dispatcher.h",
  ]
  public_deps = [
    ":task",
    "$dir_pw_async:fake_dispatcher.facade",
  ]
  deps = [ dir_pw_log ]
  visibility = [
                 ":*",
                 "$dir_pw_async:*",
               ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

fake_dispatcher_test("fake_dispatcher_test") {
  backend = ":fake_dispatcher"
}

fake_dispatcher_fixture("fake_dispatcher_fixture") {
  backend = ":fake_dispatcher"
}

pw_test("fake_dispatcher_fixture_test") {
  enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != ""
  sources = [ "fake_dispatcher_fixture_test.cc" ]
  deps = [ ":fake_dispatcher_fixture" ]
}

pw_source_set("dispatcher") {
  public_configs = [ ":public_include_path" ]
  public = [ "public/pw_async_basic/dispatcher.h" ]
  sources = [ "dispatcher.cc" ]
  public_deps = [
    ":task",
    "$dir_pw_async:dispatcher",
    "$dir_pw_containers:intrusive_list",
    "$dir_pw_sync:interrupt_spin_lock",
    "$dir_pw_sync:timed_thread_notification",
    "$dir_pw_thread:thread_core",
  ]
  visibility = [
                 ":*",
                 "$dir_pw_grpc/*",
                 "size_report:*",
               ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

pw_test("dispatcher_test") {
  enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != "" &&
              pw_thread_THREAD_BACKEND == "$dir_pw_thread_stl:thread"
  public_deps = [
    ":dispatcher",
    "$dir_pw_thread:thread",
    dir_pw_log,
  ]
  sources = [ "dispatcher_test.cc" ]
}

# This target cannot be labeled "heap_dispatcher" or else the outpath Ninja uses
# for heap_dispatcher.cc will collide with $dir_pw_async:heap_dispatcher.
pw_async_heap_dispatcher_source_set("heap_dispatcher_basic") {
  task_backend = ":task"
  visibility = [ ":*" ]
}

group("heap_dispatcher") {
  public_deps = [ ":heap_dispatcher_basic" ]
  visibility = [ ":*" ] + pw_async_EXPERIMENTAL_MODULE_VISIBILITY
}

pw_test("heap_dispatcher_test") {
  enable_if = pw_chrono_SYSTEM_CLOCK_BACKEND != "" &&
              pw_thread_THREAD_BACKEND == "$dir_pw_thread_stl:thread"
  sources = [ "heap_dispatcher_test.cc" ]
  deps = [
    ":fake_dispatcher_fixture",
    ":heap_dispatcher",
  ]
}

pw_test_group("tests") {
  tests = [
    ":dispatcher_test",
    ":fake_dispatcher_test",
    ":fake_dispatcher_fixture_test",
    ":heap_dispatcher_test",
  ]
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
  report_deps = [ ":docs_size_report" ]
}

pw_size_diff("docs_size_report") {
  title = "pw_async_basic Docs Size Report"
  base = "$dir_pw_bloat:bloat_base"

  binaries = []

  if (pw_chrono_SYSTEM_CLOCK_BACKEND != "") {
    binaries += [
      {
        target = "size_report:task"
        label = "Construct a Task"
      },
    ]
  }

  if (binaries == []) {
    binaries += [
      {
        target = "$dir_pw_bloat:bloat_base"
        label = "No backend is selected."
      },
    ]
  }
}

# This size report can't be included in docs because the docs build target uses
# the target-stm32f429i-disc1 toolchain, which does not support timed thread
# notifications (mutex & condition_variable headers are not available).
pw_size_diff("size_report") {
  title = "pw_async_basic Size Report"
  base = "$dir_pw_bloat:bloat_base"

  binaries = []

  if (pw_chrono_SYSTEM_CLOCK_BACKEND != "" &&
      pw_sync_THREAD_NOTIFICATION_BACKEND != "" &&
      pw_sync_TIMED_THREAD_NOTIFICATION_BACKEND != "") {
    binaries += [
      {
        target = "size_report:post_1_task"
        label = "Post 1 Task to BasicDispatcher"
      },
    ]
  }
}
