cmake_minimum_required(VERSION 3.14)

include("${CMAKE_CURRENT_SOURCE_DIR}/prepare.cmake")

if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.rapid")
  message(FATAL_ERROR "no prebuilt libraries found in .rapid ! \n")
endif()

set(PROJECT_NAME "rapid_kit")
project(${PROJECT_NAME} LANGUAGES CXX)

cmake_policy(VERSION 3.14...3.25)

set(PLUGIN_NAME "rapid_kit_plugin")

list(APPEND PLUGIN_SOURCES
  "rapid_kit_plugin.cpp"  
  "rapid_kit_texture.cpp"
)

add_library(${PLUGIN_NAME} SHARED
"include/rapid_kit/rapid_kit_plugin.h"
  "include/rapid_kit/rapid_kit_plugin_c_api.h"
  "include/rapid_kit/rapid_kit_texture.h"
  "rapid_kit_plugin_c_api.cpp"
  ${PLUGIN_SOURCES}
)

include_directories(
"${CMAKE_CURRENT_SOURCE_DIR}/include"
"${CMAKE_CURRENT_SOURCE_DIR}/.rapid/core/include"
"${CMAKE_CURRENT_SOURCE_DIR}/.rapid/media/include"
"${CMAKE_CURRENT_SOURCE_DIR}/.rapid/sdl/include"
)

apply_standard_settings(${PLUGIN_NAME})

set_target_properties(${PLUGIN_NAME} PROPERTIES
  CXX_VISIBILITY_PRESET hidden)
target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)

target_include_directories(${PLUGIN_NAME} INTERFACE
  "${CMAKE_CURRENT_SOURCE_DIR}/include"
  "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/core/include"
  "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/media/include"
  "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/sdl/include"
  )
target_link_libraries(${PLUGIN_NAME} flutter flutter_wrapper_plugin)


add_library(libRapidCore SHARED IMPORTED)
set_target_properties(libRapidCore PROPERTIES 
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libRapidCore.dll"
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libRapidCore.dll.a"
)
add_library(libRapidMedia SHARED IMPORTED)
set_target_properties(libRapidMedia PROPERTIES 
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libRapidMedia.dll"
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libRapidMedia.dll.a"
)
add_library(libRapidSDL SHARED IMPORTED)
set_target_properties(libRapidSDL PROPERTIES 
IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libRapidSDL.dll"
IMPORTED_IMPLIB "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libRapidSDL.dll.a"
)
target_link_libraries(${PLUGIN_NAME} libRapidCore)
target_link_libraries(${PLUGIN_NAME} libRapidMedia)
target_link_libraries(${PLUGIN_NAME} libRapidSDL)

set(rapid_kit_bundled_libraries
  ""
  PARENT_SCOPE
)

if (${include_${PROJECT_NAME}_tests})
set(TEST_RUNNER "${PROJECT_NAME}_test")
enable_testing()

include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/release-1.11.0.zip
)
# Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Disable install commands for gtest so it doesn't end up in the bundle.
set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest" FORCE)
FetchContent_MakeAvailable(googletest)

# The plugin's C API is not very useful for unit testing, so build the sources
# directly into the test binary rather than using the DLL.

apply_standard_settings(${TEST_RUNNER})
target_include_directories(${TEST_RUNNER} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(${TEST_RUNNER} PRIVATE flutter_wrapper_plugin)
target_link_libraries(${TEST_RUNNER} PRIVATE gtest_main gmock)
# flutter_wrapper_plugin has link dependencies on the Flutter DLL.
add_custom_command(TARGET ${TEST_RUNNER} POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E copy_if_different
  "${FLUTTER_LIBRARY}" $<TARGET_FILE_DIR:${TEST_RUNNER}>
)

# Enable automatic test discovery.
include(GoogleTest)
gtest_discover_tests(${TEST_RUNNER})
endif()

set(rapid_kit_bundled_libraries
  "${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/glfw3.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libwinpthread-1.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/vcruntime140.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libstdc++-6.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/liblzma-5.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/zlib1.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libiconv-2.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libgcc_s_seh-1.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/vcruntime140_1.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libbz2-1.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/msvcp140.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/avcodec-60.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/avfilter-9.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/avformat-60.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/avutil-58.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libEGL.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libGLESv2.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libx264-164.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/postproc-57.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/PPCS_API.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/swresample-4.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/swscale-7.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libRapidCore.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libRapidMedia.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libRapidSDL.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/webrtc.dll;${CMAKE_CURRENT_SOURCE_DIR}/.rapid/lib/libxlog.dll"
  PARENT_SCOPE
)