# Configure CMB for the target application

# Run this to make sure everything is setup
cmb_configure_properties()

get_property(_cmb_application_NAME GLOBAL PROPERTY _cmb_application_NAME)
get_property(_cmb_application_APP_NAME GLOBAL PROPERTY _cmb_application_APP_NAME)
get_property(_cmb_application_TITLE GLOBAL PROPERTY _cmb_application_TITLE)
get_property(_cmb_application_ORGANIZATION GLOBAL PROPERTY _cmb_application_ORGANIZATION)
get_property(_cmb_application_VERSION GLOBAL PROPERTY _cmb_application_VERSION)
get_property(_cmb_application_OSX_ICON GLOBAL PROPERTY _cmb_application_OSX_ICON)
get_property(_cmb_application_OSX_PLIST GLOBAL PROPERTY _cmb_application_OSX_PLIST)
get_property(_cmb_application_WINDOWS_ICON GLOBAL PROPERTY _cmb_application_WINDOWS_ICON)
get_property(_cmb_application_WEBSITE_URL GLOBAL PROPERTY _cmb_application_WEBSITE_URL)
get_property(_cmb_application_USER_GUIDE_URL GLOBAL PROPERTY _cmb_application_USER_GUIDE_URL)
get_property(_cmb_application_ISSUES_URL GLOBAL PROPERTY _cmb_application_ISSUES_URL)
get_property(_cmb_application_ICON GLOBAL PROPERTY _cmb_application_ICON)
get_property(_cmb_application_SPLASH GLOBAL PROPERTY _cmb_application_SPLASH)
get_property(_cmb_application_QRESOURCE GLOBAL PROPERTY _cmb_application_QRESOURCE)

# Configure the default applicaiton layout
get_property(_cmb_application_layoutspec_SOURCES GLOBAL PROPERTY _cmb_application_layoutspec_SOURCES)
if (NOT _cmb_application_layoutspec_SOURCES)
  cmb_configure_layout_spec(
    CLASS_NAME mbLayoutSpec
    SOURCES
      ${PROJECT_SOURCE_DIR}/modelbuilder/mbLayoutSpec.h
      ${PROJECT_SOURCE_DIR}/modelbuilder/mbLayoutSpec.cxx)
  get_property(_cmb_application_layoutspec_SOURCES GLOBAL PROPERTY _cmb_application_layoutspec_SOURCES)
endif ()

# Configure the application Help Dialog
get_property(_cmb_application_aboutdialog_SOURCES GLOBAL PROPERTY _cmb_application_aboutdialog_SOURCES)
if (NOT _cmb_application_aboutdialog_SOURCES)
  cmb_configure_about_dialog(
    CLASS_NAME mbAboutDialogReaction
    SOURCES
      ${PROJECT_SOURCE_DIR}/modelbuilder/mbAboutDialogReaction.h
      ${PROJECT_SOURCE_DIR}/modelbuilder/mbAboutDialogReaction.cxx)
  get_property(_cmb_application_aboutdialog_SOURCES GLOBAL PROPERTY _cmb_application_aboutdialog_SOURCES)
endif ()
get_property(_cmb_application_aboutdialog_CLASS_NAME GLOBAL PROPERTY _cmb_application_aboutdialog_CLASS_NAME)
configure_file(${PROJECT_SOURCE_DIR}/cmake/cmbMenuBuilder.cxx.in
               ${CMAKE_CURRENT_BINARY_DIR}/cmbMenuBuilder.cxx
               @ONLY)
configure_file(${PROJECT_SOURCE_DIR}/cmake/cmbMenuBuilder.h.in
               ${CMAKE_CURRENT_BINARY_DIR}/cmbMenuBuilder.h
               @ONLY)

set(sources
  ${_cmb_application_aboutdialog_SOURCES}
  ${_cmb_application_layoutspec_SOURCES}
  cmbLoadDataReaction.h
  cmbMainWindow.cxx
  cmbMainWindow.h
  ${CMAKE_CURRENT_BINARY_DIR}/cmbMenuBuilder.cxx
  ${CMAKE_CURRENT_BINARY_DIR}/cmbMenuBuilder.h
  cmbObjectFactory.cxx
  cmbObjectFactory.h
  cmbReaderFactory.cxx
  cmbReaderFactory.h
  cmbStandardRecentlyUsedResourceLoaderImplementation.h
  cmbTestEventPlayer.cxx
  cmbTestEventPlayer.h
  cmbTestEventTranslator.cxx
  cmbTestEventTranslator.h
  ${CMAKE_CURRENT_BINARY_DIR}/cmbTestData.h
  ${CMAKE_CURRENT_BINARY_DIR}/cmbVersion.h)



set(ui_files
  ui/cmbFileMenu.ui
  ui/cmbMainWindow.ui)

file(COPY ${CMAKE_CURRENT_LIST_DIR}/ui/
  DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/ui)
configure_file(
  ${PROJECT_SOURCE_DIR}/cmake/cmbResource.qrc.in
  ${CMAKE_CURRENT_BINARY_DIR}/resource/cmbResource.qrc
  @ONLY)
set(rc_files
  resource/cmbWidgets.qrc
  ${CMAKE_CURRENT_BINARY_DIR}/resource/cmbResource.qrc
  ${_cmb_application_QRESOURCE}
)

list(APPEND sources ${rc_files})

set(CMAKE_AUTOMOC 1)
set(CMAKE_AUTOUIC 1)
set(CMAKE_AUTORCC 1)
set(CMAKE_AUTOUIC_SEARCH_PATHS
  "${CMAKE_CURRENT_SOURCE_DIR}/ui")

configure_file(
  ${PROJECT_SOURCE_DIR}/cmake/Version.h.in
  ${CMAKE_CURRENT_BINARY_DIR}/cmbVersion.h)

configure_file(
  cmbTestData.h.in
  ${CMAKE_CURRENT_BINARY_DIR}/cmbTestData.h)

# A list of "plugin targets" generated by ParaView's plugin infrastructure.
# They are added as available. ParaView's client infrastructure makes use of
# these to allow them to be automatically loaded at runtime.
set(smtk_plugins_targets)
set(required_plugins
  cmbPostProcessingModePlugin)
if (TARGET smtk_paraview_plugins)
  list(APPEND smtk_plugins_targets
    smtk_paraview_plugins)
  list(APPEND required_plugins
    smtkPVServerExtPlugin)
endif ()
if (TARGET smtk_paraview_extension_plugin)
  # TODO: Remove this when compatibility with SMTK v22.11 or earlier is no
  #       longer required; it has been replaced with the two targets below.
  list(APPEND smtk_plugins_targets
    smtk_paraview_extension_plugin)
endif ()
if (TARGET smtk_paraview_extension_core_plugins)
  list(APPEND smtk_plugins_targets
    smtk_paraview_extension_core_plugins)
endif()
if (TARGET smtk_paraview_extension_gui_plugins)
  list(APPEND smtk_plugins_targets
    smtk_paraview_extension_gui_plugins)
endif()
foreach (plugin_dependency IN LISTS CMB_EXTRA_SMTK_PLUGINS)
  string(REPLACE "-" "_" plugin_dependency "${plugin_dependency}")
  list(APPEND smtk_plugins_targets
    "${plugin_dependency}_paraview_plugins")
endforeach ()

# In any Debug version of the client, exclude the splash image by default
if (CMAKE_BUILD_TYPE MATCHES "Debug")
  set(_cmb_application_SPLASH "")
elseif (_cmb_application_SPLASH)
  list(PREPEND _cmb_application_SPLASH SPLASH_IMAGE)
endif ()

#------------------------------------------------------------------------------
# Build the client
paraview_client_add(
  NAME "${_cmb_application_NAME}"
  APPLICATION_NAME "${_cmb_application_APP_NAME}"
  TITLE "${_cmb_application_TITLE}"
  ORGANIZATION  "${_cmb_application_ORGANIZATION}"
  VERSION ${_cmb_application_VERSION}
  MAIN_WINDOW_CLASS cmbMainWindow
  MAIN_WINDOW_INCLUDE cmbMainWindow.h
  BUNDLE_ICON   "${_cmb_application_OSX_ICON}"
  BUNDLE_PLIST  "${CMAKE_CURRENT_SOURCE_DIR}/resource/MacOSXBundleInfo.plist.in"
  APPLICATION_ICON  "${_cmb_application_WINDOWS_ICON}"
  SOURCES ${sources}
  PLUGINS_TARGETS cmb_paraview_plugins ${smtk_plugins_targets} ParaView::paraview_plugins
  REQUIRED_PLUGINS ${required_plugins}
  APPLICATION_XMLS ${ParaView_CLIENT_XML_FILES}
  ${_cmb_application_SPLASH}
)

target_include_directories(${_cmb_application_NAME}
  PUBLIC
    $<BUILD_INTERFACE:${cmb_BINARY_DIR}>
    $<BUILD_INTERFACE:${cmb_SOURCE_DIR}>)

if (ParaView_VERSION VERSION_LESS "5.10")
  target_compile_definitions(${_cmb_application_NAME}
    PUBLIC
      PV_COMPAT_59)
endif ()
target_compile_definitions(${_cmb_application_NAME} PRIVATE QT_NO_KEYWORDS)

#if (PARAVIEW_ENABLE_EMBEDDED_DOCUMENTATION)
#  # Link against the documentation module.
#  target_link_libraries(modelbuilder
#    LINK_PRIVATE vtkParaViewDocumentation)
#endif()

target_link_libraries(${_cmb_application_NAME}
  PRIVATE
    smtkPQComponentsExt
)
if (cmb_enable_multiservers)
  target_compile_definitions(${_cmb_application_NAME}
    PUBLIC CMB_ENABLE_MULTISERVERS)
endif ()

if (cmb_enable_pythonshell)
  target_compile_definitions(${_cmb_application_NAME}
    PUBLIC CMB_ENABLE_PYTHONSHELL)
  # support the internal python shell
  target_link_libraries(${_cmb_application_NAME}
    PRIVATE
      ParaView::pvpythonmodules
      ParaView::pqPython
      ParaView::PythonInitializer)
endif ()

if (cmb_enable_objectpicking)
  target_compile_definitions(${_cmb_application_NAME}
    PUBLIC CMB_ENABLE_OBJECTPICKING)
endif ()

# link enabled plugins if not building in shared library mode and
# add dependecies to linked python modules These are non-empty only when
# building statically.
if (TARGET VTK::UtilitiesPythonInitializer)
  target_link_libraries(modelbuilder
    LINK_PRIVATE
      VTK::UtilitiesPythonInitializer)
endif()

if (cmb_enable_testing)
  add_subdirectory(testing)
endif ()

#------------------------------------------------------------------------------
if (UNIX AND NOT APPLE)
  # Install <name>.desktop
  get_property(_cmb_application_has_custom_desktop GLOBAL PROPERTY _cmb_application_LINUX_DESKTOP SET)
  if (_cmb_application_has_custom_desktop)
    get_property(_cmb_application_LINUX_DESKTOP GLOBAL PROPERTY _cmb_application_LINUX_DESKTOP SET)
  else ()
    configure_file(
      cmb.desktop.in
      "${CMAKE_CURRENT_BINARY_DIR}/${_cmb_application_APP_NAME}.desktop"
      @ONLY)
    set(_cmb_application_LINUX_DESKTOP "${CMAKE_CURRENT_BINARY_DIR}/${_cmb_application_APP_NAME}.desktop")
  endif ()
  install(
    FILES       ${_cmb_application_LINUX_DESKTOP}
    DESTINATION share/applications
    RENAME      ${_cmb_application_APP_NAME}.desktop
    COMPONENT   runtime)

  # Install <iconsize>/<name>.png
  get_property(_cmb_application_LINUX_ICON_SIZE GLOBAL PROPERTY _cmb_application_LINUX_ICON_SIZE)
  foreach (iconsize ${_cmb_application_LINUX_ICON_SIZE})
    get_property(icon GLOBAL PROPERTY _cmb_application_LINUX_ICON_${iconsize})
    install(
      FILES       "${icon}"
      DESTINATION "share/icons/hicolor/${iconsize}/apps"
      RENAME      ${_cmb_application_APP_NAME}.png
      COMPONENT   runtime)
  endforeach ()

  # Install <name>.appdata.xml
  get_property(_cmb_application_APP_DATA GLOBAL PROPERTY _cmb_application_APP_DATA)
  install(
    FILES       ${_cmb_application_APP_DATA}
    DESTINATION share/appdata
    RENAME      ${_cmb_application_APP_NAME}.appdata.xml
    COMPONENT   runtime)
endif()
