# CMake script for PAPPSOms++ library
# Author: Filippo Rusconi
# Created: 28/07/2025

message("\n${BoldGreen}Now configuring src/js_qml for ${PROJECT_NAME}\n${ColourReset}")

# set(CMAKE_INCLUDE_CURRENT_DIR ON)

########################################################
# Files
set(SRC
    datapointjs.cpp
    datapointjs.h
    qpointfjs.cpp
    qpointfjs.h
    ${CMAKE_SOURCE_DIR}/src/pappsomspp/processing/combiners/mzintegrationparams.cpp
    ${CMAKE_SOURCE_DIR}/src/pappsomspp/processing/combiners/mzintegrationparams.h
    tracejs.cpp
    tracejs.h
    massspectrumjs.cpp
    massspectrumjs.h
    jsclassregistrar.cpp
    jsclassregistrar.h
)

# set(js_qml_resources_RCC_SRC js_qml_resources.qrc)
# generate rules for building source files from the resources
# qt6_add_resources(js_qml_resources_RCC ${js_qml_resources_RCC_SRC})

# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON)

set(INCLUDES_DIRS "")
list(APPEND INCLUDES_DIRS "${CMAKE_SOURCE_DIR}/src")
# list(APPEND INCLUDES_DIRS "${CMAKE_CURRENT_BINARY_DIR}")
list(APPEND INCLUDES_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/forwarding_includes)
message(STATUS "src/js_qml INCLUDES_DIRS: ${INCLUDES_DIRS}")

# QML module
qt_add_qml_module(
    # This is the name of target, but the produced library will be
    # libPappsoMSplugin.so on GNU/Linux
    PappsoMS
    URI
    "PappsoMS"
    VERSION
    1.0
    SOURCES
    ${SRC}
    pappsojsqml.cpp
    NO_PLUGIN
    RESOURCE_PREFIX
    ":/qt/qml/"
    OUTPUT_DIRECTORY
    "${CMAKE_CURRENT_BINARY_DIR}/qml/PappsoMS"
    DEPENDENCIES
    Core
)

set_target_properties(PappsoMS PROPERTIES
    OUTPUT_NAME "PappsoMSbindings"
    QML_IMPORT_PATH "${PROJECT_INSTALL_LIB_QML_DIR}"
)

target_link_libraries(
    PappsoMS
    PRIVATE Qt6::Core Qt6::Qml Core
)

target_include_directories(PappsoMS
  PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_SOURCE_DIR}/src
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/forwarding_includes>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

# get_target_property(PappsoMS_INCLUDES PappsoMS INCLUDE_DIRECTORIES)
# message(STATUS "PappsoMS_INCLUDES: ${PappsoMS_INCLUDES}")
# get_target_property(_all_includes PappsoMS INTERFACE_INCLUDE_DIRECTORIES)
# message(STATUS "All interface includes: ${_all_includes}")

set(PROJECT_INSTALL_LIB_QML_DIR ${CMAKE_INSTALL_LIBDIR}/qml)

# Explicitly set the imported library path in the export
set_target_properties(PappsoMS PROPERTIES
    IMPORTED_LOCATION "${PROJECT_INSTALL_LIB_QML_DIR}/PappsoMS/libPappsoMSplugin.so"
    INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/include"
)

# Configure post-install script
configure_file(
    "${CMAKE_UTILS_PATH}//ld_config_post_install_script.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/ld_config_post_install_script.sh"
    @ONLY
)

# Make the plugin available for installation
install(
    TARGETS PappsoMS
    EXPORT PappsoMSTargets
    LIBRARY DESTINATION ${PROJECT_INSTALL_LIB_QML_DIR}/PappsoMS
    ARCHIVE DESTINATION ${PROJECT_INSTALL_LIB_QML_DIR}/PappsoMS
    RUNTIME DESTINATION ${PROJECT_INSTALL_LIB_QML_DIR}/PappsoMS
    BUNDLE DESTINATION ${PROJECT_INSTALL_LIB_QML_DIR}/PappsoMS
)

# Generate and install export configuration
install(
    EXPORT PappsoMSTargets
    FILE PappsoMSTargets.cmake
    NAMESPACE PappsoMS::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/PappsoMS
)

include(CMakePackageConfigHelpers)
configure_package_config_file(
    ${LOCAL_CMAKE_MODULE_PATH}/PappsoMSConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/PappsoMSConfig.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/PappsoMS
)

write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/PappsoMSConfigVersion.cmake
    VERSION 1.0
    COMPATIBILITY SameMajorVersion
)

install(
    FILES "${CMAKE_CURRENT_BINARY_DIR}/PappsoMSConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/PappsoMSConfigVersion.cmake"
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/PappsoMS
)

install(
    DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/qml/PappsoMS
    DESTINATION ${PROJECT_INSTALL_LIB_QML_DIR}
)

install(
    FILES ${CMAKE_CURRENT_SOURCE_DIR}/pappsojsqml.h
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pappsomspp/js_qml
)

install(
    DIRECTORY ${CMAKE_SOURCE_DIR}/src/pappsomspp/js_qml
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/pappsomspp/js_qml
    FILES_MATCHING
    PATTERN "*.h"
    PATTERN "*.hpp"
)

install(CODE "
    if(UNIX AND NOT APPLE)
        execute_process(
            COMMAND sh \"${CMAKE_CURRENT_BINARY_DIR}/ld_config_post_install_script.sh\"
            RESULT_VARIABLE INSTALL_RESULT
            OUTPUT_VARIABLE INSTALL_OUTPUT
        )
        message(\"${INSTALL_OUTPUT}\")
    endif()
")

message("\n${BoldGreen}Done configuring src/js_qml for ${PROJECT_NAME}\n${ColourReset}")
