cmake_minimum_required(VERSION 3.18)
project(sparse_approx_gsm LANGUAGES CXX)

# CUDA/C++ backend
add_subdirectory(sparse_approx_gsm/cuda)

# --- Cython extensions (optional) ---
find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module NumPy)
find_program(CYTHON_EXECUTABLE cython)

if(CYTHON_EXECUTABLE)
    message(STATUS "Cython found: ${CYTHON_EXECUTABLE}")

    macro(add_cython_module name source)
        set(_cy_cpp_file ${CMAKE_CURRENT_BINARY_DIR}/${name}.cpp)
        add_custom_command(
            OUTPUT ${_cy_cpp_file}
            COMMAND ${CYTHON_EXECUTABLE} -3 --cplus
                    ${CMAKE_CURRENT_SOURCE_DIR}/${source}
                    -o ${_cy_cpp_file}
            DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${source}
            COMMENT "Cythonizing ${source}"
        )
        Python3_add_library(${name} MODULE ${_cy_cpp_file})
        target_include_directories(${name} PRIVATE ${Python3_NumPy_INCLUDE_DIRS})
        install(TARGETS ${name} DESTINATION sparse_approx_gsm)
    endmacro()

    add_cython_module(_gsm_core_cy sparse_approx_gsm/_gsm_core_cy.pyx)
    add_cython_module(_fista_cy sparse_approx_gsm/_fista_cy.pyx)
    add_cython_module(_utils_cy sparse_approx_gsm/_utils_cy.pyx)
else()
    message(STATUS "Cython not found - skipping Cython acceleration")
endif()
