cmake_minimum_required(VERSION 3.15...3.26)
project(${SKBUILD_PROJECT_NAME} LANGUAGES CXX)

option(BUILD_TESTING "Build Catch2-based native tests" OFF)

set(PYBIND11_FINDPYTHON ON)
find_package(pybind11 CONFIG REQUIRED)

# Build a reusable core library so other language bindings can reuse it
add_library(asbm_core STATIC
    src/MCMC_core.cpp
    src/MCMC_proposals.cpp
    src/MCMC_bookkeeping.cpp
    src/helpers.cpp
    src/fit_result.cpp)
target_include_directories(asbm_core PUBLIC ${CMAKE_SOURCE_DIR}/src)
set_target_properties(asbm_core PROPERTIES POSITION_INDEPENDENT_CODE ON)
target_compile_definitions(asbm_core PRIVATE MCMC_CORE_NO_PYBIND $<$<CXX_COMPILER_ID:MSVC>:_USE_MATH_DEFINES>)
target_compile_features(asbm_core PUBLIC cxx_std_17)

# Python bindings: build a small pybind11 module that links to the core
pybind11_add_module(_asbm MODULE bindings/python/bindings.cpp)
target_link_libraries(_asbm PRIVATE asbm_core)
target_include_directories(_asbm PRIVATE ${CMAKE_SOURCE_DIR}/src)
target_compile_features(_asbm PRIVATE cxx_std_17)
set_target_properties(
  _asbm PROPERTIES LIBRARY_OUTPUT_DIRECTORY
                         ${CMAKE_SOURCE_DIR}/python/asbm/src/asbm)
install(TARGETS _asbm LIBRARY DESTINATION ${SKBUILD_PROJECT_NAME})

if(BUILD_TESTING)
  enable_testing()

  find_package(Catch2 3 QUIET)
  if(NOT Catch2_FOUND)
    include(FetchContent)
    FetchContent_Declare(
      Catch2
      GIT_REPOSITORY https://github.com/catchorg/Catch2.git
      GIT_TAG v3.7.1
      GIT_SHALLOW TRUE
    )
    FetchContent_MakeAvailable(Catch2)
    list(APPEND CMAKE_MODULE_PATH "${catch2_SOURCE_DIR}/extras")
  endif()

  add_executable(mcmc_core_test
    tests/mcmc_core_test.cpp
    src/MCMC_core.cpp
    src/MCMC_proposals.cpp
    src/MCMC_bookkeeping.cpp
    src/helpers.cpp
  )
  target_compile_definitions(mcmc_core_test PRIVATE MCMC_CORE_NO_PYBIND)
  target_include_directories(mcmc_core_test PRIVATE tests src)
  target_compile_features(mcmc_core_test PRIVATE cxx_std_17)
  target_compile_options(mcmc_core_test PRIVATE -Wall -Wextra)
  target_link_libraries(mcmc_core_test PRIVATE Catch2::Catch2WithMain)

  include(CTest)
  add_test(NAME mcmc_core_test COMMAND mcmc_core_test)
endif()