# Copyright 2016 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/package.gni")
import("//build/test/test_package.gni")
import("//build/testing/environments.gni")
import("//third_party/vulkan_loader_and_validation_layers/layers/layers.gni")

group("ui") {
  testonly = true
  deps = [
    ":ime_service",
    ":ime_service_tests",
    ":root_presenter",
    ":scenic",
    ":scenic_tests",
    ":set_renderer_params",
    "benchmarks",
    "gltf_export",
    "ime",
    "input",
    "input_reader",
    "present_view",
    "presentation_mode",
    "print_input",
    "root_presenter",
    "scenic",
    "screencap",
    "set_renderer_params_HACK",
    "snapshot",
    "tests",
    "text",
  ]
}

declare_args() {
  # Include the vulkan validation layers in scenic.
  scenic_enable_vulkan_validation = is_debug
}

test_package("scenic_tests") {
  deps = [
    "input/tests",
    "input_reader/tests",
    "presentation_mode/tests",
    "root_presenter/tests",
    "//garnet/lib/ui/gfx/tests",
    "//garnet/lib/ui/gfx/util/tests",
    "//garnet/lib/ui/input/tests",
    "//garnet/lib/ui/scenic/tests",
    "//garnet/public/lib/ui/geometry/cpp:tests",
  ]

  tests = [
    {
      name = "gfx_apptests"
      environments = basic_envs
    },
    {
      name = "gfx_pixeltests"
      environments = [ nuc_env ]
    },
    {
      name = "gfx_viewstate_apptests"
      environments = [ nuc_env ]
    },
    {
      name = "gfx_unittests"
      environments = basic_envs
    },
    {
      name = "gfx_util_unittests"
      environments = basic_envs
    },
    {
      name = "geometry_util_unittests"
      environments = basic_envs
    },
    {
      name = "input_apptests"
      environments = basic_envs
    },
    {
      name = "input_reader_unittests"
      environments = basic_envs
    },
    {
      name = "input_unittests"
      environments = basic_envs
    },
    {
      name = "input_tool_unittests"
      environments = basic_envs
    },
    {
      name = "presentation_mode_unittests"
      environments = basic_envs
    },
    {
      name = "root_presenter_tests"
      environments = basic_envs
    },
    {
      name = "scenic_unittests"
      environments = basic_envs
    },
  ]

  public_deps = vulkan_validation_layers.public_deps
  loadable_modules = vulkan_validation_layers.loadable_modules
  resources = vulkan_validation_layers.resources
}

package("root_presenter") {
  deps = [
    "root_presenter",
  ]

  binaries = [
    {
      name = "root_presenter"
    },
  ]

  resources = [
    {
      path = rebase_path("root_presenter/resources/cursor32.png")
      dest = "cursor32.png"
    },
  ]

  meta = [
    {
      path = rebase_path("root_presenter/meta/root_presenter.cmx")
      dest = "root_presenter.cmx"
    },
  ]
}

package("ime_service") {
  deps = [
    "ime",
  ]

  binaries = [
    {
      name = "ime_service"
    },
  ]

  meta = [
    {
      path = rebase_path("ime/meta/ime_service.cmx")
      dest = "ime_service.cmx"
    },
  ]
}

test_package("ime_service_tests") {
  deps = [
    "ime:ime_test",
    "//garnet/bin/ui/text/test_suite:test_suite",
  ]

  tests = [
    {
      name = "ime_service_bin_test"
      dest = "ime_service_unittests"
      environments = basic_envs
    },
  ]
}

package("scenic") {
  deps = [
    "scenic",
  ]

  binaries = [
    {
      name = "scenic"
    },
  ]

  meta = [
    {
      path = rebase_path("scenic/meta/scenic.cmx")
      dest = "scenic.cmx"
    },
  ]

  resources = [
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/default_position.vert"
      dest = "shaders/model_renderer/default_position.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/main.frag"
      dest = "shaders/model_renderer/main.frag"
    },
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/main.vert"
      dest = "shaders/model_renderer/main.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/shadow_map_generation.frag"
      dest = "shaders/model_renderer/shadow_map_generation.frag"
    },
    {
      path =
          "//src/ui/lib/escher/shaders/model_renderer/shadow_map_lighting.frag"
      dest = "shaders/model_renderer/shadow_map_lighting.frag"
    },
    {
      path = "//src/ui/lib/escher/shaders/model_renderer/wobble_position.vert"
      dest = "shaders/model_renderer/wobble_position.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/common/use.glsl"
      dest = "shaders/paper/common/use.glsl"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/frag/main_ambient_light.frag"
      dest = "shaders/paper/frag/main_ambient_light.frag"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/frag/main_point_light.frag"
      dest = "shaders/paper/frag/main_point_light.frag"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/vert/compute_model_space_position.vert"
      dest = "shaders/paper/vert/compute_model_space_position.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/vert/compute_world_space_position.vert"
      dest = "shaders/paper/vert/compute_world_space_position.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/vert/main_shadow_volume_extrude.vert"
      dest = "shaders/paper/vert/main_shadow_volume_extrude.vert"
    },
    {
      path = "//src/ui/lib/escher/shaders/paper/vert/vertex_attributes.vert"
      dest = "shaders/paper/vert/vertex_attributes.vert"
    },
  ]

  # If configured, include the vulkan validation layers.
  if (scenic_enable_vulkan_validation) {
    loadable_modules = vulkan_validation_layers.loadable_modules
    public_deps = vulkan_validation_layers.public_deps
    resources += vulkan_validation_layers.resources
  }
}

# Component shell tools can be run as shell command or as components via a
# component URI. The following list contains the names of such components that
# follow the pattern:
# name/meta/name.cmx contains the component manifest
# name is the name of a subdirectory that builds the output binary `name`
component_shell_tools = [
  "gltf_export",
  "present_view",
  "screencap",
  "snapshot",
]
foreach(tool, component_shell_tools) {
  package(tool) {
    meta = [
      {
        path = rebase_path("$tool/meta/$tool.cmx")
        dest = "$tool.cmx"
      },
    ]

    deps = [
      tool,
    ]

    binaries = [
      {
        name = tool
        shell = true
      },
    ]
  }
}

package("set_renderer_params") {
  deps = [
    "set_renderer_params_HACK:set_renderer_params",
  ]

  binaries = [
    {
      name = "set_renderer_params"
      shell = true
    },
  ]

  meta = [
    {
      path =
          rebase_path("set_renderer_params_HACK/meta/set_renderer_params.cmx")
      dest = "set_renderer_params.cmx"
    },
  ]
}

# Non-component tools contains the names of shell command tools that do not
# have any CMX.
non_component_tools = [
  "input",
  "print_input",
]

foreach(tool, non_component_tools) {
  package(tool) {
    deps = [
      tool,
    ]
    binaries = [
      {
        name = tool
        shell = true
      },
    ]
  }
}
