# 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.cc",
    "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",
    "task_runner_unittests.cc",
    "testing/engine_modifier.h",
    "testing/mock_gl_functions.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" ]

  defines = [ "_SILENCE_CLANG_COROUTINE_MESSAGE" ]
}

# 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",
  ]

  defines = [ "_SILENCE_CLANG_COROUTINE_MESSAGE" ]
}
