cmake_minimum_required(VERSION 3.5)

project(Ultracopier VERSION 3.0 LANGUAGES C CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Network)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Xml)

set(PROJECT_SOURCES
    HelpDialog.ui
    PluginInformation.ui
    OptionDialog.ui
    OSSpecific.ui
    ProductKey.ui
    plugins/CopyEngine/Ultracopier-Spec/copyEngineOptions.ui
    plugins/CopyEngine/Ultracopier-Spec/debugDialog.ui
    plugins/CopyEngine/Ultracopier-Spec/DiskSpace.ui
    plugins/CopyEngine/Ultracopier-Spec/fileErrorDialog.ui
    plugins/CopyEngine/Ultracopier-Spec/fileExistsDialog.ui
    plugins/CopyEngine/Ultracopier-Spec/fileIsSameDialog.ui
    plugins/CopyEngine/Ultracopier-Spec/FilterRules.ui
    plugins/CopyEngine/Ultracopier-Spec/Filters.ui
    plugins/CopyEngine/Ultracopier-Spec/folderExistsDialog.ui
    plugins/CopyEngine/Ultracopier-Spec/RenamingRules.ui
    plugins/Themes/Oxygen/interface.ui
    plugins/Themes/Oxygen/options.ui
    plugins/Themes/Oxygen/themesOptions.ui
    ResourcesManager.cpp
    DebugEngine.cpp
    OptionEngine.cpp
    PluginsManager.cpp
    LanguagesManager.cpp
    PluginInformation.cpp
    lib/qt-tar-xz/QXzDecodeThread.cpp
    lib/qt-tar-xz/QXzDecode.cpp
    lib/qt-tar-xz/QTarDecode.cpp
    lib/qt-tar-xz/xz_crc32.c
    lib/qt-tar-xz/xz_dec_stream.c
    lib/qt-tar-xz/xz_dec_lzma2.c
    lib/qt-tar-xz/xz_dec_bcj.c
    SessionLoader.cpp
    ExtraSocket.cpp
    CopyListener.cpp
    CopyEngineManager.cpp
    Core.cpp
    PluginLoaderCore.cpp
    OptionDialog.cpp
    LocalPluginOptions.cpp
    LocalListener.cpp
    CliParser.cpp
    FacilityEngine.cpp
    FacilityEngineVersion.cpp
    LogThread.cpp
    OSSpecific.cpp
    cpp11addition.cpp
    DebugModel.cpp
    InternetUpdater.cpp
    cpp11additionstringtointcpp.cpp
    ProductKey.cpp
    plugins/CopyEngine/Ultracopier-Spec/CallBackEventLoop.h
    plugins/CopyEngine/Ultracopier-Spec/CompilerInfo.h
    plugins/CopyEngine/Ultracopier-Spec/CopyEngineFactory.h
    plugins/CopyEngine/Ultracopier-Spec/CopyEngine.h
    plugins/CopyEngine/Ultracopier-Spec/CopyEngineUltracopier-SpecVariable.h
    plugins/CopyEngine/Ultracopier-Spec/DebugDialog.h
    plugins/CopyEngine/Ultracopier-Spec/DebugEngineMacro.h
    plugins/CopyEngine/Ultracopier-Spec/DiskSpace.h
    plugins/CopyEngine/Ultracopier-Spec/DriveManagement.h
    plugins/CopyEngine/Ultracopier-Spec/Environment.h
    plugins/CopyEngine/Ultracopier-Spec/EventLoop.h
    plugins/CopyEngine/Ultracopier-Spec/FileErrorDialog.h
    plugins/CopyEngine/Ultracopier-Spec/FileExistsDialog.h
    plugins/CopyEngine/Ultracopier-Spec/FileIsSameDialog.h
    plugins/CopyEngine/Ultracopier-Spec/FilterRules.h
    plugins/CopyEngine/Ultracopier-Spec/Filters.h
    plugins/CopyEngine/Ultracopier-Spec/FolderExistsDialog.h
    plugins/CopyEngine/Ultracopier-Spec/ListThread.h
    plugins/CopyEngine/Ultracopier-Spec/MkPath.h
    plugins/CopyEngine/Ultracopier-Spec/ports.h
    plugins/CopyEngine/Ultracopier-Spec/RenamingRules.h
    plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.h
    plugins/CopyEngine/Ultracopier-Spec/StructEnumDefinition_CopyEngine.h
    plugins/CopyEngine/Ultracopier-Spec/StructEnumDefinition.h
    plugins/CopyEngine/Ultracopier-Spec/TransferThread.h
    plugins/CopyEngine/Ultracopier-Spec/CopyEngine-collision-and-error.cpp
    plugins/CopyEngine/Ultracopier-Spec/CopyEngine.cpp
    plugins/CopyEngine/Ultracopier-Spec/DebugDialog.cpp
    plugins/CopyEngine/Ultracopier-Spec/DiskSpace.cpp
    plugins/CopyEngine/Ultracopier-Spec/DriveManagement.cpp
    plugins/CopyEngine/Ultracopier-Spec/CopyEngineFactory.cpp
    plugins/CopyEngine/Ultracopier-Spec/FileErrorDialog.cpp
    plugins/CopyEngine/Ultracopier-Spec/FileExistsDialog.cpp
    plugins/CopyEngine/Ultracopier-Spec/FileIsSameDialog.cpp
    plugins/CopyEngine/Ultracopier-Spec/FilterRules.cpp
    plugins/CopyEngine/Ultracopier-Spec/Filters.cpp
    plugins/CopyEngine/Ultracopier-Spec/FolderExistsDialog.cpp
    plugins/CopyEngine/Ultracopier-Spec/MkPath.cpp
    plugins/CopyEngine/Ultracopier-Spec/RenamingRules.cpp
    plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp
    plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp
    plugins/CopyEngine/Ultracopier-Spec/ListThread.cpp
    plugins/CopyEngine/Ultracopier-Spec/PathTree.cpp
    interface/PathTreeStr.cpp
    plugins/CopyEngine/Ultracopier-Spec/ListThreadActions.cpp
    plugins/CopyEngine/Ultracopier-Spec/ListThreadMedia.cpp
    plugins/CopyEngine/Ultracopier-Spec/ListThreadNew.cpp
    plugins/CopyEngine/Ultracopier-Spec/ListThreadOptions.cpp
    plugins/CopyEngine/Ultracopier-Spec/ListThreadScan.cpp
    plugins/CopyEngine/Ultracopier-Spec/ListThreadStat.cpp
    plugins/CopyEngine/Ultracopier-Spec/ListThreadListChange.cpp
    plugins/CopyEngine/Ultracopier-Spec/ListThread_InodeAction.cpp
    plugins/CopyEngine/Ultracopier-Spec/async/ReadThread.cpp
    plugins/CopyEngine/Ultracopier-Spec/async/WriteThread.cpp
    plugins/Listener/catchcopy/listener.cpp
    plugins/Listener/catchcopy/catchcopy-api-0002/ClientCatchcopy.cpp
    plugins/Listener/catchcopy/catchcopy-api-0002/ExtraSocketCatchcopy.cpp
    plugins/Listener/catchcopy/catchcopy-api-0002/ServerCatchcopy.cpp
    plugins/Themes/Oxygen/interface.cpp
    plugins/Themes/Oxygen/ThemesFactory.cpp
    plugins/Themes/Oxygen/TransferModel.cpp
    plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp
    interface/FacilityInterface.h
    interface/OptionInterface.h
    interface/PluginInterface_CopyEngine.h
    interface/PluginInterface_Listener.h
    interface/PluginInterface_PluginLoader.h
    interface/PluginInterface_SessionLoader.h
    interface/PluginInterface_Themes.h
    ThemesManager.cpp
    main.cpp
    EventDispatcher.cpp
    SystrayIcon.cpp
    HelpDialog.cpp
    resources/ultracopier-resources.qrc
    resources/ultracopier-resources_unix.qrc
    plugins/static-plugins.qrc
    plugins/static-plugins-oxygen.qrc
    plugins/CopyEngine/Ultracopier-Spec/copyEngineResources.qrc
    plugins/Themes/Oxygen/interfaceResources.qrc
)

# xxhash: prefer system header on Unix-like hosts; fall back to vendored copy
# (mandatory for Android/Windows cross builds, where /usr/include/xxhash.h
# belongs to the host Linux toolchain and is unusable for the target).
set(XXHASH_USE_VENDOR ON)
if(NOT WIN32 AND NOT ANDROID AND NOT CMAKE_CROSSCOMPILING)
    if(EXISTS "/usr/include/xxhash.h"
       OR EXISTS "/usr/local/include/xxhash.h"
       OR EXISTS "/opt/local/include/xxhash.h")
        set(XXHASH_USE_VENDOR OFF)
    endif()
endif()
if(XXHASH_USE_VENDOR)
    set(_ucx_xxhash_src ${CMAKE_CURRENT_SOURCE_DIR}/lib/xxhash/xxhash.c)
    set_source_files_properties(${_ucx_xxhash_src} PROPERTIES LANGUAGE C)
    add_library(ultracopier_xxhash STATIC ${_ucx_xxhash_src})
    set_target_properties(ultracopier_xxhash PROPERTIES
        AUTOMOC OFF AUTOUIC OFF AUTORCC OFF
        LINKER_LANGUAGE C
        POSITION_INDEPENDENT_CODE ON)
    target_include_directories(ultracopier_xxhash PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lib/xxhash)
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/xxhash)
else()
    link_libraries(xxhash)
endif()

add_definitions(-DNOAUDIO -DULTRACOPIER_PLUGIN_ALL_IN_ONE -DULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT -DULTRACOPIER_NODEBUG)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(Ultracopier
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
    set_property(TARGET Ultracopier APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(Ultracopier SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(Ultracopier
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(Ultracopier PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)
target_link_libraries(Ultracopier PRIVATE Qt${QT_VERSION_MAJOR}::Network)
target_link_libraries(Ultracopier PRIVATE Qt${QT_VERSION_MAJOR}::Xml)
if(XXHASH_USE_VENDOR)
    target_link_libraries(Ultracopier PRIVATE ultracopier_xxhash)
endif()

option(ULTRACOPIER_PLUGIN_KIO "Enable KDE KIO support for remote file protocols (sftp, smb, ftp, ...)" OFF)
if(ULTRACOPIER_PLUGIN_KIO)
    find_package(KF${QT_VERSION_MAJOR} REQUIRED COMPONENTS KIOCore)
    target_compile_definitions(Ultracopier PRIVATE ULTRACOPIER_PLUGIN_KIO)
    target_sources(Ultracopier PRIVATE plugins/CopyEngine/Ultracopier-Spec/ListThreadKio.cpp)
    target_link_libraries(Ultracopier PRIVATE KF${QT_VERSION_MAJOR}::KIOCore)
endif()

if(APPLE)
    # .app icon — the qmake path sets this via ICON= in other-pro/ultracopier-core.pro
    set(MACOSX_BUNDLE_ICON_FILE ultracopier.icns)
    set(_ucx_icns ${CMAKE_CURRENT_SOURCE_DIR}/resources/ultracopier.icns)
    set_source_files_properties(${_ucx_icns} PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
    target_sources(Ultracopier PRIVATE ${_ucx_icns})
endif()

set_target_properties(Ultracopier PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER ultracopier.herman-brule.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

install(TARGETS Ultracopier
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

if(QT_VERSION_MAJOR EQUAL 6)
    # Silence QTP0002 dev warning on Qt 6.5+ Android builds (target-property paths as JSON).
    # QT_KNOWN_POLICY_* guards against Qt < 6.6, where QTP0002 doesn't exist and
    # qt_policy(SET ...) hard-errors (e.g. the Qt 6.5.3 osxcross mac build).
    if(COMMAND qt_policy AND QT_KNOWN_POLICY_QTP0002)
        qt_policy(SET QTP0002 NEW)
    endif()
    qt_finalize_executable(Ultracopier)
endif()
