find_package(Python 3.10 REQUIRED COMPONENTS Interpreter Development.Module)

if(NOT nanobind_DIR)
    execute_process(
        COMMAND "${Python_EXECUTABLE}" -c "import nanobind; print(nanobind.cmake_dir())"
        OUTPUT_VARIABLE nanobind_DIR
        OUTPUT_STRIP_TRAILING_WHITESPACE
        RESULT_VARIABLE nanobind_dir_result
    )
    if(NOT nanobind_dir_result EQUAL 0 OR NOT nanobind_DIR)
        message(FATAL_ERROR "Failed to resolve nanobind CMake directory from Python.")
    endif()
endif()

find_package(nanobind CONFIG REQUIRED)

set(RPT_PYTHON_PACKAGE_DIR "${CMAKE_CURRENT_BINARY_DIR}/rpt")
file(MAKE_DIRECTORY "${RPT_PYTHON_PACKAGE_DIR}")
configure_file("${PROJECT_SOURCE_DIR}/src/rpt/__init__.py" "${RPT_PYTHON_PACKAGE_DIR}/__init__.py" COPYONLY)
configure_file("${PROJECT_SOURCE_DIR}/src/rpt/__init__.pyi" "${RPT_PYTHON_PACKAGE_DIR}/__init__.pyi" COPYONLY)
configure_file("${PROJECT_SOURCE_DIR}/src/rpt/_helpers.py" "${RPT_PYTHON_PACKAGE_DIR}/_helpers.py" COPYONLY)
configure_file("${PROJECT_SOURCE_DIR}/src/rpt/py.typed" "${RPT_PYTHON_PACKAGE_DIR}/py.typed" COPYONLY)

nanobind_add_module(rpt_core_ext "${CMAKE_CURRENT_SOURCE_DIR}/rpt_module.cpp")

set_target_properties(rpt_core_ext PROPERTIES
    OUTPUT_NAME "_core"
    LIBRARY_OUTPUT_DIRECTORY "${RPT_PYTHON_PACKAGE_DIR}"
)

target_link_libraries(rpt_core_ext PRIVATE rpt_core)
target_include_directories(rpt_core_ext PRIVATE
    "${PROJECT_SOURCE_DIR}/rpt_cpp"
)

nanobind_add_stub(rpt_core_stub
    MODULE rpt._core
    OUTPUT "${RPT_PYTHON_PACKAGE_DIR}/_core.pyi"
    PYTHON_PATH "${CMAKE_CURRENT_BINARY_DIR}"
    DEPENDS rpt_core_ext
)

install(TARGETS rpt_core_ext LIBRARY DESTINATION rpt)
install(FILES "${RPT_PYTHON_PACKAGE_DIR}/__init__.pyi" DESTINATION rpt)
install(FILES "${RPT_PYTHON_PACKAGE_DIR}/_core.pyi" DESTINATION rpt)
install(FILES "${RPT_PYTHON_PACKAGE_DIR}/py.typed" DESTINATION rpt)
