set(HEADERS RootMathDense.h
            RootMuonScatter.h
            RootHitRaw.h
            muCastorMCTrack.h
            muCastorHit.h
            muCastorInfo.h
            muCastorSkinHit.h
            muCastorPrimaryVertex.h
            muCastorMuDetDIGI.h
            SkinDetectorWriter.h)
if(Qt6_FOUND)
    list(APPEND HEADERS QCanvas.h)
endif()

set(SOURCES ${HEADERS} RootMuonScatter.cpp
                       muCastorMCTrack.cpp
                       muCastorHit.cpp
                       muCastorInfo.cpp
                       muCastorSkinHit.cpp
                       muCastorPrimaryVertex.cpp
                       muCastorMuDetDIGI.cpp
                       SkinDetectorWriter.cpp)
if(Qt6_FOUND)
    list(APPEND SOURCES QCanvas.cpp)
endif()

set(DICTIONARY_HEADERS muCastorMCTrack.h
                       muCastorHit.h
                       muCastorInfo.h
                       muCastorSkinHit.h
                       muCastorPrimaryVertex.h
                       muCastorMuDetDIGI.h
                       SkinDetectorWriter.h)

set(LIBRARIES ${ROOT_LIBRARIES}
              ${PACKAGE_LIBPREFIX}Math
              Eigen3::Eigen)

get_target_property(EIGEN3_INC Eigen3::Eigen INTERFACE_INCLUDE_DIRECTORIES)
include_directories(${EIGEN3_INC})

set(rDictName ${PACKAGE_LIBPREFIX}RootDict)
root_generate_dictionary(${rDictName} ${DICTIONARY_HEADERS}
                         LINKDEF Linkdef.h)
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${rDictName}.cxx
                            PROPERTIES GENERATED TRUE
                                       SKIP_AUTOMOC TRUE
                                       SKIP_AUTOUIC TRUE
                                       SKIP_AUTORCC TRUE)
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${rDictName}.h
                            PROPERTIES GENERATED TRUE
                                       SKIP_AUTOMOC TRUE
                                       SKIP_AUTOUIC TRUE
                                       SKIP_AUTORCC TRUE)
list(APPEND SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${rDictName}.cxx)

# TODO use a custom target linked to root_generate_dictionary
set(R_ARTIFACTS ${CMAKE_CURRENT_BINARY_DIR}/lib${rDictName}_rdict.pcm
                ${CMAKE_CURRENT_BINARY_DIR}/lib${rDictName}.rootmap)
install(FILES ${R_ARTIFACTS}
        DESTINATION ${INSTALL_LIB_DIR})

set(libname ${PACKAGE_LIBPREFIX}Root)
set(ULIB_SHARED_LIBRARIES ${ULIB_SHARED_LIBRARIES} ${libname} PARENT_SCOPE)
set(ULIB_SELECTED_MODULES ${ULIB_SELECTED_MODULES} Root PARENT_SCOPE)

add_library(${libname} SHARED ${SOURCES})
set_target_properties(${libname} PROPERTIES
                      VERSION ${PROJECT_VERSION}
                      SOVERSION ${PROJECT_SOVERSION}
                      CXX_STANDARD 17)
target_link_libraries(${libname} ${LIBRARIES})

if(Qt6_FOUND)
    set_target_properties(${libname} PROPERTIES AUTOMOC ON)
    target_link_libraries(${libname} Qt6::Widgets)
endif()

install(TARGETS ${libname}
        EXPORT "uLibTargets"
        RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin
        LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT lib)

install(FILES ${HEADERS} DESTINATION ${INSTALL_INC_DIR}/Root)

if(BUILD_TESTING)
  include(uLibTargetMacros)
  add_subdirectory(testing)
endif()
