# 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",
    "sketchy",
    "snapshot",
    "tests",
    "text",
  ]
}

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

package("scenic_tests") {
  testonly = true

  deps = [
    "input/tests",
    "input_reader/tests",
    "presentation_mode/tests",
    "//garnet/lib/ui/gfx/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 = "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 = "scenic_unittests"
      environments = basic_envs
    },
  ]

  meta = [
    {
      path = rebase_path("meta/scenic_tests.cmx")
      dest = "scenic_tests.cmx"
    },
    {
      path = rebase_path("meta/gfx_apptests.cmx")
      dest = "gfx_apptests.cmx"
    },
    {
      path = rebase_path("meta/gfx_pixeltests.cmx")
      dest = "gfx_pixeltests.cmx"
    },
    {
      path = rebase_path("meta/gfx_viewstate_apptests.cmx")
      dest = "gfx_viewstate_apptests.cmx"
    },
    {
      path = rebase_path("meta/gfx_unittests.cmx")
      dest = "gfx_unittests.cmx"
    },
    {
      path = rebase_path("meta/input_unittests.cmx")
      dest = "input_unittests.cmx"
    },
    {
      path = rebase_path("meta/scenic_unittests.cmx")
      dest = "scenic_unittests.cmx"
    },
  ]

  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",
    "//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 = "//garnet/public/lib/escher/shaders/model_renderer/default_position.vert"
      dest = "shaders/model_renderer/default_position.vert"
    },
    {
      path = "//garnet/public/lib/escher/shaders/model_renderer/main.frag"
      dest = "shaders/model_renderer/main.frag"
    },
    {
      path = "//garnet/public/lib/escher/shaders/model_renderer/main.vert"
      dest = "shaders/model_renderer/main.vert"
    },
    {
      path = "//garnet/public/lib/escher/shaders/model_renderer/shadow_map_generation.frag"
      dest = "shaders/model_renderer/shadow_map_generation.frag"
    },
    {
      path = "//garnet/public/lib/escher/shaders/model_renderer/shadow_map_lighting.frag"
      dest = "shaders/model_renderer/shadow_map_lighting.frag"
    },
    {
      path = "//garnet/public/lib/escher/shaders/model_renderer/wobble_position.vert"
      dest = "shaders/model_renderer/wobble_position.vert"
    },
    {
      path = "//garnet/public/lib/escher/shaders/paper/common/use.glsl"
      dest = "shaders/paper/common/use.glsl"
    },
    {
      path = "//garnet/public/lib/escher/shaders/paper/frag/main_ambient_light.frag"
      dest = "shaders/paper/frag/main_ambient_light.frag"
    },
    {
      path =
          "//garnet/public/lib/escher/shaders/paper/frag/main_point_light.frag"
      dest = "shaders/paper/frag/main_point_light.frag"
    },
    {
      path = "//garnet/public/lib/escher/shaders/paper/vert/compute_model_space_position.vert"
      dest = "shaders/paper/vert/compute_model_space_position.vert"
    },
    {
      path = "//garnet/public/lib/escher/shaders/paper/vert/compute_world_space_position.vert"
      dest = "shaders/paper/vert/compute_world_space_position.vert"
    },
    {
      path = "//garnet/public/lib/escher/shaders/paper/vert/main_shadow_volume_extrude.vert"
      dest = "shaders/paper/vert/main_shadow_volume_extrude.vert"
    },
    {
      path =
          "//garnet/public/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
      },
    ]
  }
}
