set(STATIC_LIB etgen_impl)

set(LIB_SRC
  driver_common.cc
  driver_requester.cc
  driver_responder.cc
  ssh.cc
  tls.cc
  command.pb.cc
  transcript.pb.cc
  curvezmq.cc
  rs.cc
)

find_library(LIBSSH ssh)
find_package(Boost REQUIRED COMPONENTS log_setup log program_options serialization)
find_package(OpenSSL REQUIRED)
find_package(cppzmq REQUIRED)
find_package(cereal REQUIRED)
#find_package(Protobuf CONFIG REQUIRED)
find_package(PkgConfig REQUIRED)

pkg_check_modules(LIBZMQ REQUIRED libzmq)
pkg_check_modules(LIBCURVE REQUIRED libcurve)
pkg_check_modules(LIBCZMQ REQUIRED libczmq)
pkg_check_modules(PROTOBUF REQUIRED protobuf)
pkg_check_modules(ETGENRS REQUIRED libetgen_rs)
pkg_check_modules(LIBSODIUM REQUIRED libsodium)

add_library(${STATIC_LIB} STATIC ${LIB_SRC})

target_compile_options(${STATIC_LIB} PRIVATE ${WARNING_FLAGS} ${COMMON_FLAGS})

target_compile_options(${STATIC_LIB} PUBLIC
  ${LIBCURVE_CFLAGS}
  ${LIBCZMQ_CFLAGS}
  ${PROTOBUF_CFLAGS}
)

target_link_options(${STATIC_LIB} PUBLIC
  ${LIBCURVE_LDFLAGS}
  ${LIBCZMQ_LDFLAGS}
  ${PROTOBUF_LDFLAGS}
)

target_link_libraries(${STATIC_LIB} PRIVATE
  ${LIBSSH} OpenSSL::SSL OpenSSL::Crypto cppzmq
  ${LIBCURVE_LIBRARIES} ${LIBCZMQ_LIBRARIES} ${ETGENRS_LIBRARIES})

target_include_directories(${STATIC_LIB} PRIVATE ${LIBCURVE_INCLUDE_DIRS}
  ${LIBCZMQ_INCLUDE_DIRS} ${ETGENRS_INCLUDE_DIRS} .)

target_include_directories(${STATIC_LIB} PUBLIC ${Boost_INCLUDE_DIRS}
  ${PROTOBUF_INCLUDE_DIRS} .)

target_link_libraries(${STATIC_LIB} PUBLIC ${Boost_LIBRARIES}
  ${PROTOBUF_LIBRARIES} cereal)

#add_executable(fwd_proxy fwd_proxy.cc)
#target_include_directories(fwd_proxy PRIVATE ${Boost_INCLUDE_DIRS} .)
#target_link_libraries(fwd_proxy PRIVATE ${Boost_LIBRARIES})

# -- ENDPOINT --
add_executable(endpoint endpoint_main.cc)
target_link_libraries(endpoint PRIVATE
  ${STATIC_LIB}
  cppzmq
)
target_compile_options(endpoint PRIVATE ${WARNING_FLAGS} ${COMMON_FLAGS})
target_link_options(endpoint PRIVATE ${COMMON_LINK_OPTS})

set_target_properties(endpoint PROPERTIES BUILD_RPATH
  "${LIBCURVE_LIBDIR}:${LIBCZMQ_LIBDIR}:${LIBSODIUM_LIBDIR}:${LIBZMQ_LIBDIR}:${ETGENRS_LIBDIR}")
# -- ENDPOINT --

# -- CONTROLLER --
add_executable(controller controller_main.cc)

target_link_libraries(controller PRIVATE
  ${STATIC_LIB}
  cppzmq
)

target_compile_options(controller PRIVATE ${WARNING_FLAGS} ${COMMON_FLAGS})
target_link_options(controller PRIVATE ${COMMON_LINK_OPTS})

set_target_properties(controller PROPERTIES BUILD_RPATH
  "${LIBCURVE_LIBDIR}:${LIBCZMQ_LIBDIR}:${LIBSODIUM_LIBDIR}:${LIBZMQ_LIBDIR}:${ETGENRS_LIBDIR}")
# -- CONTROLLER --

set(MAKE_TESTS OFF CACHE BOOL "Build tests.")

if(MAKE_TESTS)
  set(TEST_EXE etgen_tests)

  include(FetchContent)
  FetchContent_Declare(
    googletest
    URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
  )
  # For Windows: Prevent overriding the parent project's compiler/linker settings
  set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
  FetchContent_MakeAvailable(googletest)

  enable_testing()

  add_executable(${TEST_EXE}
    test_common.cc
    test_driver.cc
    test_tls.cc
    test_main.cc
    test_ssh.cc
    test_curvezmq.cc
    test_rs.cc
  )

  target_link_libraries(${TEST_EXE} PRIVATE
    GTest::gtest
    ${STATIC_LIB}
    cppzmq
  )

  target_compile_options(${TEST_EXE} PRIVATE ${WARNING_FLAGS} ${COMMON_FLAGS})
  target_link_options(${TEST_EXE} PRIVATE ${COMMON_LINK_OPTS})

  set_target_properties(${TEST_EXE} PROPERTIES BUILD_RPATH
    "${LIBCURVE_LIBDIR}:${LIBCZMQ_LIBDIR}:${LIBSODIUM_LIBDIR}")

  include(GoogleTest)
  gtest_discover_tests(etgen_tests)
endif()
