set(DELTA_KERNEL_RS_SOURCE_DIR "${ClickHouse_SOURCE_DIR}/contrib/delta-kernel-rs")
set(DELTA_KERNEL_RS_BINARY_DIR "${CMAKE_BINARY_DIR}/contrib/delta-kernel-rs")
set(DELTA_KERNEL_RS_CMAKE_DIR "${ClickHouse_SOURCE_DIR}/contrib/delta-kernel-rs-cmake")

include(ExternalProject)

set(USE_DELTA_KERNEL_RS ${ENABLE_LIBRARIES})

# MSAN: Disabled because ring does not generate the appropriate symbols
# NO_ARMV81_OR_HIGHER: Disabled because ring assumes that Neon is available with ARM
# Darwin: Issues with reqwest -> system-configuration (requires other frameworks)
if (NOT ENABLE_LIBRARIES OR NOT OS_LINUX OR (NOT ARCH_AMD64 AND NOT ARCH_AARCH64) OR (SANITIZE STREQUAL "memory") OR NO_ARMV81_OR_HIGHER)
  message(STATUS "Disabling delta kernel because of incompatible platform or Rust is disabled")
  set(USE_DELTA_KERNEL_RS 0)
endif()

option(ENABLE_DELTA_KERNEL_RS "Enable delta-kernel-rs" ${USE_DELTA_KERNEL_RS})
if (NOT ENABLE_DELTA_KERNEL_RS OR NOT ENABLE_RUST)
  message(STATUS "Not using delta-kernel-rs")
  return()
endif()

# Ideally we would disable all features to remove dependencies but:
# * default-engine: Needed for its s3 client (we can't pass our own s3 client via ffi)
clickhouse_import_crate(
    MANIFEST_PATH "${DELTA_KERNEL_RS_SOURCE_DIR}/ffi/Cargo.toml"
    FEATURES "default-engine-rustls, test-ffi, tracing"
)
clickhouse_config_crate_flags(delta_kernel_ffi)

# Path for autogenerated files (`delta_kernel_ffi.hpp`)
set(DELTA_KERNEL_TARGET_PATH ${DELTA_KERNEL_RS_BINARY_DIR}/include)

corrosion_set_env_vars(delta_kernel_ffi
        "CARGO_HOME=${CMAKE_BINARY_DIR}/contrib/corrosion-cmake/"
        "CARGO_TARGET_DIR=${DELTA_KERNEL_TARGET_PATH}"
        "OPENSSL_LIBS=ssl:crypto"
        "OPENSSL_STATIC=1"
        "OPENSSL_LIB_DIR=${CMAKE_BINARY_DIR}/contrib/openssl-cmake/"
        "OPENSSL_INCLUDE_DIR=${CMAKE_BINARY_DIR}/contrib/openssl-cmake/common/")

target_include_directories(delta_kernel_ffi INTERFACE "${DELTA_KERNEL_TARGET_PATH}/")
target_link_libraries(delta_kernel_ffi INTERFACE OpenSSL::Crypto OpenSSL::SSL)
add_dependencies(_cargo-build_delta_kernel_ffi OpenSSL::Crypto OpenSSL::SSL)
add_library(ch_rust::delta_kernel_rs ALIAS delta_kernel_ffi)
