cmake_minimum_required(VERSION 3.25)

project(cppdantic LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(GNUInstallDirs)

find_package(Python REQUIRED COMPONENTS Interpreter Development.Module)
execute_process(
    COMMAND "${Python_EXECUTABLE}" -c
        "import pathlib, easybind; print(pathlib.Path(easybind.__file__).resolve().parent / 'cmake' / 'easybind_pip.cmake')"
    OUTPUT_STRIP_TRAILING_WHITESPACE
    OUTPUT_VARIABLE _eb_pip
    COMMAND_ERROR_IS_FATAL ANY
)
include("${_eb_pip}")
easybind_pip_setup()
easybind_fetch_magic_enum()

nanobind_add_module(cppdantic__init__ NB_SHARED src/cppdantic/hello.cpp)
target_include_directories(cppdantic__init__ PRIVATE "${EASYBIND_INCLUDE_ROOT}")
target_link_libraries(cppdantic__init__ PRIVATE "${EASYBIND_CORE_LIB}")
easybind_pip_link_magic_enum(cppdantic__init__)

set_target_properties(cppdantic__init__ PROPERTIES
    OUTPUT_NAME "__init__"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/cppdantic"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/cppdantic"
)

easybind_pip_set_rpath_next_to_easybind(cppdantic__init__ "${EASYBIND_PKG_DIR}")

# Typings for editors / type checkers (same mechanism as easybind: nanobind_add_stub).
set(_cppdantic_pyi "${CMAKE_CURRENT_SOURCE_DIR}/src/cppdantic/__init__.pyi")
get_filename_component(_cppdantic_pyi_dir "${_cppdantic_pyi}" DIRECTORY)
file(MAKE_DIRECTORY "${_cppdantic_pyi_dir}")
nanobind_add_stub(cppdantic_stub
    MODULE cppdantic
    OUTPUT ${_cppdantic_pyi}
    PYTHON_PATH $<TARGET_FILE_DIR:cppdantic__init__>
    DEPENDS cppdantic__init__
)

install(TARGETS cppdantic__init__ LIBRARY DESTINATION cppdantic)
install(FILES ${_cppdantic_pyi} DESTINATION cppdantic)
