cmake_minimum_required(VERSION 3.20)
project(madhava_l2 VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

# Options
option(MADHAVA_BUILD_TESTS "Build tests" ON)
option(MADHAVA_BUILD_PYTHON "Build Python bindings" ON)
option(MADHAVA_BUILD_BENCHMARK "Build benchmark executable" ON)
option(MADHAVA_BUILD_EXAMPLES "Build examples" ON)

# Dependencies
find_package(OpenMP REQUIRED)
# The Development component defines python3_add_library(), which pybind11's
# New-Tools macros require to create the _madhava_l2 module. It is safe in the
# manylinux container: headers ship under /opt/python/cp*-cp*/include and the
# pybind11 module build does not link against libpython itself.
find_package(Python3 COMPONENTS Interpreter Development)

# --- Main static library -----------------------------------------------
add_library(madhava_l2
    src/madhava_l2.cpp
)
target_include_directories(madhava_l2 PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_link_libraries(madhava_l2 PUBLIC OpenMP::OpenMP_CXX)

# --- Shared library (for pybind11) --------------------------------------
add_library(madhava_l2_shared SHARED src/madhava_l2.cpp)
set_target_properties(madhava_l2_shared PROPERTIES OUTPUT_NAME madhava_l2)
target_include_directories(madhava_l2_shared PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(madhava_l2_shared PUBLIC OpenMP::OpenMP_CXX)

# Install
install(TARGETS madhava_l2 madhava_l2_shared DESTINATION lib)
install(DIRECTORY include/ DESTINATION include)

# --- Python bindings -----------------------------------------------------
if(MADHAVA_BUILD_PYTHON)
    find_package(pybind11 CONFIG REQUIRED)
    pybind11_add_module(_madhava_l2 bindings/py_module.cpp)
    target_link_libraries(_madhava_l2 PRIVATE madhava_l2)
    target_include_directories(_madhava_l2 PRIVATE include)
    # scikit-build-core: installs the extension into the python/madhava_l2 package dir
    install(TARGETS _madhava_l2 DESTINATION madhava_l2)
endif()

# --- Tests ----------------------------------------------------------------
if(MADHAVA_BUILD_TESTS)
    enable_testing()
    add_executable(test_madhava_l2 tests/test_madhava_l2.cpp)
    target_link_libraries(test_madhava_l2 PRIVATE madhava_l2)
    target_include_directories(test_madhava_l2 PRIVATE include)
    add_test(NAME madhava_l2 COMMAND test_madhava_l2)
endif()

# --- Benchmark -------------------------------------------------------------
if(MADHAVA_BUILD_BENCHMARK)
    add_executable(madhava_l2_bench examples/bench_bigann_l2.cpp)
    target_link_libraries(madhava_l2_bench PRIVATE madhava_l2)
    target_include_directories(madhava_l2_bench PRIVATE include)
endif()

# --- Examples ---------------------------------------------------------------
if(MADHAVA_BUILD_EXAMPLES)
    add_executable(example_minimal examples/example_minimal.cpp)
    target_link_libraries(example_minimal PRIVATE madhava_l2)
    target_include_directories(example_minimal PRIVATE include)
endif()
