# Standalone as well as included by the game, so transport tests need no disc.
cmake_minimum_required(VERSION 3.20)
project(HazeNetwork LANGUAGES C CXX)
include(FetchContent)
set(ENABLE_PROGRAMS OFF CACHE BOOL "" FORCE)
set(ENABLE_TESTING OFF CACHE BOOL "" FORCE)
set(DISABLE_PACKAGE_CONFIG_AND_INSTALL OFF CACHE BOOL "" FORCE)
set(USE_SHARED_MBEDTLS_LIBRARY OFF CACHE BOOL "" FORCE)
set(MBEDTLS_USER_CONFIG_FILE "${CMAKE_CURRENT_SOURCE_DIR}/mbedtls_config.h" CACHE FILEPATH "" FORCE)
FetchContent_Declare(haze_mbedtls
    GIT_REPOSITORY https://github.com/Mbed-TLS/mbedtls.git
    GIT_TAG e185d7fd85499c8ce5ca2a54f5cf8fe7dbe3f8df
    GIT_SUBMODULES framework)
FetchContent_MakeAvailable(haze_mbedtls)
add_library(MbedTLS::MbedTLS ALIAS mbedtls)
set(USE_MBEDTLS ON CACHE BOOL "" FORCE)
set(NO_MEDIA ON CACHE BOOL "" FORCE)
set(NO_EXAMPLES ON CACHE BOOL "" FORCE)
set(NO_TESTS ON CACHE BOOL "" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
FetchContent_Declare(haze_datachannel
    GIT_REPOSITORY https://github.com/paullouisageneau/libdatachannel.git
    GIT_TAG 6b1e2e620f1e37f0eafeee702eaea0043cb305fd
    GIT_SUBMODULES deps/libjuice deps/usrsctp deps/plog deps/json)
FetchContent_MakeAvailable(haze_datachannel)
find_package(Python3 COMPONENTS Interpreter REQUIRED)
set(_ws_source "${haze_datachannel_SOURCE_DIR}/src/impl/websocket.cpp")
set(_verified_ws "${CMAKE_CURRENT_BINARY_DIR}/verified_websocket.cpp")
execute_process(COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/patch_verified_tls.py"
    "${_ws_source}" "${_verified_ws}" RESULT_VARIABLE _tls_patch_result)
if(NOT _tls_patch_result EQUAL 0)
    message(FATAL_ERROR "Could not enable verified WebSocket TLS")
endif()
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/patch_verified_tls.py" "${_ws_source}")
get_target_property(_dc_sources datachannel SOURCES)
list(FIND _dc_sources "${_ws_source}" _ws_index)
if(_ws_index LESS 0)
    message(FATAL_ERROR "libdatachannel WebSocket source missing")
endif()
list(REMOVE_AT _dc_sources ${_ws_index})
list(APPEND _dc_sources "${_verified_ws}")
set_property(TARGET datachannel PROPERTY SOURCES "${_dc_sources}")
set_source_files_properties("${_verified_ws}" TARGET_DIRECTORY datachannel PROPERTIES INCLUDE_DIRECTORIES "${haze_datachannel_SOURCE_DIR}/src/impl")
add_library(haze_network STATIC session.cpp invite_code.cpp)
target_compile_features(haze_network PUBLIC cxx_std_20)
target_include_directories(haze_network PRIVATE "${haze_datachannel_SOURCE_DIR}/deps/json/include")
target_link_libraries(haze_network PRIVATE datachannel)
if(WIN32)
    target_link_libraries(haze_network PRIVATE crypt32)
endif()
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
    add_executable(test_network_session "${CMAKE_CURRENT_SOURCE_DIR}/../../tests/test_network_session.cpp")
    target_include_directories(test_network_session PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
    target_link_libraries(test_network_session PRIVATE haze_network)
    add_executable(network_relay "${CMAKE_CURRENT_SOURCE_DIR}/../../tests/network_relay.cpp")
    target_link_libraries(network_relay PRIVATE juice)
endif()
