find_package(Python 3.9 REQUIRED
  COMPONENTS Interpreter Development.Module
  OPTIONAL_COMPONENTS Development.SABIModule)

find_package(nanobind CONFIG REQUIRED PATHS ${CMAKE_PREFIX_PATH} NO_DEFAULT_PATH)
message(STATUS "Found nanobind: ${nanobind_DIR} (found version ${nanobind_VERSION})")

yggdrasil_python_package_init(PYPDDL pypddl)

nanobind_add_module(_pypddl NB_SHARED
    src/module.cpp
    src/pypddl/formalism/module.cpp
    src/pypddl/formalism/data.cpp
    src/pypddl/formalism/index.cpp
    src/pypddl/formalism/view.cpp)

target_link_libraries(_pypddl PRIVATE loki::parsers)
target_include_directories(_pypddl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src)

yggdrasil_python_module_rpaths(PYPDDL _pypddl)

install(TARGETS _pypddl DESTINATION "pypddl" COMPONENT pypddl)

set_property(TARGET parsers PROPERTY INTERFACE_INCLUDE_DIRECTORIES
    "$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>")
yggdrasil_install_native_export(
    PKG_UPPER PYPDDL
    PACKAGE pypddl
    CONFIG_NAME loki
    NAMESPACE loki::
    EXPORT_NAME pypddlLokiparsersTargets
    EXPORT_FILE lokiparsersTargets.cmake
    TARGETS parsers
    HEADER_DIRS "${CMAKE_SOURCE_DIR}/include/loki"
    CONFIG_TEMPLATE "${CMAKE_SOURCE_DIR}/Config.cmake.in"
    VERSION_FILE "${CMAKE_BINARY_DIR}/lokiConfigVersion.cmake"
    CMAKE_SOURCE_DIRECTORY "${CMAKE_SOURCE_DIR}/cmake")

yggdrasil_install_runtime_path_fixup(PYPDDL pypddl)

set(PYPDDL_BUILD_TREE_PACKAGE_DIR "${CMAKE_CURRENT_BINARY_DIR}/pypddl")
file(MAKE_DIRECTORY
     "${PYPDDL_BUILD_TREE_PACKAGE_DIR}"
     "${PYPDDL_BUILD_TREE_PACKAGE_DIR}/formalism")

set(PYPDDL_GENERATED_VERSION_FILE "${PYPDDL_BUILD_TREE_PACKAGE_DIR}/_version.py")
file(WRITE "${PYPDDL_GENERATED_VERSION_FILE}" "__version__ = \"${PROJECT_VERSION}\"\n")
install(FILES "${PYPDDL_GENERATED_VERSION_FILE}"
        DESTINATION "pypddl"
        COMPONENT pypddl)

yggdrasil_install_python_files(pypddl "${CMAKE_CURRENT_SOURCE_DIR}/src"
    FILES
    pypddl/__init__.py
    pypddl/__main__.py
    pypddl/__init__.pyi
    pypddl/py.typed
    pypddl/formalism/__init__.py
    pypddl/formalism/__init__.pyi)

configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/pypddl/__init__.py"
               "${PYPDDL_BUILD_TREE_PACKAGE_DIR}/__init__.py"
               COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/pypddl/__init__.pyi"
               "${PYPDDL_BUILD_TREE_PACKAGE_DIR}/__init__.pyi"
               COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/pypddl/py.typed"
               "${PYPDDL_BUILD_TREE_PACKAGE_DIR}/py.typed"
               COPYONLY)
configure_file("${PYPDDL_GENERATED_VERSION_FILE}"
               "${PYPDDL_BUILD_TREE_PACKAGE_DIR}/_version.py"
               COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/pypddl/formalism/__init__.py"
               "${PYPDDL_BUILD_TREE_PACKAGE_DIR}/formalism/__init__.py"
               COPYONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/pypddl/formalism/__init__.pyi"
               "${PYPDDL_BUILD_TREE_PACKAGE_DIR}/formalism/__init__.pyi"
               COPYONLY)
add_custom_command(TARGET _pypddl POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
            $<TARGET_FILE:_pypddl>
            "${PYPDDL_BUILD_TREE_PACKAGE_DIR}/$<TARGET_FILE_NAME:_pypddl>"
    VERBATIM
)

if(LOKI_BUILD_TESTS)
    add_test(NAME pypddl_build_tree_package
             COMMAND "${Python_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_build_tree_package.py")
    set_tests_properties(pypddl_build_tree_package PROPERTIES
        ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR};PYTHONDONTWRITEBYTECODE=1")

    add_test(NAME pypddl_bindings
             COMMAND "${Python_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_loki_bindings.py")
    set_tests_properties(pypddl_bindings PROPERTIES
        ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR};PYTHONDONTWRITEBYTECODE=1")

    add_test(NAME pypddl_import
             COMMAND "${Python_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_import.py")
    set_tests_properties(pypddl_import PROPERTIES
        ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_BINARY_DIR};PYTHONDONTWRITEBYTECODE=1")

    add_test(NAME pypddl_build_backend
             COMMAND "${Python_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_build_backend.py")
    set_tests_properties(pypddl_build_backend PROPERTIES
        ENVIRONMENT "PYTHONDONTWRITEBYTECODE=1")
endif()

yggdrasil_install_provider_env(PYPDDL pypddl PREFIXES "${YGGDRASIL_NATIVE_PREFIX}")

yggdrasil_install_python_stubs(PYPDDL pypddl
    MODULE pypddl._pypddl
    PRIVATE_MODULE _pypddl
    RENAME_PACKAGES pypddl pyyggdrasil)

add_custom_target(pypddl_wheel DEPENDS _pypddl parsers)
