cmake_minimum_required(VERSION 3.16)
project(craftlabs_auth_bitanswer LANGUAGES C CXX)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CRAFTLABS_AUTH_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}")

option(CRAFTLABS_BUILD_JNI "Build JNI bridge (requires JDK)" ON)
option(CRAFTLABS_BUILD_TESTS "Build native smoke tests" ON)

set(CRAFTLABS_AUTH_CORE_SOURCES
    "${CRAFTLABS_AUTH_SRC_DIR}/src/craftlabs_auth.cpp"
    "${CRAFTLABS_AUTH_SRC_DIR}/src/bitanswer/bitanswer_adapter.cpp"
    "${CRAFTLABS_AUTH_SRC_DIR}/src/selfhosted/http_client.cpp"
    "${CRAFTLABS_AUTH_SRC_DIR}/src/selfhosted/selfhosted_adapter.cpp"
)

if(CRAFTLABS_BUILD_JNI)
  find_package(JNI REQUIRED)
  list(APPEND CRAFTLABS_AUTH_CORE_SOURCES
      "${CRAFTLABS_AUTH_SRC_DIR}/src/jni/jni_bridge.cpp")
endif()

add_library(craftlabs_auth_bitanswer SHARED ${CRAFTLABS_AUTH_CORE_SOURCES})

target_include_directories(craftlabs_auth_bitanswer
    PUBLIC
        "${CRAFTLABS_AUTH_SRC_DIR}/include"
    PRIVATE
        "${CRAFTLABS_AUTH_SRC_DIR}/src"
)

if(CRAFTLABS_BUILD_JNI)
  target_include_directories(craftlabs_auth_bitanswer PRIVATE ${JNI_INCLUDE_DIRS})
endif()

if(WIN32)
  target_compile_definitions(craftlabs_auth_bitanswer PRIVATE CRAFTLABS_AUTH_PLATFORM_WINDOWS=1)
elseif(APPLE)
  target_compile_definitions(craftlabs_auth_bitanswer PRIVATE CRAFTLABS_AUTH_PLATFORM_MACOS=1)
else()
  target_compile_definitions(craftlabs_auth_bitanswer PRIVATE CRAFTLABS_AUTH_PLATFORM_LINUX=1)
endif()

if(CRAFTLABS_BUILD_TESTS)
  enable_testing()
  add_executable(craftlabs_auth_smoke
      "${CRAFTLABS_AUTH_SRC_DIR}/tests/smoke_test.cpp")
  target_link_libraries(craftlabs_auth_smoke PRIVATE craftlabs_auth_bitanswer)
  target_include_directories(craftlabs_auth_smoke PRIVATE
      "${CRAFTLABS_AUTH_SRC_DIR}/include")
  set_target_properties(craftlabs_auth_smoke PROPERTIES
      BUILD_RPATH "$<TARGET_FILE_DIR:craftlabs_auth_bitanswer>")
  add_test(NAME craftlabs_auth_smoke COMMAND craftlabs_auth_smoke)
endif()
