cmake_minimum_required(VERSION 3.18)
project(pBabelCMake LANGUAGES C)

find_package(Python3 REQUIRED COMPONENTS Interpreter Development.Module)
include(PDynamoPython)
include(PDynamoTests)
include(PDynamoCython)
include(PDynamoExtensions)
include(PDynamoLibraries)
include(PDynamoInstall)

option(PDYNAMO_ENABLE_PBABEL_FUNCTIONAL_TESTS "Enable legacy pBabel functional tests." OFF)

pd_configure_cython_option()

set(PBABEL_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
set(EXT_DIR     ${PBABEL_ROOT}/extensions)

set(LIBFILE   ${EXT_DIR}/libraries)
set(CINC_DIR  ${EXT_DIR}/cinclude)
set(PSRC_DIR  ${EXT_DIR}/psource)
set(PYREX_DIR ${EXT_DIR}/pyrex)

set(PCORE_ROOT      ${CMAKE_CURRENT_SOURCE_DIR}/../pCore-2.0.0)
set(PCORE_EXT_DIR   ${PCORE_ROOT}/extensions)
set(PCORE_CINC_DIR  ${PCORE_EXT_DIR}/cinclude)
set(PCORE_PYREX_DIR ${PCORE_EXT_DIR}/pyrex)

set(PMOLECULE_ROOT      ${CMAKE_CURRENT_SOURCE_DIR}/../pMolecule-2.0.0)
set(PMOLECULE_EXT_DIR   ${PMOLECULE_ROOT}/extensions)
set(PMOLECULE_CINC_DIR  ${PMOLECULE_EXT_DIR}/cinclude)
set(PMOLECULE_PYREX_DIR ${PMOLECULE_EXT_DIR}/pyrex)

set(PYTHON_ROOT_DIR ${CMAKE_BINARY_DIR}/python)
set(PY_OUTPUT_DIR   ${PYTHON_ROOT_DIR}/pBabel)
set(GENERATED_DIR   ${CMAKE_BINARY_DIR}/generated)

file(MAKE_DIRECTORY ${PYTHON_ROOT_DIR})
file(MAKE_DIRECTORY ${PY_OUTPUT_DIR})
file(MAKE_DIRECTORY ${GENERATED_DIR})

pd_copy_python_package(
    "${CMAKE_CURRENT_SOURCE_DIR}/pBabel"
    "pBabel"
    "${PYTHON_ROOT_DIR}"
    ""
    PBABEL_COPIED_PY_FILES
)

pd_load_c_libraries(
    "${LIBFILE}"
    "${EXT_DIR}"
    "${PCORE_CINC_DIR};${PMOLECULE_CINC_DIR}"
    PBABEL_LIBS
)

pd_build_python_extensions(
    "pBabel"
    "${PYREX_DIR}"
    "${PSRC_DIR}"
    "${CINC_DIR}"
    "${GENERATED_DIR}"
    "${PY_OUTPUT_DIR}"
    ""
    "${PCORE_PYREX_DIR};${PMOLECULE_PYREX_DIR}"
    "${PCORE_CINC_DIR};${PMOLECULE_CINC_DIR}"
    "${PBABEL_LIBS}"
    "pBabel"
    PBABEL_EXTENSION_TARGETS
    PBABEL_DETECTED_MODULES
)

message(STATUS "QBX_USE_CYTHON          : ${QBX_USE_CYTHON}")
message(STATUS "pBabel libraries        : ${PBABEL_LIBS}")
message(STATUS "Copied Python files     : ${PBABEL_COPIED_PY_FILES}")
message(STATUS "Detected modules        : ${PBABEL_DETECTED_MODULES}")
message(STATUS "Extension targets       : ${PBABEL_EXTENSION_TARGETS}")
message(STATUS "Python root dir         : ${PYTHON_ROOT_DIR}")
message(STATUS "Python output dir       : ${PY_OUTPUT_DIR}")

pd_add_import_tests(
    "${CMAKE_CURRENT_SOURCE_DIR}/tests"
    "${PYTHON_ROOT_DIR}"
    "${PY_OUTPUT_DIR}"
    "test_import_pbabel"
    "test_import_all_pbabel_extensions"
)

if(PDYNAMO_ENABLE_PBABEL_FUNCTIONAL_TESTS)
    set(PBABEL_FUNCTIONAL_TESTS
        AmberTopCrdRead
        CharmmPSFRead
        EMSLBasisSetRead
        GaussianCubeFileWrite
        GromacsTopCrdRead
        PDBComponentsFromSystems
        PDBFileReadWrite
        PDBModelFileReadWrite
        PDBModelToSystem
        SMILESReadWrite
        mmCIFFileReadWrite
    )

    set(PBABEL_FUNCTIONAL_SCRATCH_DIR "${CMAKE_BINARY_DIR}/scratch/pbabel-tests")
    file(MAKE_DIRECTORY "${PBABEL_FUNCTIONAL_SCRATCH_DIR}")

    foreach(TEST_NAME IN LISTS PBABEL_FUNCTIONAL_TESTS)
        add_test(
            NAME "test_pbabel_${TEST_NAME}"
            COMMAND ${Python3_EXECUTABLE}
                    "${CMAKE_CURRENT_SOURCE_DIR}/tests/run_legacy_test.py"
                    "${PYTHON_ROOT_DIR}"
                    "${CMAKE_CURRENT_SOURCE_DIR}/tests"
                    "${TEST_NAME}"
                    "${CMAKE_SOURCE_DIR}"
                    "${CMAKE_CURRENT_SOURCE_DIR}"
                    "${PBABEL_FUNCTIONAL_SCRATCH_DIR}"
        )

        set_tests_properties(
            "test_pbabel_${TEST_NAME}"
            PROPERTIES
            ENVIRONMENT "PYTHONPATH=${PYTHON_ROOT_DIR};PDYNAMO_PARAMETERS=${CMAKE_BINARY_DIR}/parameters;PDYNAMO_PBABEL=${CMAKE_CURRENT_SOURCE_DIR};PDYNAMO_PMOLECULE=${CMAKE_SOURCE_DIR}/pMolecule-2.0.0;PDYNAMO_ROOT=${CMAKE_SOURCE_DIR};PDYNAMO_SCRATCH=${PBABEL_FUNCTIONAL_SCRATCH_DIR};PDYNAMO_TEST_QUIET=1;PDYNAMO_TEST_SHORT=1;PYTHONDONTWRITEBYTECODE=1"
            TIMEOUT 900
        )
    endforeach()
endif()

pd_install_python_package(
    "${CMAKE_CURRENT_SOURCE_DIR}/pBabel"
    "pBabel"
)

pd_install_extension_targets(
    "pBabel"
    ${PBABEL_EXTENSION_TARGETS}
)

add_custom_target(check_pbabel
    COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
    DEPENDS ${PBABEL_EXTENSION_TARGETS}
)
