CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
SET(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules")
PROJECT(ElmerGUI CXX C)
SET(APPLICATION_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/netgen/libsrc/interface")

IF(APPLE)
include(cmake/Modules/FindOpenCasCade.cmake)
# add_subdirectory(cmake/Modules)
ENDIF()

SET(WITH_PYTHONQT FALSE CACHE BOOL "ElmerGUI: Use PythonQt for scripting in post processor?")
SET(WITH_OCC FALSE CACHE BOOL "ElmerGUI: Use OpenCASCADE for importing CAD files? Needs VTK.")
SET(WITH_MATC FALSE CACHE BOOL "ElmerGUI: Use MATC for internal operations in postprocessing?")
SET(WITH_PARAVIEW FALSE CACHE BOOL "ElmerGUI: Use ParaView for postprocessing?")
SET(WITH_VTK FALSE CACHE BOOL "ElmerGUI: Use VTK for postprocessing?")
SET(WITH_QWT TRUE CACHE BOOL "ElmerGUI: Use QWT for convergence monitor?")
SET(WITH_ELMERGUILOGGER FALSE CACHE BOOL "ElmerGUI: Include ElmerGUIlogger")

IF( NOT WITH_QT6)
  find_package(Qt5 COMPONENTS Widgets)
  if (Qt5_FOUND)
    set(WITH_QT5 TRUE CACHE BOOL "ElmerGUI: Use Qt5")
  endif()
ENDIF()

IF(WITH_QT6)
  MESSAGE(STATUS "------------------------------------------------")
  IF(WIN32)
    MESSAGE(STATUS "Qt6 Windows packaging")
    SET(QT6_PKG_LIST Qt6OpenGL Qt6OpenGLWidgets Qt6Qml Qt6Xml Qt6Gui Qt6Core Qt6Svg Qt6Widgets Qt6PrintSupport)
  ELSE()
    MESSAGE(STATUS "Qt6 non-Windows packaging")
    SET(QT6_PKG_LIST Qt6OpenGL Qt6Qml Qt6Xml Qt6Gui Qt6Core Qt6Svg Qt6PrintSupport Qt6OpenGLWidgets)
  ENDIF()
  FOREACH(_pkg ${QT6_PKG_LIST})
    FIND_PACKAGE(${_pkg} PATHS ${QT6_PATH} REQUIRED)
  ENDFOREACH()
  
  ADD_DEFINITIONS(-DWITH_QT6)
  MESSAGE(STATUS "  [ElmerGUI] Qt6:               " ${Qt6_FOUND})
  MESSAGE(STATUS "  [ElmerGUI] Qt6 Libraries: ${Qt6OpenGL_LIBRARIES} ${Qt6OpenGLWidgets_LIBRARIES} ${Qt6Qml_LIBRARIES} ${Qt6Xml_LIBRARIES} ${Qt6Gui_LIBRARIES} ${Qt6Core_LIBRARIES}")
  MESSAGE(STATUS "------------------------------------------------")
  set(WITH_QT5 FALSE CACHE BOOL "" FORCE)  
ELSEIF(WITH_QT5)
  MESSAGE(STATUS "------------------------------------------------")
  IF(WIN32)
    MESSAGE(STATUS "Qt5 Windows packaging")
    SET(QT5_PKG_LIST Qt5OpenGL Qt5Xml Qt5Script Qt5Gui Qt5Core Qt5Svg Qt5Widgets Qt5PrintSupport)
  ELSE()
    MESSAGE(STATUS "Qt5 non-Windows packaging")
    SET(QT5_PKG_LIST Qt5OpenGL Qt5Xml Qt5Script Qt5Gui Qt5Core Qt5Svg Qt5PrintSupport)
  ENDIF()
  FOREACH(_pkg ${QT5_PKG_LIST})
    FIND_PACKAGE(${_pkg} PATHS ${QT5_PATH} REQUIRED)
  ENDFOREACH()
  ADD_DEFINITIONS(-DWITH_QT5)
  MESSAGE(STATUS "  [ElmerGUI] Qt5:               " ${Qt5_FOUND})
  MESSAGE(STATUS "  [ElmerGUI] Qt5 Libraries: ${Qt5OpenGL_LIBRARIES} ${Qt5Xml_LIBRARIES} ${Qt5Script_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Core_LIBRARIES}")
  MESSAGE(STATUS "------------------------------------------------")
ELSE()
  MESSAGE(STATUS "------------------------------------------------")
  FIND_PACKAGE(Qt4 COMPONENTS QtOpenGL QtXml QtScript QtGui QtCore REQUIRED)
  MESSAGE(STATUS "  [ElmerGUI] Qt4:               " ${Qt4_FOUND})
  MESSAGE(STATUS "  [ElmerGUI] Qt4_LIBRARIES:     " ${Qt4_LIBRARY})
  MESSAGE(STATUS "------------------------------------------------")
ENDIF()

IF(WITH_PYTHONQT)
  IF(WITH_QT5 OR WITH_QT6)
    MESSAGE(FATAL_ERROR "PythonQt is not supported for QT5 or QT6")
  ENDIF()
  ADD_DEFINITIONS(-DEG_PYTHONQT)
  ADD_SUBDIRECTORY(PythonQt)
  SET(APPLICATION_INCLUDE_DIRS "${APPLICATION_INCLUDE_DIRS};${CMAKE_CURRENT_SOURCE_DIR}/PythonQt/src")
ENDIF()

SET_DIRECTORY_PROPERTIES(Application INCLUDE_DIRECTORIES "${APPLICATION_INCLUDE_DIRS}")

IF(WITH_QWT)
  ADD_DEFINITIONS(-DEG_QWT)
  FIND_PACKAGE(Qwt REQUIRED)
#  FIND_PATH(QWT_INCLUDE_DIR qwt.h)
#  SET(QWT_INCLUDE_DIR "C:/msys64/mingw64/include/qwt-qt5")
#  SET(QWT_LIBRARY "C:/msys64/mingw64/lib/libqwt-qt5.dll.a")
  MESSAGE(STATUS "  [ElmerGUI] Qwt:             " ${Qwt_FOUND})
  MESSAGE(STATUS "  [ElmerGUI] QWT_LIBRARY:     " ${QWT_LIBRARY})
  MESSAGE(STATUS "  [ElmerGUI] QWT_INCLUDE_DIR: " ${QWT_INCLUDE_DIR})
  MESSAGE(STATUS "------------------------------------------------")
  string(FIND "${QWT_LIBRARY}" "-qt6" QWT_QT_OUT)
  if( (QWT_QT_OUT GREATER 0) AND (NOT WITH_QT6))
    MESSAGE(WARNING "  [ElmerGUI] Qt version mismatch with Qwt")
    MESSAGE(STATUS "------------------------------------------------")
  endif()
  string(FIND "${QWT_LIBRARY}" "-qt5" QWT_QT_OUT)
  if( (QWT_QT_OUT GREATER 0) AND (NOT WITH_QT5))
    MESSAGE(WARNING "  [ElmerGUI] Qt version mismatch with Qwt")
    MESSAGE(STATUS "------------------------------------------------")
  endif()
  string(FIND "${QWT_LIBRARY}" "-qt4" QWT_QT_OUT)
  if( (QWT_QT_OUT GREATER 0) AND (WITH_QT5 OR WITH_QT6))
    MESSAGE(WARNING "  [ElmerGUI] Qt version mismatch with Qwt")
    MESSAGE(STATUS "------------------------------------------------")
  endif()  
ENDIF()

IF(WITH_OCC)

  IF(NOT WITH_VTK)
    SET(WITHOUT_VTKPOST TRUE)
  ENDIF()
  SET(WITH_VTK TRUE)
  ADD_DEFINITIONS(-DEG_OCC)

  FIND_PACKAGE(OpenCASCADE)
  IF(OpenCASCADE_FOUND)
    MESSAGE(STATUS "  [ElmerGUI] OpenCASCADE:               " ${OpenCASCADE_FOUND})
    MESSAGE(STATUS "  [ElmerGUI] OpenCASCADE_VERSION:       " ${OpenCASCADE_VERSION})
    MESSAGE(STATUS "  [ElmerGUI] OpenCASCADE_INCLUDE_DIR:   " ${OpenCASCADE_INCLUDE_DIR})
    # only link to available libraries
    SET(ELMER_USED_OCC_LIBS "TKernel;TKMath;TKG3d;TKG2d;TKBRep;TKSTEP;TKMesh;TKIGES;TKDEIGES;TKG2d;TKGeomBase;TKBool;TKBO;TKGeomAlgo;TKPrim;TKShHealing;TKSTEP209;TKSTEPAttr;TKSTEPBase;TKDESTEP;TKTopAlgo;TKXSBase")
    SET(ELMER_AVAILABLE_OCC_LIBS "")
    FOREACH(_lib IN LISTS ELMER_USED_OCC_LIBS)
      LIST(FIND OpenCASCADE_LIBRARIES ${_lib} _index)
      IF(NOT ${_index} EQUAL -1)
        LIST(APPEND ELMER_AVAILABLE_OCC_LIBS ${_lib})
      ENDIF()
    ENDFOREACH()
    SET(ELMER_OCC_LIBS "${ELMER_AVAILABLE_OCC_LIBS}" CACHE INTERNAL "")
    MESSAGE(STATUS "  [ElmerGUI] ELMER_OCC_LIBS:    " "${ELMER_OCC_LIBS}")
    MESSAGE(STATUS "------------------------------------------------")
  ELSE()
    FIND_PACKAGE(OCE REQUIRED)
    MESSAGE(STATUS "  [ElmerGUI] OCE:               " ${OCE_FOUND})
    MESSAGE(STATUS "  [ElmerGUI] OCE_VERSION:       " ${OCE_VERSION})
    MESSAGE(STATUS "  [ElmerGUI] OCE_INCLUDE_DIRS:  " ${OCE_INCLUDE_DIRS})
    SET(ELMER_OCC_LIBS "TKernel;TKMath;TKG3d;TKG2d;TKBRep;TKSTEP;TKMesh;TKIGES;TKG2d;TKGeomBase;TKBool;TKBO;TKGeomAlgo;TKPrim;TKShHealing;TKSTEP209;TKSTEPAttr;TKSTEPBase;TKTopAlgo;TKXSBase" CACHE INTERNAL "")
    MESSAGE(STATUS "  [ElmerGUI] ELMER_OCC_LIBS:    " "${ELMER_OCC_LIBS}")
    MESSAGE(STATUS "------------------------------------------------")
    SET(OpenCASCADE_INCLUDE_DIR ${OCE_INCLUDE_DIRS} CACHE PATH "Include dir for OCCT or OCE")
  ENDIF()
  
ENDIF()

IF(WITH_VTK)
  FIND_PACKAGE(VTK REQUIRED)

  INCLUDE(testVTKcapabilities)

  MESSAGE(STATUS "  [ElmerGUI] VTK version:       " ${VTK_VERSION})
  MESSAGE(STATUS "  [ElmerGUI] VTK_LIBS:          " "${VTK_LIBRARIES}")
  MESSAGE(STATUS "  [ElmerGUI] VTK_INCLUDE_DIRS:  " "${VTK_INCLUDE_DIRS}")
  MESSAGE(STATUS "  [ElmerGUI] VTK_QT_VERSION:    " ${VTK_QT_VERSION})
  MESSAGE(STATUS "------------------------------------------------")
  if((${VTK_QT_VERSION} EQUAL 6) AND (NOT WITH_QT6))
    MESSAGE(WARNING "  [ElmerGUI] Qt version mismatch with VTK_QT_VERSION")
    MESSAGE(STATUS "------------------------------------------------")
  elseif((${VTK_QT_VERSION} EQUAL 5) AND (NOT WITH_QT5))
    MESSAGE(WARNING "  [ElmerGUI] Qt version mismatch with VTK_QT_VERSION")
    MESSAGE(STATUS "------------------------------------------------")
  elseif((${VTK_QT_VERSION} EQUAL 4) AND (WITH_QT5 OR WITH_QT6))
    MESSAGE(WARNING "  [ElmerGUI] Qt version mismatch with VTK_QT_VERSION")
    MESSAGE(STATUS "------------------------------------------------")
  endif()
ENDIF()

IF(WITH_MATC)
  ADD_DEFINITIONS(-DEG_MATC)
  ADD_SUBDIRECTORY(matc)
  MESSAGE(STATUS "  [ElmerGUI] Compiling in matc")
  MESSAGE(STATUS "------------------------------------------------")
ENDIF()

IF(WITH_PARAVIEW)
  ADD_DEFINITIONS(-DEG_PARAVIEW)
ENDIF()


ADD_SUBDIRECTORY(netgen)
ADD_SUBDIRECTORY(Application)


IF(WIN32)
  INCLUDE(cmake/windows_bundle.cmake)
ENDIF(WIN32)

INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSES DESTINATION "share/ElmerGUI/license_texts" COMPONENT "elmergui")
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/GPL-2 DESTINATION "share/ElmerGUI/license_texts" COMPONENT "elmergui")
INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/GPL_EXCEPTION DESTINATION "share/ElmerGUI/license_texts" COMPONENT "elmergui")
INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/samples DESTINATION "share/ElmerGUI" COMPONENT "elmergui_samples")

