# Copyright 2013 The Flutter 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("//flutter/build/zip_bundle.gni")
import("//flutter/shell/platform/common/client_wrapper/publish.gni")
import("//flutter/testing/testing.gni")

_wrapper_includes = [
  "include/flutter/dart_project.h",
  "include/flutter/flutter_engine.h",
  "include/flutter/flutter_view_controller.h",
  "include/flutter/flutter_view.h",
  "include/flutter/plugin_registrar_windows.h",
]

_wrapper_sources = [
  "flutter_engine.cc",
  "flutter_view_controller.cc",
]

# This code will be merged into .../common/client_wrapper for client use,
# so uses header paths that assume the merged state. Include the header
# directories of the core wrapper files so these includes will work.
config("relative_core_wrapper_headers") {
  include_dirs = [
    "//flutter/shell/platform/common/client_wrapper",
    "//flutter/shell/platform/common/client_wrapper/include/flutter",
  ]
}

# Windows client wrapper build for internal use by the shell implementation.
source_set("client_wrapper_windows") {
  sources = _wrapper_sources
  public = _wrapper_includes

  deps = [
    "//flutter/shell/platform/common:common_cpp_library_headers",
    "//flutter/shell/platform/common/client_wrapper:client_wrapper",
    "//flutter/shell/platform/windows:flutter_windows_headers",
  ]

  configs +=
      [ "//flutter/shell/platform/common:desktop_library_implementation" ]

  public_configs = [
    ":relative_core_wrapper_headers",
    "//flutter/shell/platform/common:relative_flutter_library_headers",
    "//flutter/shell/platform/windows:relative_flutter_windows_headers",
  ]
}

# Copies the Windows client wrapper code to the output directory.
publish_client_wrapper_extension("publish_wrapper_windows") {
  public = _wrapper_includes
  sources = _wrapper_sources
}

source_set("client_wrapper_library_stubs_windows") {
  sources = [
    "testing/stub_flutter_windows_api.cc",
    "testing/stub_flutter_windows_api.h",
  ]

  defines = [ "FLUTTER_DESKTOP_LIBRARY" ]

  public_deps = [ "//flutter/shell/platform/windows:flutter_windows_headers" ]
}

test_fixtures("client_wrapper_windows_fixtures") {
  fixtures = []
}

executable("client_wrapper_windows_unittests") {
  testonly = true

  sources = [
    "dart_project_unittests.cc",
    "flutter_engine_unittests.cc",
    "flutter_view_controller_unittests.cc",
    "flutter_view_unittests.cc",
    "plugin_registrar_windows_unittests.cc",
  ]

  # Set embedder.h to export, not import, since the stubs are locally defined.
  defines = [ "FLUTTER_DESKTOP_LIBRARY" ]

  deps = [
    ":client_wrapper_library_stubs_windows",
    ":client_wrapper_windows",
    ":client_wrapper_windows_fixtures",
    "//flutter/shell/platform/common/client_wrapper:client_wrapper_library_stubs",
    "//flutter/testing",

    # TODO(chunhtai): Consider refactoring flutter_root/testing so that there's a testing
    # target that doesn't require a Dart runtime to be linked in.
    # https://github.com/flutter/flutter/issues/41414.
    "//third_party/dart/runtime:libdart_jit",
  ]
}

client_wrapper_file_archive_list = [
  "core_implementations.cc",
  "engine_method_result.cc",
  "plugin_registrar.cc",
  "README",
  "standard_codec.cc",
]

win_client_wrapper_file_archive_list = [
  "flutter_engine.cc",
  "flutter_view_controller.cc",
]

zip_bundle("client_wrapper_archive") {
  output = "$full_target_platform_name/flutter-cpp-client-wrapper.zip"
  deps = [
    ":client_wrapper_windows",
    ":publish_wrapper_windows",
    "//flutter/shell/platform/common/client_wrapper:client_wrapper",
  ]
  tmp_files = []
  foreach(source_file, client_wrapper_file_archive_list) {
    tmp_files += [
      {
        source = "//flutter/shell/platform/common/client_wrapper/$source_file"
        destination = "cpp_client_wrapper/$source_file"
      },
    ]
  }

  # Windows specific source code files
  foreach(source_file, win_client_wrapper_file_archive_list) {
    tmp_files += [
      {
        source = "//flutter/shell/platform/windows/client_wrapper/$source_file"
        destination = "cpp_client_wrapper/$source_file"
      },
    ]
  }

  # Headers
  headers = core_cpp_client_wrapper_includes +
            core_cpp_client_wrapper_internal_headers
  foreach(header, headers) {
    rebased_path =
        rebase_path(header, "//flutter/shell/platform/common/client_wrapper")
    tmp_files += [
      {
        source = header
        destination = "cpp_client_wrapper/$rebased_path"
      },
    ]
  }

  # Wrapper includes
  foreach(header, _wrapper_includes) {
    rebased_path =
        rebase_path("//flutter/shell/platform/windows/client_wrapper/$header",
                    "//flutter/shell/platform/windows/client_wrapper")
    tmp_files += [
      {
        source = header
        destination = "cpp_client_wrapper/$rebased_path"
      },
    ]
  }
  files = tmp_files
}
