cmake_minimum_required(VERSION 3.20)

project(BiLauncher VERSION 1.0.1 LANGUAGES CXX C)

# Канал сборки (dev / rc / релиз) не хранится в репозитории, а вычисляется
# при сборке — см. cmake/LauncherVersion.cmake. CI передаёт полную версию:
# -DLAUNCHER_BUILD_VERSION=1.0.1-rc2.
set(LAUNCHER_BUILD_VERSION "" CACHE STRING "Полная версия от CI (X.Y.Z[-rcN]); пусто — по тегу и ветке git")
set(LAUNCHER_VERSION_NUMERIC "${PROJECT_VERSION}")
set(LAUNCHER_SOURCE_DIR "${PROJECT_SOURCE_DIR}")
set(LAUNCHER_GENERATED_DIR "${PROJECT_BINARY_DIR}/generated")
set(LAUNCHER_VERSION_HEADER "${LAUNCHER_GENERATED_DIR}/launcherversion.h")
include(cmake/LauncherVersion.cmake)
message(STATUS "Версия лаунчера: ${LAUNCHER_VERSION} (канал ${LAUNCHER_CHANNEL})")
add_custom_target(launcher_version
    COMMAND "${CMAKE_COMMAND}"
            "-DLAUNCHER_VERSION_NUMERIC=${LAUNCHER_VERSION_NUMERIC}"
            "-DLAUNCHER_SOURCE_DIR=${LAUNCHER_SOURCE_DIR}"
            "-DLAUNCHER_VERSION_HEADER=${LAUNCHER_VERSION_HEADER}"
            "-DLAUNCHER_BUILD_VERSION=${LAUNCHER_BUILD_VERSION}"
            -P "${PROJECT_SOURCE_DIR}/cmake/LauncherVersion.cmake"
    BYPRODUCTS "${LAUNCHER_VERSION_HEADER}"
    COMMENT "Версия лаунчера из git"
    VERBATIM)

set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(QT_NO_PRIVATE_MODULE_WARNING ON)
find_package(Qt6 REQUIRED COMPONENTS Quick QuickControls2 Qml Svg Core CorePrivate Gui Network)
find_package(Qt6 QUIET COMPONENTS WebEngineQuick)
if(Qt6WebEngineQuick_FOUND)
    message(STATUS "Qt WebEngine найден: вход через аккаунт Microsoft будет доступен")
    set(LAUNCHER_MSA_QML_FILES MicrosoftLoginDialog.qml)
else()
    message(WARNING
        "Qt WebEngine не найден — лаунчер соберётся без входа через аккаунт Microsoft. "
        "Чтобы его включить, доустановите в MaintenanceTool для своей версии Qt сразу три "
        "компонента: Qt WebEngine, Qt WebChannel и Qt Positioning.")
    set(LAUNCHER_MSA_QML_FILES "")
endif()

qt_standard_project_setup(REQUIRES 6.8)

set(LAUNCHER_ICON_DIR "${CMAKE_CURRENT_SOURCE_DIR}/icons")

if(WIN32)
    configure_file("${LAUNCHER_ICON_DIR}/icon.rc.in"
        "${CMAKE_CURRENT_BINARY_DIR}/icon.rc" @ONLY)
    set(LAUNCHER_APP_ICON "${CMAKE_CURRENT_BINARY_DIR}/icon.rc")
elseif(APPLE)
    set(LAUNCHER_APP_ICON "${LAUNCHER_ICON_DIR}/icon.icns")
    set_source_files_properties(${LAUNCHER_APP_ICON} PROPERTIES
        MACOSX_PACKAGE_LOCATION "Resources")
else()
    set(LAUNCHER_APP_ICON "")
endif()

qt_add_executable(BiLauncher
    main.cpp
    ${LAUNCHER_APP_ICON}
)

qt_add_resources(BiLauncher "appicon"
    PREFIX "/icons"
    BASE "icons"
    FILES
        icons/icon_16x16.png
        icons/icon_16x16@2x.png
        icons/icon_24x24.png
        icons/icon_32x32.png
        icons/icon_32x32@2x.png
        icons/icon_48x48.png
        icons/icon_64x64.png
        icons/icon_128x128.png
        icons/icon_128x128@2x.png
        icons/icon_256x256.png
        icons/icon_256x256@2x.png
        icons/icon_512x512.png
        icons/icon_512x512@2x.png
)

# Путь импорта для QML code model Qt Creator / qmlls: модуль лежит в
# ${CMAKE_CURRENT_BINARY_DIR}/qml, а не в корне каталога сборки.
set(QML_IMPORT_PATH "${CMAKE_CURRENT_BINARY_DIR}/qml"
    CACHE STRING "Пути импорта QML для Qt Creator" FORCE)

qt_add_qml_module(BiLauncher
    URI BiLauncher
    OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/qml/BiLauncher"
    SOURCES
        localization.h
        localization.cpp
        launcherbackend.h
        launcherbackend.cpp
        launcherpaths.h
        launcherpaths.cpp
        minecraftversion.h
        minecraftversion.cpp
        javalocator.h
        javalocator.cpp
        zlibreference.h
        zlibreference.cpp
        javaruntime.h
        javaruntime.cpp
        javaruntimeservice.h
        javaruntimeservice.cpp
        javainstaller.h
        javainstaller.cpp
        authservice.h
        authservice.cpp
        msaauthservice.h
        msaauthservice.cpp
        gamelauncher.h
        gamelauncher.cpp
        versionmanifestservice.h
        versionmanifestservice.cpp
        versioninstaller.h
        versioninstaller.cpp
        modloader.h
        modloaderversionservice.h
        modloaderversionservice.cpp
        modloaderinstaller.h
        modloaderinstaller.cpp
        buildarchiveworker.h
        buildarchiveworker.cpp
        buildswitcher.h
        buildswitcher.cpp
        gamedirimport.h
        gamedirimport.cpp
        seasonalbuildservice.h
        seasonalbuildservice.cpp
        seasonalpackdownloader.h
        seasonalpackdownloader.cpp
    QML_FILES
        Main.qml
        DarkCombo.qml
        VersionPickerDialog.qml
        JavaPickerDialog.qml
        LabelledField.qml
        BuildsDialog.qml
        SeasonalBuildsDialog.qml
        LoaderRow.qml
        ProgressPanel.qml
        ${LAUNCHER_MSA_QML_FILES}
        RESOURCES images/Folder/Folder_Active.svg images/Folder/Folder_Idle.svg images/Folder/Folder_Pressed.svg images/Options/Options_active.svg images/Options/Options_Idle.svg images/Options/Options_Pressed.svg images/Play_Button/Play_Active.svg images/Play_Button/Play_Idle.svg images/Play_Button/Play_pressed.svg images/Profile_Box/Asset_23.jpg images/Profile_Box/Asset_23.svg images/Profile_Box/Asset_24.jpg images/Profile_Box/Asset_24.svg images/Profile_Box/Kishka_Profile_Active.svg images/Profile_Box/Kishka_Profile_Idle.svg images/Profile_Box/Kishka_Profile_open.svg images/Scroll/Scroll_Lever.svg images/Scroll/Scroll_palka.svg images/Version_box/Kishka_Profile_Open.svg images/Version_box/Kishka_Ver_Active.svg images/Version_box/Kishka_Ver_idle.svg images/Trash.svg images/Pencil.svg images/GovuztTW8AAHqBf.jpeg images/photo_2025-12-16_15-04-17.jpg images/photo_2025-12-21_02-30-09.jpg i18n/translations.json
        RESOURCES images/launcherBackground.png
        RESOURCES images/launcherBackground2static.jpg
        RESOURCES CHANGELOG.md
        RESOURCES LICENSE
        RESOURCES README.md
)

# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
set_target_properties(BiLauncher PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER com.galeondev.BiLauncher
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION}
    MACOSX_BUNDLE_ICON_FILE icon.icns
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

target_link_libraries(BiLauncher
    PRIVATE Qt6::Quick Qt6::QuickControls2 Qt6::Svg Qt6::Core Qt6::CorePrivate Qt6::Gui Qt6::Network
)

target_include_directories(BiLauncher PRIVATE "${LAUNCHER_GENERATED_DIR}")
add_dependencies(BiLauncher launcher_version)

if(Qt6WebEngineQuick_FOUND)
    target_link_libraries(BiLauncher PRIVATE Qt6::WebEngineQuick)
    target_compile_definitions(BiLauncher PRIVATE LAUNCHER_HAS_WEBENGINE)
endif()

include(GNUInstallDirs)

if(UNIX AND NOT APPLE)
    set(LAUNCHER_ZLIB_DIR "${CMAKE_INSTALL_LIBDIR}/BiLauncher")
    set(LAUNCHER_ZLIB_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/zlib")

    add_library(launcher_zlib_reference SHARED
        ${LAUNCHER_ZLIB_SOURCES}/adler32.c
        ${LAUNCHER_ZLIB_SOURCES}/compress.c
        ${LAUNCHER_ZLIB_SOURCES}/crc32.c
        ${LAUNCHER_ZLIB_SOURCES}/deflate.c
        ${LAUNCHER_ZLIB_SOURCES}/gzclose.c
        ${LAUNCHER_ZLIB_SOURCES}/gzlib.c
        ${LAUNCHER_ZLIB_SOURCES}/gzread.c
        ${LAUNCHER_ZLIB_SOURCES}/gzwrite.c
        ${LAUNCHER_ZLIB_SOURCES}/infback.c
        ${LAUNCHER_ZLIB_SOURCES}/inffast.c
        ${LAUNCHER_ZLIB_SOURCES}/inflate.c
        ${LAUNCHER_ZLIB_SOURCES}/inftrees.c
        ${LAUNCHER_ZLIB_SOURCES}/trees.c
        ${LAUNCHER_ZLIB_SOURCES}/uncompr.c
        ${LAUNCHER_ZLIB_SOURCES}/zutil.c
    )
    target_include_directories(launcher_zlib_reference PRIVATE ${LAUNCHER_ZLIB_SOURCES})

    target_compile_definitions(launcher_zlib_reference PRIVATE
        HAVE_UNISTD_H=1 HAVE_STDARG_H=1 _LARGEFILE64_SOURCE=1)

    set_target_properties(launcher_zlib_reference PROPERTIES
        OUTPUT_NAME z
        VERSION 1.3.1
        SOVERSION 1
        C_VISIBILITY_PRESET default
        LIBRARY_OUTPUT_DIRECTORY $<TARGET_FILE_DIR:BiLauncher>/zlib
    )
    add_dependencies(BiLauncher launcher_zlib_reference)

    target_compile_definitions(BiLauncher PRIVATE
        LAUNCHER_ZLIB_INSTALL_DIR="${CMAKE_INSTALL_FULL_LIBDIR}/BiLauncher"
    )
    install(TARGETS launcher_zlib_reference LIBRARY DESTINATION ${LAUNCHER_ZLIB_DIR})

    foreach(icon_size IN ITEMS 16 24 32 48 64 128 256 512)
        install(FILES "${LAUNCHER_ICON_DIR}/icon_${icon_size}x${icon_size}.png"
            DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${icon_size}x${icon_size}/apps"
            RENAME bilauncher.png)
    endforeach()

    install(FILES "${LAUNCHER_ICON_DIR}/bilauncher.desktop"
        DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
endif()

if(NOT APPLE)
    install(FILES
        "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE"
        "${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.md"
        "${CMAKE_CURRENT_SOURCE_DIR}/packaging/THIRD_PARTY_LICENSES.txt"
        DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/doc/BiLauncher")
endif()

install(TARGETS BiLauncher
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
set(deploy_opts "")
if(APPLE)
    set(deploy_opts -hardened-runtime)
endif()
qt_generate_deploy_qml_app_script(
    TARGET BiLauncher
    OUTPUT_SCRIPT deploy_script
    MACOS_BUNDLE_POST_BUILD
    NO_UNSUPPORTED_PLATFORM_ERROR
    DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM
    DEPLOY_TOOL_OPTIONS ${deploy_opts})
install(SCRIPT ${deploy_script})
option(BILAUNCHER_BUILD_TESTS "Собрать автотесты (ctest)" OFF)
if(BILAUNCHER_BUILD_TESTS)
    enable_testing()
    add_subdirectory(tests)
endif()