cmake_minimum_required(VERSION 3.21)
project(BuzzQuestionStudio VERSION 0.3.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
include(CTest)
find_package(Qt6 6.2 REQUIRED COMPONENTS Core Gui Widgets Quick QuickControls2 Concurrent Svg LinguistTools)

add_library(studio_core STATIC src/document.cpp src/document.h src/buzz_import.cpp src/buzz_import.h src/languages.cpp src/languages.h)
target_link_libraries(studio_core PUBLIC Qt6::Core)
target_include_directories(studio_core PUBLIC src)
add_library(studio_build STATIC src/pack_format.h src/pack_codec.h src/pack_codec.cpp
    src/pack_media.h src/pack_media.cpp src/pack_atrac.cpp src/pack_builder.h src/pack_builder.cpp)
target_link_libraries(studio_build PUBLIC studio_core Qt6::Gui)
add_library(studio_app STATIC src/controller.cpp src/controller.h src/tts.cpp src/tts.h src/localization.cpp src/localization.h)
qt_add_translation(studio_translations i18n/studio_en.ts)
qt_add_resources(studio_app studio_translations PREFIX "/i18n"
    BASE "${CMAKE_CURRENT_BINARY_DIR}" FILES ${studio_translations})
target_link_libraries(studio_app PUBLIC studio_build Qt6::Gui Qt6::Concurrent)
if(WIN32)
    target_link_libraries(studio_app PRIVATE sapi ole32)
endif()
add_executable(BuzzQuestionStudio WIN32 src/main.cpp resources.qrc)
target_compile_definitions(BuzzQuestionStudio PRIVATE STUDIO_VERSION="${PROJECT_VERSION}")
target_link_libraries(BuzzQuestionStudio PRIVATE studio_app Qt6::Widgets Qt6::Quick Qt6::QuickControls2 Qt6::Svg)
set(studio_qml ui/Main.qml ui/Theme.qml ui/StudioButton.qml ui/EditorField.qml ui/PackDialogs.qml)
foreach(qml IN LISTS studio_qml)
    get_filename_component(qml_name "${qml}" NAME)
    set_source_files_properties("${qml}" PROPERTIES QT_RESOURCE_ALIAS "${qml_name}")
endforeach()
set_source_files_properties(ui/Theme.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)
qt_add_qml_module(BuzzQuestionStudio URI Buzz.Studio VERSION 1.0 RESOURCE_PREFIX "/"
    OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Buzz/Studio" QML_FILES ${studio_qml})
if(MSVC)
    target_compile_options(studio_core PRIVATE /W4 /utf-8)
    target_compile_options(studio_build PRIVATE /W4 /utf-8)
    target_compile_options(studio_app PRIVATE /W4 /utf-8)
    target_compile_options(BuzzQuestionStudio PRIVATE /W4 /utf-8)
else()
    target_compile_options(studio_core PRIVATE -Wall -Wextra -Wpedantic)
    target_compile_options(studio_build PRIVATE -Wall -Wextra -Wpedantic)
    target_compile_options(studio_app PRIVATE -Wall -Wextra -Wpedantic)
    target_compile_options(BuzzQuestionStudio PRIVATE -Wall -Wextra -Wpedantic)
endif()
if(BUILD_TESTING)
    find_package(Qt6 REQUIRED COMPONENTS Test)
    add_executable(studio_document_test tests/document_test.cpp)
    target_link_libraries(studio_document_test PRIVATE studio_core Qt6::Test)
    add_test(NAME studio-document COMMAND studio_document_test)
    add_executable(studio_controller_test tests/controller_test.cpp)
    target_link_libraries(studio_controller_test PRIVATE studio_app Qt6::Test)
    add_test(NAME studio-controller COMMAND studio_controller_test)
    add_executable(studio_builder_test tests/builder_test.cpp)
    target_link_libraries(studio_builder_test PRIVATE studio_build Qt6::Test)
    add_test(NAME studio-builder COMMAND studio_builder_test)
    set_tests_properties(studio-builder PROPERTIES TIMEOUT 120)
    add_executable(studio_ui_test tests/ui_test.cpp resources.qrc)
    target_link_libraries(studio_ui_test PRIVATE studio_app Qt6::Widgets Qt6::Test Qt6::Quick Qt6::QuickControls2 Qt6::Svg)
    qt_add_qml_module(studio_ui_test URI Buzz.TestStudio VERSION 1.0 RESOURCE_PREFIX "/"
        OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/Buzz/TestStudio" QML_FILES ${studio_qml})
    if(MSVC)
        target_compile_options(studio_ui_test PRIVATE /utf-8)
    endif()
    add_test(NAME studio-ui-edit COMMAND studio_ui_test)
    add_test(NAME studio-ui COMMAND BuzzQuestionStudio --smoke)
    set_tests_properties(studio-ui studio-ui-edit PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=offscreen;QT_QUICK_BACKEND=software;QT_FORCE_STDERR_LOGGING=1" TIMEOUT 20)
    if(WIN32)
        set_property(TEST studio-ui studio-ui-edit APPEND PROPERTY ENVIRONMENT "QT_QPA_FONTDIR=$ENV{WINDIR}/Fonts")
    endif()
endif()
install(TARGETS BuzzQuestionStudio RUNTIME DESTINATION bin)
install(FILES resources/buzz-question-studio.desktop DESTINATION share/applications)
install(FILES resources/studio.svg DESTINATION share/icons/hicolor/scalable/apps RENAME buzz-question-studio.svg)
install(FILES ../LICENSE DESTINATION share/licenses/BuzzQuestionStudio)
