cmake_minimum_required(VERSION 3.20)

project(cvmmap-streamer LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

find_package(Threads REQUIRED)

if (EXISTS "${CMAKE_CURRENT_LIST_DIR}/lib/CLI11/CMakeLists.txt")
	add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/lib/CLI11" "${CMAKE_CURRENT_BINARY_DIR}/vendor/cli11")
endif()

find_package(cppzmq QUIET)
find_package(ZeroMQ QUIET)
find_package(spdlog REQUIRED)
find_package(PkgConfig REQUIRED)

pkg_check_modules(GSTREAMER
	IMPORTED_TARGET
	gstreamer-1.0>=1.14
	gstreamer-video-1.0>=1.14
	gstreamer-app-1.0>=1.14)

if (NOT GSTREAMER_FOUND)
	message(FATAL_ERROR
		"GStreamer development packages are required for cvmmap-streamer. "
		"Install pkg-config modules: gstreamer-1.0>=1.14, gstreamer-video-1.0>=1.14, "
		"and gstreamer-app-1.0>=1.14.")
endif()

add_library(cvmmap_streamer_common STATIC
	src/ipc/help.cpp
	src/config/runtime_config.cpp
	src/core/frame_source.cpp
	src/core/ingest_runtime.cpp
	src/ipc/contracts.cpp
	src/sim/wire.cpp
	lib/cvmmap-client-cpp/app_cvmmap_client.cpp
	lib/cvmmap-client-cpp/app_cvmmap_parser.cpp
	src/metrics/latency_tracker.cpp
	src/pipeline/pipeline_runtime.cpp
	src/protocol/rtmp_publisher.cpp
	src/protocol/rtp_publisher.cpp)

target_include_directories(cvmmap_streamer_common
	PUBLIC
	"${CMAKE_CURRENT_LIST_DIR}/include"
	PRIVATE
	"${CMAKE_CURRENT_LIST_DIR}/lib/cvmmap-client-cpp"
	"${CMAKE_CURRENT_LIST_DIR}/lib/cvmmap-client-cpp/include")
set(CVMAP_STREAMER_LINK_DEPS Threads::Threads)

if (TARGET cppzmq::cppzmq)
	list(APPEND CVMAP_STREAMER_LINK_DEPS cppzmq::cppzmq)
elseif (TARGET cppzmq)
	list(APPEND CVMAP_STREAMER_LINK_DEPS cppzmq)
endif()

if (TARGET ZeroMQ::libzmq)
	list(APPEND CVMAP_STREAMER_LINK_DEPS ZeroMQ::libzmq)
elseif (TARGET ZeroMQ::ZeroMQ)
	list(APPEND CVMAP_STREAMER_LINK_DEPS ZeroMQ::ZeroMQ)
endif()

if (TARGET ZeroMQ::cppzmq)
	list(APPEND CVMAP_STREAMER_LINK_DEPS ZeroMQ::cppzmq)
elseif (TARGET cppzmq::cppzmq)
	list(APPEND CVMAP_STREAMER_LINK_DEPS cppzmq::cppzmq)
endif()


if (NOT TARGET PkgConfig::GSTREAMER)
	message(FATAL_ERROR
		"GStreamer packages were detected but PkgConfig::GSTREAMER target is unavailable. "
		"Please ensure GStreamer development toolchain is correctly installed.")
endif()

list(APPEND CVMAP_STREAMER_LINK_DEPS PkgConfig::GSTREAMER)


if (TARGET spdlog::spdlog)
	list(APPEND CVMAP_STREAMER_LINK_DEPS spdlog::spdlog)
elseif (TARGET spdlog)
	list(APPEND CVMAP_STREAMER_LINK_DEPS spdlog)
endif()

if (TARGET CLI11::CLI11)
	list(APPEND CVMAP_STREAMER_LINK_DEPS CLI11::CLI11)
endif()

target_link_libraries(cvmmap_streamer_common PUBLIC ${CVMAP_STREAMER_LINK_DEPS})

function(add_cvmmap_binary target source)
	add_executable(${target} ${source} ${ARGN})
	target_include_directories(${target}
		PRIVATE
		"${CMAKE_CURRENT_LIST_DIR}/include")
	target_link_libraries(${target}
		PRIVATE
		cvmmap_streamer_common)
	set_target_properties(${target} PROPERTIES OUTPUT_NAME "${target}")
endfunction()

add_cvmmap_binary(cvmmap_streamer src/main_streamer.cpp)
add_cvmmap_binary(rtp_receiver_tester src/testers/rtp_receiver_tester.cpp)
add_cvmmap_binary(rtmp_stub_tester src/testers/rtmp_stub_tester.cpp)
add_cvmmap_binary(ipc_snapshot_tester src/testers/ipc_snapshot_tester.cpp)
