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

import("//build/cipd.gni")
import("//build/components.gni")
import("//src/camera/bin/camera-gym/assets/convert_image.gni")
import("//src/camera/debug.gni")

declare_args() {
  camera_gym_configuration_cycle_time_ms = 10000
  camera_gym_enable_root_presenter = false
}

group("camera-gym") {
  public_deps = [
    ":camera_gym_pkg",
    "fidl:controller",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":camera_gym_test",
    "controller_parser:tests",
  ]
}

source_set("lib") {
  sources = [
    "buffer_collage.cc",
    "buffer_collage.h",
    "lifecycle_impl.cc",
    "lifecycle_impl.h",
    "moving_window.cc",
    "moving_window.h",
    "stream_cycler.cc",
    "stream_cycler.h",
  ]

  public_deps = [
    "//sdk/fidl/fuchsia.camera3",
    "//sdk/fidl/fuchsia.math",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.sysmem",
    "//sdk/fidl/fuchsia.ui.app",
    "//sdk/fidl/fuchsia.ui.policy",
    "//sdk/fidl/fuchsia.ui.scenic",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/lib/fit",
    "//sdk/lib/fit-promise",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/syslog/cpp",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/fsl",
    "//src/lib/fxl",
    "//third_party/googletest:gtest_prod",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fzl",
    "//zircon/system/ulib/trace",
  ]

  defines = [
    camera_debug_define,
    "CONFIGURATION_CYCLE_TIME_MS=($camera_gym_configuration_cycle_time_ms)",
  ]

  if (camera_gym_enable_root_presenter) {
    defines += [ "CAMERA_GYM_ENABLE_ROOT_PRESENTER=(true)" ]
  } else {
    defines += [ "CAMERA_GYM_ENABLE_ROOT_PRESENTER=(false)" ]
  }
}

executable("camera_gym_bin") {
  sources = [ "main.cc" ]
  deps = [
    ":lib",
    "//zircon/system/ulib/trace-provider:trace-provider-with-fdio",
  ]
  defines = [ camera_debug_define ]
}

convert_image("mute_icon") {
  input = "assets/mute.bin"
  output = "$target_out_dir/mute.bin"
}

resource("mute_resource") {
  sources = get_target_outputs(":mute_icon")
  outputs = [ "data/mute.bin" ]
  deps = [ ":mute_icon" ]
}

converted_resources = []

if (internal_access) {
  stream_title_files = [
    "c0s0.data",
    "c0s1.data",
    "c0s2.data",
    "c1s0.data",
    "c1s1.data",
    "c2s0.data",
    "c2s1.data",
  ]
  foreach(file, stream_title_files) {
    convert_image(file) {
      input = "//prebuilt/camera/camera_gym_assets/$file"
      output = "$target_out_dir/${file}"
    }
    resource("${file}_resource") {
      sources = get_target_outputs(":$file")
      outputs = [ "data/$file" ]
      deps = [ ":$file" ]
    }
    converted_resources += [ ":${file}_resource" ]
  }
}

group("converted_stream_title_files") {
  deps = converted_resources
}

template("camera_gym_component") {
  fuchsia_component("camera_gym_$target_name") {
    forward_variables_from(invoker,
                           [
                             "component_name",
                             "manifest",
                           ])
    deps = [
      ":camera_gym_bin",
      ":converted_stream_title_files",
      ":mute_resource",
    ]
  }
}

camera_gym_component("auto") {
  component_name = "camera-gym"
  manifest = "meta/camera-gym.cmx"
}

camera_gym_component("manual") {
  component_name = "camera-gym-manual"
  manifest = "meta/camera-gym-manual.cmx"
}

fuchsia_package("camera_gym_pkg") {
  package_name = "camera-gym"
  deps = [
    ":camera_gym_auto",
    ":camera_gym_manual",
  ]
}

executable("camera_gym_test_bin") {
  testonly = true
  sources = [ "camera_gym_test.cc" ]
  deps = [
    "//src/camera/bin/camera-gym:lib",
    "//src/lib/fxl/test:gtest_main",
  ]
}

fuchsia_unittest_package("camera_gym_test") {
  manifest = "meta/camera_gym_test.cmx"
  deps = [ ":camera_gym_test_bin" ]
}
