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

assert(is_win)

import("//flutter/shell/platform/glfw/config.gni")
import("//flutter/testing/testing.gni")

_public_headers = [ "public/flutter_windows.h" ]

config("relative_angle_headers") {
  include_dirs = [ "//third_party/angle/include" ]
}

# Any files that are built by clients (client_wrapper code, library headers for
# implementations using this shared code, etc.) include the public headers
# assuming they are in the include path. This configuration should be added to
# any such code that is also built by GN to make the includes work.
config("relative_flutter_windows_headers") {
  include_dirs = [ "public" ]
}

config("cppwinrt_defs") {
  # Use winrt headers generated by the cppwinrt tool rather than those shipped in the installed SDK.
  # The Windows metadata used to generate the headers does come from the installed SDK, by generating them rather than using the shipped ones
  # the latest cppwinrt compatibility fixes can be derived.  For example, clang support is broken in the winrt headers shipped in SDK 10.0.19041.0.
  # By generating them in the flutter toolchain using the SDK 10.0.19041.0 metadata and the latest version of the cppwinrt tool, that SDK version can be supported.
  #
  # Generated with command bin\cppwinrt.exe -in sdk -out generated
  # by src\build\win\generate_winrt_headers.py
  include_dirs = [ "..\..\..\..\third_party\cppwinrt\generated" ]
}

# The headers are a separate source set since the client wrapper is allowed
# to depend on the public headers, but none of the rest of the code.
source_set("flutter_windows_headers") {
  public = _public_headers

  public_deps = [ "//flutter/shell/platform/common:common_cpp_library_headers" ]

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

  public_configs =
      [ "//flutter/shell/platform/common:relative_flutter_library_headers" ]
}

source_set("flutter_windows_source") {
  # Common Windows sources.
  sources = [
    "angle_surface_manager.cc",
    "angle_surface_manager.h",
    "cursor_handler.cc",
    "cursor_handler.h",
    "external_texture_gl.cc",
    "external_texture_gl.h",
    "flutter_key_map.cc",
    "flutter_project_bundle.cc",
    "flutter_project_bundle.h",
    "flutter_windows.cc",
    "flutter_windows_engine.cc",
    "flutter_windows_engine.h",
    "flutter_windows_texture_registrar.cc",
    "flutter_windows_texture_registrar.h",
    "flutter_windows_view.cc",
    "flutter_windows_view.h",
    "keyboard_handler_base.h",
    "keyboard_key_channel_handler.cc",
    "keyboard_key_channel_handler.h",
    "keyboard_key_embedder_handler.cc",
    "keyboard_key_embedder_handler.h",
    "keyboard_key_handler.cc",
    "keyboard_key_handler.h",
    "platform_handler.cc",
    "platform_handler.h",
    "sequential_id_generator.cc",
    "sequential_id_generator.h",
    "system_utils.h",
    "task_runner.h",
    "text_input_plugin.cc",
    "text_input_plugin.h",
    "window_binding_handler.h",
    "window_binding_handler_delegate.h",
    "window_state.h",
  ]

  # Target-specific sources.
  if (target_os == "winuwp") {
    sources += [
      "display_helper_winuwp.cc",
      "display_helper_winuwp.h",
      "flutter_window_winuwp.cc",
      "flutter_window_winuwp.h",
      "flutter_windows_winuwp.cc",
      "game_pad_cursor_winuwp.cc",
      "game_pad_cursor_winuwp.h",
      "game_pad_winuwp.cc",
      "game_pad_winuwp.h",
      "platform_handler_winuwp.cc",
      "platform_handler_winuwp.h",
      "system_utils_winuwp.cc",
      "task_runner_winuwp.cc",
      "task_runner_winuwp.h",
    ]
  } else {
    sources += [
      "dpi_utils_win32.cc",
      "dpi_utils_win32.h",
      "flutter_window_win32.cc",
      "flutter_window_win32.h",
      "flutter_windows_win32.cc",
      "platform_handler_win32.cc",
      "platform_handler_win32.h",
      "system_utils_win32.cc",
      "task_runner_win32.cc",
      "task_runner_win32.h",
      "task_runner_win32_window.cc",
      "task_runner_win32_window.h",
      "text_input_manager_win32.cc",
      "text_input_manager_win32.h",
      "window_proc_delegate_manager_win32.cc",
      "window_proc_delegate_manager_win32.h",
      "window_win32.cc",
      "window_win32.h",
    ]

    libs = [
      "dwmapi.lib",
      "imm32.lib",
    ]
  }

  if (target_os == "winuwp") {
    configs += [ ":cppwinrt_defs" ]
    cflags = [ "/EHsc" ]
  }

  configs += [
    "//flutter/shell/platform/common:desktop_library_implementation",
    "//third_party/angle:gl_prototypes",
  ]

  public_configs = [ ":relative_angle_headers" ]

  if (target_os == "winuwp") {
    defines = [
      "_SILENCE_CLANG_COROUTINE_MESSAGE",
      "FLUTTER_ENGINE_NO_PROTOTYPES",
    ]
  } else {
    defines = [ "FLUTTER_ENGINE_NO_PROTOTYPES" ]
  }

  public_deps = [ ":string_conversion" ]

  deps = [
    ":flutter_windows_headers",
    "//flutter/shell/platform/common:common_cpp",
    "//flutter/shell/platform/common:common_cpp_input",
    "//flutter/shell/platform/common:common_cpp_switches",
    "//flutter/shell/platform/common/client_wrapper:client_wrapper",
    "//flutter/shell/platform/embedder:embedder_as_internal_library",
    "//flutter/shell/platform/windows/client_wrapper:client_wrapper_windows",
    "//flutter/third_party/accessibility",
    "//third_party/angle:libEGL_static",  # the order of libEGL_static and
                                          # libGLESv2_static is important.. if
                                          # reversed, will cause a linker error
                                          # DllMain already defined in
                                          # LIBCMTD.lib
    "//third_party/angle:libGLESv2_static",
    "//third_party/rapidjson",
  ]
}

# String encoding conversion utilities.
source_set("string_conversion") {
  sources = [
    "string_conversion.cc",
    "string_conversion.h",
  ]

  if (target_os == "winuwp") {
    cflags = [ "/EHsc" ]
  }
}

copy("publish_headers_windows") {
  sources = _public_headers
  outputs = [ "$root_out_dir/{{source_file_part}}" ]

  # The Windows header assumes the presence of the common headers.
  deps = [ "//flutter/shell/platform/common:publish_headers" ]
}

shared_library("flutter_windows") {
  deps = [ ":flutter_windows_source" ]

  public_configs = [ "//flutter:config" ]
}

shared_library("flutter_windows_winuwp") {
  deps = [ ":flutter_windows_source" ]
  libs = [ "windowsapp.lib" ]
  public_configs = [ "//flutter:config" ]
}

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

executable("flutter_windows_unittests") {
  testonly = true

  if (target_os == "winuwp") {
    libs = [
      "windowsapp.lib",
      "user32.lib",
    ]
  }

  # Common Windows test sources.
  sources = [
    # "flutter_project_bundle_unittests.cc", //TODO failing due to switches test failing.  Blocked on https://github.com/flutter/flutter/issues/74153
    # "flutter_windows_engine_unittests.cc", //TODO failing to send / receive platform message get plugins working first.  Blocked on https://github.com/flutter/flutter/issues/74155
    "sequential_id_generator_unittests.cc",
    "string_conversion_unittests.cc",
    "system_utils_unittests.cc",
    "testing/engine_modifier.h",
  ]

  # Target-specific sources.
  if (target_os == "winuwp") {
    sources += [ "uwptool_utils_unittests.cc" ]
    # TODO(clarkezone) add UWP tests
    # https://github.com/flutter/flutter/issues/70197
  } else {
    sources += [
      # TODO move first two tests to common once above TODO's unblocked.
      "dpi_utils_win32_unittests.cc",
      "flutter_project_bundle_unittests.cc",
      "flutter_window_win32_unittests.cc",
      "flutter_windows_engine_unittests.cc",
      "flutter_windows_texture_registrar_unittests.cc",
      "flutter_windows_view_unittests.cc",
      "keyboard_key_channel_handler_unittests.cc",
      "keyboard_key_embedder_handler_unittests.cc",
      "keyboard_key_handler_unittests.cc",
      "keyboard_unittests.cc",
      "platform_handler_unittests.cc",
      "testing/flutter_window_win32_test.cc",
      "testing/flutter_window_win32_test.h",
      "testing/mock_window_binding_handler.cc",
      "testing/mock_window_binding_handler.h",
      "testing/mock_window_win32.cc",
      "testing/mock_window_win32.h",
      "testing/test_keyboard.cc",
      "testing/test_keyboard.h",
      "testing/test_keyboard_unittests.cc",
      "testing/wm_builders.cc",
      "testing/wm_builders.h",
      "text_input_plugin_unittest.cc",
      "window_proc_delegate_manager_win32_unittests.cc",
      "window_win32_unittests.cc",
    ]
  }

  public_configs = [ "//flutter:config" ]

  deps = [
    ":flutter_windows_fixtures",
    ":flutter_windows_headers",
    ":flutter_windows_source",
    "//flutter/shell/platform/common:common_cpp",
    "//flutter/shell/platform/embedder:embedder_as_internal_library",
    "//flutter/shell/platform/embedder:embedder_test_utils",
    "//flutter/testing",
    "//third_party/rapidjson",
  ]

  if (target_os == "winuwp") {
    deps += [ ":uwptool_utils" ]
  }
}

shared_library("flutter_windows_glfw") {
  deps = [ "//flutter/shell/platform/glfw:flutter_glfw" ]

  public_configs = [ "//flutter:config" ]
}

group("windows_glfw") {
  deps = [
    ":flutter_windows",
    ":flutter_windows_glfw",
    "//flutter/shell/platform/glfw:publish_headers_glfw",
    "//flutter/shell/platform/glfw/client_wrapper:publish_wrapper_glfw",
  ]
}

group("windows") {
  if (target_os == "winuwp") {
    deps = [
      ":flutter_windows_winuwp",
      ":publish_headers_windows",
      ":uwptool",
      "//flutter/shell/platform/windows/client_wrapper:publish_wrapper_windows",
    ]
  } else {
    deps = [
      ":flutter_windows",
      ":publish_headers_windows",
      "//flutter/shell/platform/windows/client_wrapper:publish_wrapper_windows",
    ]
  }

  if (build_glfw_shell) {
    deps += [ ":windows_glfw" ]
  }
}

# uwptool utilities.
source_set("uwptool_utils") {
  if (target_os == "winuwp") {
    configs += [ ":cppwinrt_defs" ]
    cflags = [ "/EHsc" ]
  }

  sources = [
    "uwptool_commands.cc",
    "uwptool_commands.h",
    "uwptool_utils.cc",
    "uwptool_utils.h",
  ]

  deps = [ ":string_conversion" ]
}

# Command-line tool used by the flutter tool that serves a similar purpose to
# adb for Android or libimobiledevice for iOS apps. Supports installing,
# uninstalling, launching apps.
executable("uwptool") {
  if (target_os == "winuwp") {
    configs += [ ":cppwinrt_defs" ]
    cflags = [ "/EHsc" ]
    libs = [
      "windowsapp.lib",
      "user32.lib",
    ]
  }

  sources = [ "uwptool_main.cc" ]
  deps = [
    ":string_conversion",
    ":uwptool_utils",
    "//flutter/fml:command_line",
  ]
}
