# C++ extension module: single-modal GEDI (from gedi2py) + multi-modal
# MultiGEDI hub (ported from multigedi R, Rcpp-stripped, header-only).
pybind11_add_module(_multigedi_cpp
    bindings.cpp
    gedi_core.cpp
    gedi_projections.cpp
    gedi_differential.cpp
    gedi_imputation.cpp
    gedi_dimred.cpp
)

# Link Eigen
target_link_libraries(_multigedi_cpp PRIVATE Eigen3::Eigen)

# Link OpenMP if available
if(OpenMP_CXX_FOUND)
    target_link_libraries(_multigedi_cpp PRIVATE OpenMP::OpenMP_CXX)
    target_compile_definitions(_multigedi_cpp PRIVATE GEDI_USE_OPENMP)
endif()

# Compiler warnings and optimization flags
if(MSVC)
    target_compile_options(_multigedi_cpp PRIVATE /W3)
else()
    target_compile_options(_multigedi_cpp PRIVATE -Wall -Wextra -Wpedantic)
    # Match R's optimization flags for fair performance comparison.
    # R uses: -march=nocona -mtune=haswell -ftree-vectorize
    # These are x86-only — arm64 (Apple Silicon, ARM Linux) clang rejects
    # -march=nocona with "unsupported argument 'nocona' to option '-march='".
    # Gate on the system processor so cross-compiled arm64 wheels build cleanly.
    if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|amd64|AMD64|i.86)$" OR
       CMAKE_OSX_ARCHITECTURES MATCHES "x86_64")
        target_compile_options(_multigedi_cpp PRIVATE
            -march=nocona
            -mtune=haswell
            -ftree-vectorize
        )
    else()
        # arm64 / aarch64: keep -ftree-vectorize (architecture-neutral),
        # drop the x86-tuning flags.
        target_compile_options(_multigedi_cpp PRIVATE -ftree-vectorize)
    endif()
endif()

# Install target
install(TARGETS _multigedi_cpp DESTINATION multigedi)
