cmake_minimum_required(VERSION 3.20)
project(cf_datahive_cpp LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if (NOT DEFINED CF_SDK_INCLUDE OR CF_SDK_INCLUDE STREQUAL "")
  find_package(Python3 REQUIRED COMPONENTS Interpreter)
  execute_process(
    COMMAND ${Python3_EXECUTABLE} -c "import cogniflow_pipeline_sdk as s; print(getattr(s, 'cf_sdk_include_path', lambda: '')())"
    OUTPUT_VARIABLE CF_SDK_INCLUDE
    OUTPUT_STRIP_TRAILING_WHITESPACE
  )
endif()

set(_cf_sdk_vendor_include "${CMAKE_CURRENT_SOURCE_DIR}/../../../../cf_pipeline/cf_pipeline_sdk/vendor/cf_pipeline_engine/include")
if ((CF_SDK_INCLUDE STREQUAL "" OR NOT EXISTS "${CF_SDK_INCLUDE}/cf_step_utils.h") AND EXISTS "${_cf_sdk_vendor_include}/cf_step_utils.h")
  set(CF_SDK_INCLUDE "${_cf_sdk_vendor_include}")
endif()

if (NOT EXISTS "${CF_SDK_INCLUDE}/cf_step_utils.h")
  message(FATAL_ERROR "Cogniflow SDK headers not found in '${CF_SDK_INCLUDE}'. Reinstall cf-pipeline-sdk.")
endif()

if (DEFINED ENV{CF_DATAHIVE_CPP_DUCKDB_INCLUDE})
  set(_duckdb_include_default "$ENV{CF_DATAHIVE_CPP_DUCKDB_INCLUDE}")
else()
  set(_duckdb_include_default "")
endif()

if (DEFINED ENV{CF_DATAHIVE_CPP_DUCKDB_LIB})
  set(_duckdb_lib_default "$ENV{CF_DATAHIVE_CPP_DUCKDB_LIB}")
else()
  set(_duckdb_lib_default "")
endif()

set(CF_DATAHIVE_CPP_DUCKDB_INCLUDE_DIR "${_duckdb_include_default}" CACHE PATH "Path to DuckDB include directory")
set(CF_DATAHIVE_CPP_DUCKDB_LIBRARY "${_duckdb_lib_default}" CACHE FILEPATH "Path to DuckDB library file")

set(_native_duckdb_root "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../.native_deps/duckdb")
set(_native_duckdb_include "${_native_duckdb_root}/include")
set(_native_duckdb_include_flat "${_native_duckdb_root}")
set(_native_duckdb_lib_win "${_native_duckdb_root}/lib/duckdb.lib")
set(_native_duckdb_lib_mingw "${_native_duckdb_root}/lib/libduckdb.a")
set(_native_duckdb_lib_flat "${_native_duckdb_root}/duckdb.lib")

if (CF_DATAHIVE_CPP_DUCKDB_INCLUDE_DIR STREQUAL "")
  if (EXISTS "${_native_duckdb_include}/duckdb.h")
    set(CF_DATAHIVE_CPP_DUCKDB_INCLUDE_DIR "${_native_duckdb_include}")
  elseif (EXISTS "${_native_duckdb_include_flat}/duckdb.h")
    set(CF_DATAHIVE_CPP_DUCKDB_INCLUDE_DIR "${_native_duckdb_include_flat}")
  endif()
endif()

if (CF_DATAHIVE_CPP_DUCKDB_LIBRARY STREQUAL "")
  if (EXISTS "${_native_duckdb_lib_win}")
    set(CF_DATAHIVE_CPP_DUCKDB_LIBRARY "${_native_duckdb_lib_win}")
  elseif (EXISTS "${_native_duckdb_lib_mingw}")
    set(CF_DATAHIVE_CPP_DUCKDB_LIBRARY "${_native_duckdb_lib_mingw}")
  elseif (EXISTS "${_native_duckdb_lib_flat}")
    set(CF_DATAHIVE_CPP_DUCKDB_LIBRARY "${_native_duckdb_lib_flat}")
  endif()
endif()

if (CF_DATAHIVE_CPP_DUCKDB_INCLUDE_DIR STREQUAL "" OR NOT EXISTS "${CF_DATAHIVE_CPP_DUCKDB_INCLUDE_DIR}/duckdb.h")
  message(FATAL_ERROR "DuckDB headers not found. Set CF_DATAHIVE_CPP_DUCKDB_INCLUDE or install .native_deps duckdb.")
endif()

if (CF_DATAHIVE_CPP_DUCKDB_LIBRARY STREQUAL "" OR NOT EXISTS "${CF_DATAHIVE_CPP_DUCKDB_LIBRARY}")
  message(FATAL_ERROR "DuckDB library not found. Set CF_DATAHIVE_CPP_DUCKDB_LIB or install .native_deps duckdb.")
endif()

add_library(cf_datahive_cpp STATIC
  src/cf_datahive_cpp.cpp
)

target_include_directories(cf_datahive_cpp PUBLIC
  ${CMAKE_CURRENT_SOURCE_DIR}/include
  ${CF_SDK_INCLUDE}
  ${CF_DATAHIVE_CPP_DUCKDB_INCLUDE_DIR}
)

target_link_libraries(cf_datahive_cpp PUBLIC
  ${CF_DATAHIVE_CPP_DUCKDB_LIBRARY}
)
