cmake_minimum_required(VERSION 3.22)

project(gLocalize LANGUAGES CXX)
set(TRG gLocalize)

# Build options
option(GLOCALIZE_MULTIPLE_REF "Enable multiple reference selection UI" ON)

# --- Build type default ---
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Qt: enable automoc/uic/rcc
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC OFF)  # no .ui files; hand-maintained ui_mainw.h/.cpp

# Prefer sane RPATH behavior without hardcoding /usr/local paths.
# If dependencies are properly installed in system paths, no RPATH is needed.
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)

# --- Dependencies ---
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network Xml Svg OpenGL OpenGLWidgets)

# HDF5: use imported targets if provided, otherwise fall back to variables.
find_package(HDF5 REQUIRED COMPONENTS C CXX HL)

# ITK config package generally exports ITK_LIBRARIES as imported targets.
find_package(ITK REQUIRED)

# VTK: list the modules actually used by the code (Qt widget + volume rendering + widgets + imaging).
find_package(VTK REQUIRED
  COMPONENTS
    CommonCore
    CommonDataModel
    CommonTransforms
    FiltersCore
    FiltersGeneral
    FiltersGeometry
    FiltersModeling
    FiltersSources
    ImagingCore
    ImagingGeneral
    ImagingHybrid
    InteractionStyle
    InteractionWidgets
    RenderingCore
    RenderingOpenGL2
    RenderingVolumeOpenGL2
    RenderingAnnotation
    RenderingFreeType
    RenderingImage
    RenderingQt
    GUISupportQt
)

# GDCM: prefer config targets when available.
find_package(GDCM REQUIRED)

# --- Sources ---
set(SRCS
  DicomScanService.cpp
  DicomScanWorker.cpp
  SkullRemovalService.cpp
  SkullRemovalWorker.cpp
  VolumePrepService.cpp
  VolumePrepWorker.cpp
  main.cpp
  mainw.cpp
  ui_mainw.cpp
  dicomUtils.cpp
  gRen.cpp
  LocalizationService.cpp
  LocalizationWorker.cpp

)

set(HDR
  DicomScanService.h
  DicomScanWorker.h
  SkullRemovalService.h
  SkullRemovalWorker.h
  VolumePrepService.h
  VolumePrepWorker.h
  mainw.h
  ui_mainw.h
  connectITKVTK.h
  dicomUtils.h
  gPatientRTGeneralInfos.h
  gRen.h
  LocalizationService.h
  LocalizationWorker.h
  types.h
  types_qt.h
  itkQtAdaptor.h
)

qt_add_resources(RES_RCC images.qrc)

add_executable(${TRG}
  ${SRCS}
  ${HDR}
  ${RES_RCC}
)

# Expose feature flags consistently to all translation units.
if(GLOCALIZE_MULTIPLE_REF)
  target_compile_definitions(${TRG} PRIVATE MULTIPLE_REF=1)
else()
  target_compile_definitions(${TRG} PRIVATE MULTIPLE_REF=0)
endif()

# Do NOT define QT_NO_KEYWORDS here: this project uses Qt's 'signals/slots/emit'
# keywords in headers, and disabling them breaks moc.

target_include_directories(${TRG}
  PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}
)

# --- Link libraries ---
target_link_libraries(${TRG}
  PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::OpenGL
    Qt6::OpenGLWidgets
    Qt6::Network
    Qt6::Xml
    Qt6::Svg
)

# ITK: imported targets are typically in ITK_LIBRARIES
if(DEFINED ITK_LIBRARIES)
  target_link_libraries(${TRG} PRIVATE ${ITK_LIBRARIES})
endif()

# VTK
target_link_libraries(${TRG} PRIVATE ${VTK_LIBRARIES})
# VTK 9.x + --as-needed: ensure GUISupportQt is explicitly linked when using QVTKOpenGLNativeWidget
if(TARGET VTK::GUISupportQt)
  target_link_libraries(${TRG} PRIVATE VTK::GUISupportQt)
endif()


# VTK module auto-init (needed especially when VTK is built static or with some build options)
if(COMMAND vtk_module_autoinit)
  vtk_module_autoinit(
    TARGETS ${TRG}
    MODULES ${VTK_LIBRARIES}
  )
endif()

# GDCM (prefer targets; otherwise fallback to variables)
if(TARGET GDCM::gdcmMSFF)
  target_link_libraries(${TRG} PRIVATE GDCM::gdcmMSFF)
elseif(DEFINED GDCM_LIBRARIES)
  target_link_libraries(${TRG} PRIVATE ${GDCM_LIBRARIES})
endif()

# HDF5 (prefer targets; otherwise fallback to variables)
if(TARGET hdf5::hdf5_cpp)
  target_link_libraries(${TRG} PRIVATE hdf5::hdf5_cpp)
endif()
if(TARGET hdf5::hdf5_hl_cpp)
  target_link_libraries(${TRG} PRIVATE hdf5::hdf5_hl_cpp)
endif()
if(DEFINED HDF5_LIBRARIES)
  target_link_libraries(${TRG} PRIVATE ${HDF5_LIBRARIES})
endif()
if(DEFINED HDF5_CXX_LIBRARIES)
  target_link_libraries(${TRG} PRIVATE ${HDF5_CXX_LIBRARIES})
endif()

# math lib (Linux)
target_link_libraries(${TRG} PRIVATE m)

# Helpful warnings (tweak as you like)
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
  target_compile_options(${TRG} PRIVATE -Wall -Wextra -Wpedantic)
endif()
