#
#  For more information, please see: http://software.sci.utah.edu
#
#  The MIT License
#
#  Copyright (c) 2020 Scientific Computing and Imaging Institute,
#  University of Utah.
#
#  Permission is hereby granted, free of charge, to any person obtaining a
#  copy of this software and associated documentation files (the "Software"),
#  to deal in the Software without restriction, including without limitation
#  the rights to use, copy, modify, merge, publish, distribute, sublicense,
#  and/or sell copies of the Software, and to permit persons to whom the
#  Software is furnished to do so, subject to the following conditions:
#
#  The above copyright notice and this permission notice shall be included
#  in all copies or substantial portions of the Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
#  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
#  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#  DEALINGS IN THE SOFTWARE.
#


SET(SCIRunMain_SOURCES
  scirunMain.cc
)

ADD_DEFINITIONS(-DAPPLICATION_NAME=${APPLICATION_NAME})

IF(NOT WITH_GUI)
  SET(BUILD_BUNDLE FALSE)
ENDIF()

IF(APPLE)
  IF(${MACDEPLOYQT} MATCHES "NOTFOUND" OR ${SED} MATCHES "NOTFOUND" OR ${AWK} MATCHES "NOTFOUND")
    SET(BUILD_BUNDLE FALSE)
    MESSAGE(WARNING "macdeployqt, sed and awk are required to build the SCIRun app bundle. Please ensure that all are installed and in your path.")
  ENDIF()
ENDIF()

IF(APPLE)
  MESSAGE(STATUS "Build Mac bundle: ${BUILD_BUNDLE}")
  IF(BUILD_BUNDLE)
    ADD_SUBDIRECTORY(osx_bundle)
  ENDIF()
ENDIF()

IF(APPLE)
  # TODO: temporary - until testing can be configured with app bundle
  ADD_EXECUTABLE(${TEST_APPLICATION_NAME}
    ${SCIRunMain_SOURCES}
  )

  IF(NOT WITH_GUI)
    ADD_EXECUTABLE(${APPLICATION_NAME}
      ${SCIRunMain_SOURCES}
    )
  ENDIF()

ELSEIF(WIN32)
  # TODO: windows headless mode?

  SET(SCIRunMain_SOURCES ${SCIRunMain_SOURCES} "${APPLICATION_WINDOWS_RC}")
  IF(SCIRUN_SHOW_CONSOLE)
    ADD_DEFINITIONS(-DSCIRUN_SHOW_CONSOLE=1)
  ENDIF()

  ADD_EXECUTABLE(${APPLICATION_NAME} WIN32 ${SCIRunMain_SOURCES})

  # Windows + MSVC + non-headless: enable Qt runtime for VS debugging
  IF(WIN32 AND MSVC)

    set(_vs_path "")

    # ------------------------
    # Qt (only if GUI enabled)
    # ------------------------
    IF(WITH_GUI)
      if(TARGET Qt::qmake)
        set(_qt_qmake_target Qt::qmake)
      else()
        set(_qt_qmake_target "")
      endif()

      if(_qt_qmake_target)
        get_target_property(_qt_qmake_exe ${_qt_qmake_target} LOCATION)
        get_filename_component(_qt_bin_dir "${_qt_qmake_exe}" DIRECTORY)
  
        if(_qt_bin_dir)
          set(_vs_path "${_qt_bin_dir}")
        endif()
      endif()
    ENDIF()

    # ------------------------
    # Python (only if enabled)
    # ------------------------
    IF(WITH_PYTHON)
      # Use release DLL path by default
      get_filename_component(_python_bin_dir
        ${SCI_PYTHON_DLL_PATH}
        DIRECTORY)
  
      if(_python_bin_dir)
        if(_vs_path)
          set(_vs_path "${_vs_path};${_python_bin_dir}")
        else()
          set(_vs_path "${_python_bin_dir}")
        endif()
      endif()
    ENDIF()

    # ------------------------
    # VTK (if enabled)
    # ------------------------
    if(WITH_VTK)
      get_filename_component(_vtk_cmake_dir ${VTK_DIR} ABSOLUTE)
      get_filename_component(_vtk_install_dir "${_vtk_cmake_dir}/../../.." ABSOLUTE)
      set(_vtk_bin_dir "${_vtk_install_dir}/bin")

      if(EXISTS "${_vtk_bin_dir}")
        if(_vs_path)
          set(_vs_path "${_vs_path};${_vtk_bin_dir}")
        else()
          set(_vs_path "${_vtk_bin_dir}")
        endif()
      endif()
    endif()

    # ------------------------
    # Apply to Visual Studio
    # ------------------------
    if(_vs_path)
      set_property(TARGET ${APPLICATION_NAME} PROPERTY
        VS_DEBUGGER_ENVIRONMENT
        "PATH=${_vs_path};%PATH%"
      )
    endif()

  ENDIF()

  # TODO: probably need this for Xcode
  IF(WIN32 AND MSVC)
    # TODO: more build types to be supported?
    # TODO: change $<CONFIGURATION> to $<CONFIG> when upgrading to cmake 3
    ADD_CUSTOM_COMMAND(TARGET ${APPLICATION_NAME}
      POST_BUILD
      COMMAND ${CMAKE_COMMAND}
      ARGS -E copy_directory
      ${SCIRun_BINARY_DIR}/Shaders
      ${SCIRun_BINARY_DIR}/$<CONFIGURATION>/Shaders
    )
    ADD_CUSTOM_COMMAND(TARGET ${APPLICATION_NAME}
      POST_BUILD
      COMMAND ${CMAKE_COMMAND}
      ARGS -E copy_directory
      ${SCIRun_BINARY_DIR}/Fonts
      ${SCIRun_BINARY_DIR}/$<CONFIGURATION>/Fonts
   )
   ADD_CUSTOM_COMMAND(TARGET ${APPLICATION_NAME}
     POST_BUILD
     COMMAND ${CMAKE_COMMAND}
     ARGS -E copy_directory
     ${SCIRun_BINARY_DIR}/Assets
     ${SCIRun_BINARY_DIR}/$<CONFIGURATION>/Assets
    )
  ENDIF()

ELSE()
  ADD_EXECUTABLE(${APPLICATION_NAME} ${SCIRunMain_SOURCES})
ENDIF()

IF(APPLE)
  SET(APPS ${TEST_APPLICATION_NAME})
  IF(NOT WITH_GUI)
    LIST(APPEND APPS ${APPLICATION_NAME})
  ENDIF()
ELSE()
  SET(APPS ${APPLICATION_NAME})
ENDIF()

FOREACH(app ${APPS})
  TARGET_LINK_LIBRARIES(${app}
    Core_Util_Legacy
  )

  IF(NOT WITH_GUI)
    TARGET_LINK_LIBRARIES(${app}
      Core_ConsoleApplication
    )
  ELSE()
    TARGET_LINK_LIBRARIES(${app}
      Interface_Application
    )
  ENDIF()

  IF(WITH_PYTHON)
    TARGET_LINK_LIBRARIES(${app}
      Core_Python
    )
  ENDIF()
ENDFOREACH()


IF(APPLE)
  IF(${CMAKE_GENERATOR} MATCHES "Xcode")
    SET(SCIRUN_LIB_DIR ${SCIRun_BINARY_DIR}/lib/$<CONFIGURATION>)
  ELSE()
    SET(SCIRUN_LIB_DIR ${SCIRun_BINARY_DIR}/lib)
  ENDIF()
ENDIF()


IF(APPLE)

ELSE()

  IF(WIN32)

    # ------------------------
    # Python
    # ------------------------
    IF(WITH_PYTHON)
      ADD_CUSTOM_COMMAND(TARGET ${APPLICATION_NAME}
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E make_directory $<CONFIGURATION>/Lib
        COMMAND ${CMAKE_COMMAND} -E copy_directory
                ${SCI_PYTHON_MODULE_LIBRARY_PATH}
                $<CONFIGURATION>/Lib
        WORKING_DIRECTORY ${SCIRun_BINARY_DIR})
    ENDIF()

    # ------------------------
    # Qt install
    # ------------------------
    IF(WITH_GUI)
      GET_TARGET_PROPERTY(QTCORENAME Qt${QT_VERSION_MAJOR}::Core LOCATION)
      GET_TARGET_PROPERTY(QTGUINAME Qt${QT_VERSION_MAJOR}::Gui LOCATION)
      GET_TARGET_PROPERTY(QTOPENGLNAME Qt${QT_VERSION_MAJOR}::OpenGL LOCATION)

      if (QT_VERSION_MAJOR VERSION_GREATER 5)
        GET_TARGET_PROPERTY(QTOPENGLWIDGETSNAME Qt${QT_VERSION_MAJOR}::OpenGLWidgets LOCATION)
      endif()

      GET_TARGET_PROPERTY(QTWIDGETSNAME Qt${QT_VERSION_MAJOR}::Widgets LOCATION)
      GET_TARGET_PROPERTY(QTNETWORKNAME Qt${QT_VERSION_MAJOR}::Network LOCATION)
      GET_TARGET_PROPERTY(QTCONCURRENTNAME Qt${QT_VERSION_MAJOR}::Concurrent LOCATION)
      GET_TARGET_PROPERTY(QTSVGNAME Qt${QT_VERSION_MAJOR}::Svg LOCATION)
      GET_TARGET_PROPERTY(QTPRINTSUPPORTNAME Qt${QT_VERSION_MAJOR}::PrintSupport LOCATION)
    ENDIF()

    INSTALL(TARGETS ${APPLICATION_NAME} RUNTIME DESTINATION bin)

    IF(WITH_GUI)
      INSTALL(PROGRAMS
        ${QTCORENAME}
        ${QTGUINAME}
        ${QTOPENGLNAME}
        ${QTNETWORKNAME}
        ${QTWIDGETSNAME}
        ${QTCONCURRENTNAME}
        ${QTSVGNAME}
        ${QTPRINTSUPPORTNAME}
        DESTINATION bin)

      if (QT_VERSION_MAJOR VERSION_GREATER 5)
        INSTALL(PROGRAMS
          ${QTOPENGLWIDGETSNAME}
          DESTINATION bin)
      endif()

      INSTALL(PROGRAMS
        "${Qt_PATH}/plugins/platforms/qwindows.dll"
        DESTINATION bin/platforms
        CONFIGURATIONS Release)
    ENDIF()

    # ------------------------
    # Python install
    # ------------------------
    IF(WITH_PYTHON)
      INSTALL(PROGRAMS
        ${SCI_PYTHON_DLL_PATH}
        DESTINATION bin)

      INSTALL(DIRECTORY
        "${SCI_PYTHON_MODULE_LIBRARY_PATH}/"
        DESTINATION bin/Lib)
    ENDIF()

    # ------------------------
    # Resources
    # ------------------------
    INSTALL(DIRECTORY "${SCIRun_BINARY_DIR}/Shaders" DESTINATION bin USE_SOURCE_PERMISSIONS)
    INSTALL(DIRECTORY "${SCIRun_BINARY_DIR}/Assets" DESTINATION bin USE_SOURCE_PERMISSIONS)
    INSTALL(DIRECTORY "${SCIRun_BINARY_DIR}/Fonts" DESTINATION bin USE_SOURCE_PERMISSIONS)

  ELSE()  # Linux / non-Windows

    IF(NOT WITH_GUI)
      MESSAGE(STATUS "Building headless SCIRun")
    ENDIF()

    # ------------------------
    # Python install
    # ------------------------
    IF(WITH_PYTHON)
      ADD_CUSTOM_COMMAND(TARGET ${APPLICATION_NAME}
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/Lib
        COMMAND ${CMAKE_COMMAND} -E copy_directory
                ${SCI_PYTHON_MODULE_LIBRARY_PATH}
                ${CMAKE_BINARY_DIR}/Lib
        WORKING_DIRECTORY ${SCIRun_BINARY_DIR})

      IF(SCI_PYTHON_64BIT_MODULE_LIBRARY_PATH AND EXISTS ${SCI_PYTHON_64BIT_MODULE_LIBRARY_PATH})
        ADD_CUSTOM_COMMAND(TARGET ${APPLICATION_NAME}
          POST_BUILD
          COMMAND ${CMAKE_COMMAND} -E copy_directory
                  ${SCI_PYTHON_64BIT_MODULE_LIBRARY_PATH}
                  ${CMAKE_BINARY_DIR}/Lib
          WORKING_DIRECTORY ${SCIRun_BINARY_DIR})
      ENDIF()
    ENDIF()

  ENDIF()

ENDIF()

SET(NETWORKS_DESTINATION_DIR  "./SCIRunNetworks")

# TODO: be careful of SCIRun network file extension
# TODO: refactor when networks are reorganized
INSTALL(DIRECTORY "${SCIRun_SOURCE_DIR}/ExampleNets/regression" DESTINATION ${NETWORKS_DESTINATION_DIR}
  USE_SOURCE_PERMISSIONS FILES_MATCHING PATTERN "*.srn5")

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
