# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

visibility = [ "//src/developer/forensics/*" ]

###############################################################################
# SOURCES
###############################################################################
source_set("constants") {
  sources = [ "constants.h" ]

  public_deps = [
    "//sdk/fidl/fuchsia.feedback:fuchsia.feedback_hlcpp",
    "//src/developer/forensics/feedback/annotations",
    "//src/developer/forensics/utils:storage_size",
    "//src/developer/forensics/utils/cobalt",
  ]
}

source_set("data_provider") {
  public = [ "data_provider.h" ]

  sources = [
    "data_provider.cc",
    "data_provider.h",
    "image_conversion.cc",
    "image_conversion.h",
  ]

  public_deps = [
    ":inspect_budget",
    ":metadata",
    "//sdk/fidl/fuchsia.feedback:fuchsia.feedback_hlcpp",
    "//sdk/lib/sys/cpp",
    "//src/developer/forensics/feedback/annotations",
    "//src/developer/forensics/feedback/attachments",
    "//src/developer/forensics/utils:fidl_oneshot",
    "//src/developer/forensics/utils/cobalt",
    "//src/developer/forensics/utils/redact",
    "//src/lib/timekeeper:system",
    "//zircon/system/ulib/async:async-cpp",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/zx",
  ]

  deps = [
    ":constants",
    ":screenshot",
    "//sdk/fidl/fuchsia.mem:fuchsia.mem_hlcpp",
    "//sdk/lib/syslog/cpp",
    "//sdk/lib/vfs/cpp",
    "//src/developer/forensics/feedback/attachments",
    "//src/developer/forensics/utils:archive",
    "//src/lib/fostr/fidl/fuchsia.images",
    "//src/lib/fsl",
    "//src/lib/fxl",
    "//src/lib/uuid",
    "//third_party/libpng",
  ]
}

source_set("errors") {
  sources = [ "errors.h" ]

  public_deps = [
    "//sdk/lib/syslog/cpp",
    "//src/developer/forensics/utils:errors",
  ]
}

source_set("inspect_budget") {
  sources = [
    "inspect_data_budget.cc",
    "inspect_data_budget.h",
  ]

  public_deps = [
    "//src/developer/forensics/utils:archive",
    "//src/developer/forensics/utils:inspect_node_manager",
    "//src/developer/forensics/utils/cobalt",
    "//zircon/system/ulib/inspect",
  ]

  deps = [
    ":constants",
    "//sdk/lib/syslog/cpp",
  ]
}

source_set("log_source") {
  sources = [
    "log_source.cc",
    "log_source.h",
  ]

  public_deps = [
    "//sdk/fidl/fuchsia.diagnostics:fuchsia.diagnostics_hlcpp",
    "//sdk/lib/sys/cpp",
    "//src/lib/diagnostics/accessor2logger",
    "//src/lib/fxl",
    "//zircon/system/ulib/async",
    "//zircon/system/ulib/async:async-cpp",
  ]

  deps = [
    ":constants",
    "//sdk/lib/syslog/cpp",
    "//src/lib/fostr/fidl/fuchsia.diagnostics",
  ]
}

source_set("metadata") {
  sources = [
    "metadata.cc",
    "metadata.h",
    "metadata_schema.h",
  ]

  public_deps = [
    "//sdk/lib/fit-promise",
    "//src/developer/forensics/feedback/attachments",
    "//src/developer/forensics/utils:utc_time_provider",
    "//src/developer/forensics/utils/redact",
  ]

  deps = [
    ":constants",
    ":errors",
    "//src/developer/forensics/utils:errors",
    "//third_party/rapidjson",
  ]
}

source_set("screenshot") {
  sources = [
    "screenshot.cc",
    "screenshot.h",
  ]

  public_deps = [
    "//sdk/fidl/fuchsia.images:fuchsia.images_hlcpp",
    "//sdk/lib/fit-promise",
    "//sdk/lib/sys/cpp",
    "//src/lib/fsl",
    "//src/lib/fxl",
    "//zircon/system/ulib/async",
  ]

  deps = [
    "//sdk/fidl/fuchsia.ui.composition:fuchsia.ui.composition_hlcpp",
    "//sdk/lib/syslog/cpp",
    "//src/developer/forensics/utils:errors",
    "//src/developer/forensics/utils:fidl_oneshot",
  ]
}
