include(InstallRequiredSystemLibraries)

execute_process(
  COMMAND ${QT_QTPATHS_EXECUTABLE} --query QT_HOST_LIBEXECS
  OUTPUT_VARIABLE QT_HOST_LIBEXECS_DIR
  OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE ";" "\\;" QT_ENV_PATH_LITERAL "${QT_ENV_PATH_VALUE}")

set(plugin_dest_dir "lib/plugins")
set(qml_dest_dir "qml")
set(qtconf_dest_dir "bin")

set(IMAGE_PLUGINS QJpegPlugin QGifPlugin)
set(PLATFORM_PLUGINS QMinimalIntegrationPlugin QWindowsIntegrationPlugin)

# foreach(plugin ${PLATFORM_PLUGINS})
#   get_target_property(_loc Qt6::${plugin} LOCATION_${CMAKE_BUILD_TYPE})
#   if (_loc)
#     install(FILES ${_loc} DESTINATION ${plugin_dest_dir}/platforms)
#   endif()
# endforeach()

# foreach(plugin ${IMAGE_PLUGINS})
#   get_target_property(_loc Qt6::${plugin} LOCATION_${CMAKE_BUILD_TYPE})
#   if (_loc)
#     install(FILES ${_loc} DESTINATION ${plugin_dest_dir}/imageformats)
#   endif()
# endforeach()


install(FILES WizModernImage.bmp DESTINATION dist)
install(FILES WizModernSmall.bmp DESTINATION dist)

configure_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/WindeployQt.cmake.in"
  "${CMAKE_CURRENT_BINARY_DIR}/WindeployQt.cmake"
  @ONLY)

install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/WindeployQt.cmake" COMPONENT Runtime)

# Install a qt.conf file.
# This inserts some cmake code into the install script to write the file
install(CODE "
  file(WRITE \"${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf\" \"[Paths]\\nPlugins = ../lib/plugins/\\nQmlImports = ../qml/\")
  " COMPONENT Runtime)

install(CODE "set(SYS_ROOT ${SYS_ROOT})")
install(CODE "set(MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)")
install(CODE "set(BINARY_DIR \"${CMAKE_BINARY_DIR}\")")
install(CODE "set(DIST_PATH \"${CMAKE_CURRENT_BINARY_DIR}\")")
install(CODE "set(INSTALL_PATH \"${CMAKE_INSTALL_PREFIX}\")")
install(CODE "set(DEP_DIRS \"${CMAKE_INSTALL_PREFIX}/bin;${SYS_ROOT}/bin;${spdlog_BINARY_DIR}\")")
install(CODE "set(BINDIR \"${BINDIR}\")")
install(CODE "set(BINDIR32 \"${BINDIR32}\")")
install(CODE "set(HAVE_CRASHPAD \"${HAVE_CRASHPAD}\")")
install(CODE "set(HAVE_SBOM \"${HAVE_SBOM}\")")
install(CODE "set(SOURCE_DIR \"${CMAKE_SOURCE_DIR}\")")

install(CODE "set(WITH_SIGN ${WITH_SIGN})")
if (WITH_SIGN)
  install(CODE "set(SIGNTOOLSH \"${SIGNTOOLSH}\")")
endif()

if (HAVE_SBOM)
  find_program(BASH_CMD bash REQUIRED)
  install(CODE "set(BASH_CMD \"${BASH_CMD}\")")
endif()

if (MSVC)
  install(CODE "set(MSVC ${MSVC})")
  install(CODE "set(VCPKG_INSTALLED_DIR \"${VCPKG_INSTALLED_DIR}\")")
  install(CODE "set(VCPKG_TARGET_TRIPLET \"${VCPKG_TARGET_TRIPLET}\")")
  install(CODE "set(CONFIG ${CONFIG})")
  install(CODE "set(DEP_DIRS \"${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/$<$<CONFIG:Debug>:debug/>bin\")")
endif()

install(SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/InstallDependencies.cmake")
install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/modules/SignBinaries.cmake")
install(SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/GenerateSBOM.cmake")
install(SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/PrepareInnoSetup.cmake")

string(REPLACE "/" "\\" INSTALL_WIN_PATH "${CMAKE_INSTALL_PREFIX}")

configure_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/setup.iss.in"
  "${CMAKE_CURRENT_BINARY_DIR}/setup.iss"
  @ONLY
)

set(INSTALLER_NAME "workrave-qt-installer")
set(INSTALLER_TARGET "${INSTALLER_NAME}.exe")
set(ISCC_FILENAME_FLAGS "/F${INSTALLER_NAME}")
set(PREPARE_INNO_SETUP_COMMAND
    "${CMAKE_COMMAND}"
    "-DINSTALL_PATH=${CMAKE_INSTALL_PREFIX}"
    "-DDIST_PATH=${CMAKE_CURRENT_BINARY_DIR}"
    "-DBINDIR=${BINDIR}"
    "-DBINDIR32=${BINDIR32}"
    "-DHAVE_CRASHPAD=${HAVE_CRASHPAD}"
    "-DHAVE_SBOM=${HAVE_SBOM}"
    "-P"
    "${CMAKE_CURRENT_SOURCE_DIR}/PrepareInnoSetup.cmake")

# When WITH_SIGN is ON, ISCC authenticode-signs the installer/uninstaller
# itself via the "Certum" SignTool it invokes for every file it produces.
set(ISCC_FLAGS "")
if (WITH_SIGN)
  set(ISCC_FLAGS "/DSignTool=Certum" "/SCertum=${SIGNTOOLPS1} $f")
endif()

set(INSTALLER_BUILD_COMMANDS
    COMMAND ${PREPARE_INNO_SETUP_COMMAND}
    COMMAND "${ISCC}" setup.iss "/o${CMAKE_INSTALL_PREFIX}" "/DCHANNEL=${WORKRAVE_CHANNEL}" ${ISCC_FLAGS} ${ISCC_FILENAME_FLAGS})

# Sigstore-sign the resulting installer.exe, producing "<exe>.sigstore".
if (WITH_SIGN)
  find_program(BASH_CMD bash REQUIRED)
  list(APPEND INSTALLER_BUILD_COMMANDS
       COMMAND "${BASH_CMD}" "${SIGNCOSIGNSH}" "${CMAKE_INSTALL_PREFIX}/${INSTALLER_TARGET}")
endif()

add_custom_command(OUTPUT ${INSTALLER_TARGET}
                   ${INSTALLER_BUILD_COMMANDS}
                   DEPENDS workrave "${CMAKE_CURRENT_SOURCE_DIR}/PrepareInnoSetup.cmake"
                   VERBATIM)

add_custom_target(installer DEPENDS ${INSTALLER_TARGET})

set(PORTABLE_NAME "WorkraveQt")
set(PORTABLE_ZIP "${CMAKE_INSTALL_PREFIX}/workrave-qt-portable.zip")

add_custom_command(OUTPUT "${PORTABLE_ZIP}"
                   COMMAND "${CMAKE_COMMAND}"
                           "-DINSTALL_PATH=${CMAKE_INSTALL_PREFIX}"
                           "-DDIST_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}"
                           "-DSTAGING_DIR=${CMAKE_CURRENT_BINARY_DIR}/portable"
                           "-DPORTABLE_NAME=${PORTABLE_NAME}"
                           "-DOUTPUT_ZIP=${PORTABLE_ZIP}"
                           "-DWITH_SIGN=${WITH_SIGN}"
                           "-DSIGNCOSIGNSH=${SIGNCOSIGNSH}"
                           -P "${CMAKE_CURRENT_SOURCE_DIR}/MakePortable.cmake"
                   DEPENDS workrave "${CMAKE_CURRENT_SOURCE_DIR}/MakePortable.cmake"
                   VERBATIM)

add_custom_target(portable DEPENDS "${PORTABLE_ZIP}")
