cmake_minimum_required(VERSION 3.16)

# Keep application and package versions in sync with the latest Debian release.
set(DEBIAN_CHANGELOG "${CMAKE_CURRENT_SOURCE_DIR}/debian/changelog")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${DEBIAN_CHANGELOG}")
file(STRINGS "${DEBIAN_CHANGELOG}" CHANGELOG_HEADER LIMIT_COUNT 1)
if(NOT CHANGELOG_HEADER MATCHES "^[^ \t]+[ \t]+\\(([^)]+)\\)")
    message(FATAL_ERROR "Cannot read the version from ${DEBIAN_CHANGELOG}")
endif()
set(APP_VERSION "${CMAKE_MATCH_1}")

# CMake project versions only accept numbers; preserve the full Debian version
# in APP_VERSION for the application and CPack, including any epoch or suffix.
string(REGEX REPLACE "^[0-9]+:" "" APP_UPSTREAM_VERSION "${APP_VERSION}")
if(NOT APP_UPSTREAM_VERSION MATCHES "^[0-9]+(\\.[0-9]+)?(\\.[0-9]+)?(\\.[0-9]+)?")
    message(FATAL_ERROR "Cannot extract a numeric project version from ${APP_VERSION}")
endif()
project(openkylin-token-center VERSION "${CMAKE_MATCH_0}" LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

include(GNUInstallDirs)
include(CTest)
find_package(Qt6 6.0 REQUIRED COMPONENTS Core Gui Widgets Network Svg)

add_executable(openkylin-token-center
    src/main.cpp
    src/mainwindow.cpp
    src/mainwindow.h
    src/apiclient.cpp
    src/apiclient.h
    src/deviceservice.cpp
    src/deviceservice.h
    src/models.h
    resources/resources.qrc
    translations/translations.qrc
)

target_link_libraries(openkylin-token-center PRIVATE
    Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network Qt6::Svg
)

target_compile_definitions(openkylin-token-center PRIVATE
    APP_VERSION="${APP_VERSION}"
    TRANSLATION_INSTALL_DIR="${CMAKE_INSTALL_FULL_DATADIR}/openkylin-token-center/translations"
)

install(TARGETS openkylin-token-center RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES packaging/org.openkylin.TokenCenter.desktop
    DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES resources/org.openkylin.TokenCenter.svg
    DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps)
set(APP_ICON_SIZES 16 24 32 48 64 128 256 512)
foreach(ICON_SIZE IN LISTS APP_ICON_SIZES)
    install(FILES resources/icons/${ICON_SIZE}x${ICON_SIZE}/org.openkylin.TokenCenter.png
        DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/${ICON_SIZE}x${ICON_SIZE}/apps)
endforeach()
install(FILES translations/openkylin-token-center_en.qm
    DESTINATION ${CMAKE_INSTALL_DATADIR}/openkylin-token-center/translations)

if(BUILD_TESTING)
    find_package(Qt6 6.0 QUIET COMPONENTS Test)
    if(TARGET Qt6::Test)
        add_executable(device-service-test
            tests/deviceservice_test.cpp
            src/deviceservice.cpp
            src/deviceservice.h
            src/models.h
        )
        target_include_directories(device-service-test PRIVATE src)
        target_link_libraries(device-service-test PRIVATE Qt6::Core Qt6::Network Qt6::Test)
        add_test(NAME device-service-test COMMAND device-service-test)
        set_tests_properties(device-service-test PROPERTIES
            ENVIRONMENT "XDG_CONFIG_HOME=${CMAKE_CURRENT_BINARY_DIR}/test-config")

        add_executable(api-client-test
            tests/apiclient_test.cpp
            src/apiclient.cpp
            src/apiclient.h
            src/deviceservice.cpp
            src/deviceservice.h
            src/models.h
        )
        target_include_directories(api-client-test PRIVATE src)
        target_compile_definitions(api-client-test PRIVATE APP_VERSION="${APP_VERSION}")
        target_link_libraries(api-client-test PRIVATE Qt6::Core Qt6::Gui Qt6::Network Qt6::Test)
        add_test(NAME api-client-test COMMAND api-client-test)
        set_tests_properties(api-client-test PROPERTIES
            ENVIRONMENT "XDG_CONFIG_HOME=${CMAKE_CURRENT_BINARY_DIR}/test-api-config")

    endif()
endif()

set(CPACK_GENERATOR "DEB")
set(CPACK_PACKAGE_NAME "openkylin-token-center")
set(CPACK_PACKAGE_VERSION "${APP_VERSION}")
set(CPACK_PACKAGE_CONTACT "openKylin Token Team")
set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
set(CPACK_DEBIAN_PACKAGE_DEPENDS "qt6-qpa-plugins, qt6-wayland, qt6-svg-plugins, qt6-translations-l10n")
set(CPACK_STRIP_FILES ON)
set(CPACK_PACKAGE_HOMEPAGE_URL "https://www.openkylin.top/")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "openKylin Token installation verification client")
include(CPack)
