cmake_minimum_required(VERSION 3.22)

project(rdp_worker LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

find_package(PkgConfig REQUIRED)
find_package(Threads REQUIRED)
find_package(OpenSSL REQUIRED)
find_package(Boost REQUIRED)
pkg_check_modules(FREERDP REQUIRED IMPORTED_TARGET freerdp2)
pkg_check_modules(FREERDP_CLIENT REQUIRED IMPORTED_TARGET freerdp-client2)
pkg_check_modules(WINPR REQUIRED IMPORTED_TARGET winpr2)

set(RDP_WORKER_COMMON_SOURCES
    src/adapter/adapter_event_router.cpp
    src/adapter/rdp_adapter_runtime.cpp
    src/adapter/service_adapter_protocol.cpp
    src/common/json.cpp
    src/common/logger.cpp
    src/common/time.cpp
    src/cursor/cursor_adapter.cpp
    src/cursor/cursor_update.cpp
    src/graphics/graphics_adapter.cpp
    src/graphics/render_update.cpp
    src/config/config.cpp
    src/coordination/redis_client.cpp
    src/coordination/control_plane.cpp
    src/dataplane/direct_wss_server.cpp
    src/dataplane/token_validator.cpp
    src/runtime/direct_bind_policy.cpp
    src/runtime/session_manager.cpp
    src/runtime/session_runtime.cpp
    src/freerdp/rdp_runtime.cpp
)

add_executable(rdp-worker
    src/main.cpp
    ${RDP_WORKER_COMMON_SOURCES}
)

add_executable(rdp-worker-dataplane-token-probe
    src/tools/data_plane_token_probe.cpp
    src/common/json.cpp
    src/dataplane/token_validator.cpp
)

add_executable(rdp-worker-dataplane-bind-probe
    src/tools/data_plane_bind_probe.cpp
    src/runtime/direct_bind_policy.cpp
)

add_executable(rdp-worker-graphics-adapter-probe
    src/tools/graphics_adapter_probe.cpp
    src/graphics/graphics_adapter.cpp
    src/graphics/render_update.cpp
)

add_executable(rdp-worker-cursor-adapter-probe
    src/tools/cursor_adapter_probe.cpp
    src/common/json.cpp
    src/cursor/cursor_adapter.cpp
    src/cursor/cursor_update.cpp
)

add_executable(rdp-worker-service-adapter-protocol-probe
    src/tools/service_adapter_protocol_probe.cpp
    src/adapter/service_adapter_protocol.cpp
)

target_include_directories(rdp-worker
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_include_directories(rdp-worker-dataplane-token-probe
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_include_directories(rdp-worker-dataplane-bind-probe
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_include_directories(rdp-worker-graphics-adapter-probe
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_include_directories(rdp-worker-cursor-adapter-probe
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_include_directories(rdp-worker-service-adapter-protocol-probe
    PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_link_libraries(rdp-worker
    PRIVATE
        Threads::Threads
        OpenSSL::SSL
        OpenSSL::Crypto
        Boost::headers
        PkgConfig::FREERDP
        PkgConfig::FREERDP_CLIENT
        PkgConfig::WINPR
)

target_link_libraries(rdp-worker-dataplane-token-probe
    PRIVATE
        OpenSSL::Crypto
        Boost::headers
)

target_link_libraries(rdp-worker-dataplane-bind-probe
    PRIVATE
        Boost::headers
)

if(WIN32)
    target_link_libraries(rdp-worker PRIVATE ws2_32)
endif()

include(GNUInstallDirs)

install(TARGETS rdp-worker rdp-worker-dataplane-token-probe rdp-worker-dataplane-bind-probe
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(TARGETS rdp-worker-graphics-adapter-probe
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(TARGETS rdp-worker-cursor-adapter-probe
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(TARGETS rdp-worker-service-adapter-protocol-probe
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
