cmake_minimum_required(VERSION 3.16)

project(rewrite_qt VERSION 1.0.0 LANGUAGES CXX)

set(REWRITE_QT_DISPLAY_NAME "人脸识别考勤系统")
set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qml")
set(REWRITE_QT_OUTPUT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/dist")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${REWRITE_QT_OUTPUT_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${REWRITE_QT_OUTPUT_DIR}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${REWRITE_QT_OUTPUT_DIR}")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOMOC_COMPILER_PREDEFINES OFF)
set(CMAKE_AUTORCC ON)

file(TO_CMAKE_PATH "$ENV{LOCALAPPDATA}" REWRITE_QT_LOCALAPPDATA)
if(REWRITE_QT_LOCALAPPDATA)
    set(REWRITE_QT_AUTOGEN_DIR "${REWRITE_QT_LOCALAPPDATA}/rewrite_qt_autogen")
else()
    set(REWRITE_QT_AUTOGEN_DIR "${CMAKE_BINARY_DIR}/autogen_ascii")
endif()
file(MAKE_DIRECTORY "${REWRITE_QT_AUTOGEN_DIR}")

find_package(Qt6 6.2 REQUIRED COMPONENTS Core Gui Qml Quick QuickControls2 Network)

get_target_property(REWRITE_QT_QMAKE_EXECUTABLE Qt6::qmake IMPORTED_LOCATION)
if(REWRITE_QT_QMAKE_EXECUTABLE)
    execute_process(
        COMMAND "${REWRITE_QT_QMAKE_EXECUTABLE}" -query QT_INSTALL_QML
        OUTPUT_VARIABLE REWRITE_QT_INSTALL_QML
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
endif()

qt_standard_project_setup()

set(REWRITE_QT_APP_ICON "${CMAKE_CURRENT_SOURCE_DIR}/assets/favicon.ico")
set(REWRITE_QT_ICON_RESOURCES
    assets/favicon.ico
    assets/favicon-256x256.png
    assets/favicon-192x192.png
    assets/favicon-128x128.png
    assets/favicon-64x64.png
    assets/favicon-48x48.png
    assets/favicon-32x32.png
    assets/favicon-16x16.png
)

qt_add_executable(apprewrite_qt
    main.cpp
    src/AppController.cpp
    src/ApiClient.cpp
    src/CryptoUtils.cpp
    src/RecordListModel.cpp
    src/StatisticsListModel.cpp
    src/TimeSlotListModel.cpp
    src/MappingListModel.cpp
    src/FaceListModel.cpp
)

if(REWRITE_QT_INSTALL_QML)
    target_compile_definitions(apprewrite_qt PRIVATE
        REWRITE_QT_INSTALL_QML="${REWRITE_QT_INSTALL_QML}"
    )
endif()

if(WIN32 AND EXISTS "${REWRITE_QT_APP_ICON}")
    set(REWRITE_QT_WIN32_ICON_RC "${CMAKE_CURRENT_BINARY_DIR}/app_icon.rc")
    configure_file(cmake/app_icon.rc.in "${REWRITE_QT_WIN32_ICON_RC}" @ONLY)
    target_sources(apprewrite_qt PRIVATE "${REWRITE_QT_WIN32_ICON_RC}")
endif()

if(ANDROID)
    set_target_properties(apprewrite_qt PROPERTIES
        QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android"
        QT_ANDROID_APP_NAME "${REWRITE_QT_DISPLAY_NAME}"
        QT_ANDROID_APP_ICON "@mipmap/ic_launcher"
    )
endif()

target_include_directories(apprewrite_qt PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/src
)

set(REWRITE_QT_RESOURCE_FILES
    qml/Main.qml
)

foreach(REWRITE_QT_ICON_RESOURCE IN LISTS REWRITE_QT_ICON_RESOURCES)
    if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${REWRITE_QT_ICON_RESOURCE}")
        list(APPEND REWRITE_QT_RESOURCE_FILES "${REWRITE_QT_ICON_RESOURCE}")
    endif()
endforeach()

qt_add_resources(apprewrite_qt "qml_resources"
    PREFIX "/"
    FILES
        ${REWRITE_QT_RESOURCE_FILES}
)

target_link_libraries(apprewrite_qt
    PRIVATE
        Qt6::Core
        Qt6::Gui
        Qt6::Qml
        Qt6::Quick
        Qt6::QuickControls2
        Qt6::Network
)

set_target_properties(apprewrite_qt PROPERTIES
    AUTOGEN_BUILD_DIR "${REWRITE_QT_AUTOGEN_DIR}"
    QT_QML_MODULE_NO_IMPORT_SCAN TRUE
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

include(GNUInstallDirs)

if(UNIX AND NOT APPLE AND NOT ANDROID)
    set(REWRITE_QT_DESKTOP_FILE "${CMAKE_CURRENT_BINARY_DIR}/rewrite_qt.desktop")
    configure_file(cmake/rewrite_qt.desktop.in "${REWRITE_QT_DESKTOP_FILE}" @ONLY)
    install(FILES "${REWRITE_QT_DESKTOP_FILE}"
        DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications"
    )

    foreach(REWRITE_QT_ICON_SIZE IN ITEMS 16 32 48 64 128 192 256)
        set(REWRITE_QT_LINUX_ICON "${CMAKE_CURRENT_SOURCE_DIR}/assets/favicon-${REWRITE_QT_ICON_SIZE}x${REWRITE_QT_ICON_SIZE}.png")
        if(EXISTS "${REWRITE_QT_LINUX_ICON}")
            install(FILES "${REWRITE_QT_LINUX_ICON}"
                DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${REWRITE_QT_ICON_SIZE}x${REWRITE_QT_ICON_SIZE}/apps"
                RENAME rewrite_qt.png
            )
        endif()
    endforeach()
endif()

install(TARGETS apprewrite_qt
    BUNDLE DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
