cmake_minimum_required(VERSION 3.22)

include(FetchContent)

project("rsmpl"
  LANGUAGES CXX
)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the build type" FORCE)

    # Include "None" as option to disable any additional (optimization) flags,
    # relying on just CMAKE_C_FLAGS and CMAKE_CXX_FLAGS (which are empty by
    # default). These strings are presented in cmake-gui.
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
        "None" "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
endif()

option(RSMPL_WITH_TESTS "Compile tests" ON)
option(RSMPL_WITH_PYTHON_BINDINGS "Compile python bindings" ON)

# use the x to avoid conflicts with python lib
add_library(rsmplx INTERFACE)
add_library(rsmpl::rsmpl ALIAS rsmplx)

# set_target_properties(rsmplx PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
target_compile_features(rsmplx INTERFACE cxx_std_20)

target_include_directories(rsmplx INTERFACE
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>
)

include(GNUInstallDirs)
install(
  TARGETS rsmplx
  EXPORT rsmpl-targets
  INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  )
install(
  DIRECTORY "${PROJECT_SOURCE_DIR}/include/"
  DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(EXPORT rsmpl-targets
 DESTINATION cmake/rsmpl
 NAMESPACE rsmpl::
 )
export(TARGETS rsmplx
  NAMESPACE rsmpl::
  FILE "${PROJECT_BINARY_DIR}/rsmpl-config.cmake"
)

if (RSMPL_WITH_PYTHON_BINDINGS)
  find_package(Python COMPONENTS Interpreter Development)

  mark_as_advanced(NB_TEST NB_TEST_CUDA NB_TEST_FREE_THREADED
    NB_TEST_SANITIZERS_ASAN NB_TEST_SANITIZERS_TSAN NB_TEST_SANITIZERS_UBSAN
    NB_TEST_SHARED_BUILD NB_TEST_STABLE_ABI NB_USE_SUBMODULE_DEPS
    NB_CREATE_INSTALL_RULES
  )
  mark_as_advanced(FETCHCONTENT_UPDATES_DISCONNECTED_NANOBIND)
  mark_as_advanced(FETCHCONTENT_SOURCE_DIR_NANOBIND)

  FetchContent_Declare(
    nanobind
    GIT_REPOSITORY https://github.com/wjakob/nanobind.git
    GIT_TAG v2.12.0
  )
  FetchContent_MakeAvailable(nanobind)
  
  nanobind_add_module(rsmpl
    NB_STATIC STABLE_ABI LTO
    src/pyrsmpl.cpp
  )

  target_link_libraries(rsmpl PRIVATE rsmplx Python::Python)

  install(TARGETS rsmpl
  COMPONENT python
  LIBRARY DESTINATION "lib/python${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}/site-packages"
)
endif()

if (RSMPL_WITH_TESTS)
  mark_as_advanced(FETCHCONTENT_UPDATES_DISCONNECTED_GOOGLETEST)
  mark_as_advanced(FETCHCONTENT_SOURCE_DIR_GOOGLETEST)
  set(BUILD_GMOCK  OFF CACHE BOOL "Builds the googlemock subproject" FORCE)
  mark_as_advanced(BUILD_GMOCK)
  set(GTEST_HAS_ABSL OFF CACHE BOOL "Use Abseil and RE2." FORCE)
  mark_as_advanced(GTEST_HAS_ABSL)
  set(INSTALL_GTEST OFF CACHE BOOL "Enable installation of googletest." FORCE)
  mark_as_advanced(INSTALL_GTEST)
  
  FetchContent_Declare(
    googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG v1.17.0
  )
  set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
  FetchContent_MakeAvailable(googletest)
    
  enable_testing()

  add_executable(tests
    tests/filter_test.cpp
    tests/interpolation_test.cpp
    tests/zero_spaced_signal_test.cpp
    tests/resample_test.cpp
    tests/windowing_test.cpp
  )    
  target_link_libraries(tests
    GTest::gtest_main
    rsmplx
  )

  include(GoogleTest)
  gtest_discover_tests(tests)

endif()

