# stream_core_obj — C-only object library used by both the Python
# extension and the standalone streaming examples.
# nats_vendor_static provides NATS headers and the static libnats.a (the
# nats:// transport; pure C, TLS/STAN off — see the root CMakeLists).
# Skipped on Windows: the vendored nats.c build's MinGW support is unverified
# (kept conservative pending a dedicated Windows-streaming follow-up).
if(NOT WIN32)
    # tlm_sink.c is the telemetry NATS sink (stream/tlm_sink.h): stream-
    # component code because it publishes through dp_pub_*. Its dp_tlm_read
    # reference resolves against dp_tlm_core, which lives in the core lib
    # — consumers link doppler::stream alongside the core; targets here that
    # embed stream_core_obj directly link dp_tlm_core explicitly.
    add_library(stream_core_obj OBJECT stream_core.c stream_nats.c
        tlm_sink.c)
    target_include_directories(stream_core_obj PUBLIC
        ${CMAKE_SOURCE_DIR}/native/inc)
    target_link_libraries(stream_core_obj PUBLIC
        nats_vendor_static)
    set_target_properties(stream_core_obj PROPERTIES
        POSITION_INDEPENDENT_CODE ON)
endif()

if(NOT WIN32)
    add_executable(bench_stream
        ${CMAKE_SOURCE_DIR}/native/benchmarks/bench_stream.c)
    target_link_libraries(bench_stream PRIVATE
        $<TARGET_OBJECTS:stream_core_obj> $<TARGET_OBJECTS:dp_interrupt_obj>
        dp_tlm_core
        nats_vendor_static
        m pthread)
    target_include_directories(bench_stream PRIVATE
        ${CMAKE_SOURCE_DIR}/native/inc)
    set_target_properties(bench_stream PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/native/benchmarks")
endif()

# The wire format itself: layout, magic, BLUE codes, flag mask. No broker,
# so unlike the round-trip tests below it runs everywhere -- which is the
# point, since the layout is what a third party implements from stream.h.
add_executable(test_stream_wire
    ${CMAKE_SOURCE_DIR}/native/tests/test_stream_wire.c)
target_link_libraries(test_stream_wire PRIVATE
    $<TARGET_OBJECTS:stream_core_obj> $<TARGET_OBJECTS:dp_interrupt_obj>
    dp_tlm_core
    nats_vendor_static
    m pthread)
target_include_directories(test_stream_wire PRIVATE
    ${CMAKE_SOURCE_DIR}/native/inc)
add_test(NAME test_stream_wire COMMAND test_stream_wire)

if(NOT WIN32)
    add_executable(test_stream_nats_core
        ${CMAKE_SOURCE_DIR}/native/tests/test_stream_nats_core.c)
    target_link_libraries(test_stream_nats_core PRIVATE
        $<TARGET_OBJECTS:stream_core_obj> $<TARGET_OBJECTS:dp_interrupt_obj>
        dp_tlm_core
        nats_vendor_static
        m pthread)
    target_include_directories(test_stream_nats_core PRIVATE
        ${CMAKE_SOURCE_DIR}/native/inc)
    add_test(NAME test_stream_nats_core COMMAND test_stream_nats_core)
    set_tests_properties(test_stream_nats_core PROPERTIES
        SKIP_RETURN_CODE 77)

    # Telemetry-ring -> NATS round-trip (skips without a live broker, like
    # test_stream_nats_core).
    add_executable(test_tlm_sink
        ${CMAKE_SOURCE_DIR}/native/tests/test_tlm_sink.c)
    target_link_libraries(test_tlm_sink PRIVATE
        $<TARGET_OBJECTS:stream_core_obj> $<TARGET_OBJECTS:dp_interrupt_obj>
        dp_tlm_core
        nats_vendor_static
        m pthread)
    target_include_directories(test_tlm_sink PRIVATE
        ${CMAKE_SOURCE_DIR}/native/inc)
    add_test(NAME test_tlm_sink COMMAND test_tlm_sink)
    set_tests_properties(test_tlm_sink PROPERTIES
        SKIP_RETURN_CODE 77)
endif()

if(BUILD_PYTHON)
    Python3_add_library(stream MODULE WITH_SOABI stream_ext.c)
    target_link_libraries(stream PRIVATE
        $<TARGET_OBJECTS:stream_core_obj> $<TARGET_OBJECTS:dp_interrupt_obj>
        dp_tlm_core
        nats_vendor_static
        Python3::NumPy
        m pthread)
    target_include_directories(stream PRIVATE ${CMAKE_SOURCE_DIR}/native/inc)
    set_target_properties(stream PROPERTIES
        LIBRARY_OUTPUT_DIRECTORY "${PYTHON_PACKAGE_DIR}/stream")
endif()
