cmake_minimum_required(VERSION 3.21)

project(NebulaBigscreen VERSION 0.1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

find_package(Qt6 6.5 REQUIRED COMPONENTS Quick Gui)
find_package(SDL3 CONFIG QUIET)

if(NOT SDL3_FOUND)
    include(FetchContent)
    set(SDL_SHARED ON CACHE BOOL "" FORCE)
    set(SDL_STATIC OFF CACHE BOOL "" FORCE)
    set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE)
    set(SDL_TESTS OFF CACHE BOOL "" FORCE)
    set(SDL_EXAMPLES OFF CACHE BOOL "" FORCE)

    FetchContent_Declare(SDL3
        URL https://github.com/libsdl-org/SDL/releases/download/release-3.2.30/SDL3-3.2.30.tar.gz
        DOWNLOAD_EXTRACT_TIMESTAMP TRUE
    )
    FetchContent_MakeAvailable(SDL3)
endif()

if(TARGET SDL3::SDL3)
    set(BIGSCREEN_SDL_TARGET SDL3::SDL3)
elseif(TARGET SDL3::SDL3-shared)
    set(BIGSCREEN_SDL_TARGET SDL3::SDL3-shared)
else()
    message(FATAL_ERROR "SDL3 target was not found after package lookup/fetch")
endif()

qt_standard_project_setup(REQUIRES 6.5)
qt_policy(SET QTP0004 NEW)

set(BIGSCREEN_QML_FILES
    qml/Main.qml
    qml/ShellWindow.qml
    qml/Theme.qml
    qml/components/NebulaBackground.qml
    qml/components/TopBar.qml
    qml/components/AppTile.qml
    qml/components/TileRail.qml
    qml/components/PowerOverlay.qml
    qml/views/HomeView.qml
    qml/views/LibraryView.qml
    qml/views/SettingsView.qml
)

set_source_files_properties(qml/Theme.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE)

qt_add_executable(nebula-bigscreen
    src/main.cpp
    src/ControllerInputService.cpp
    src/ControllerInputService.h
    src/InputRouter.cpp
    src/InputRouter.h
)

qt_add_qml_module(nebula-bigscreen
    URI Nebula.Bigscreen
    VERSION 1.0
    QML_FILES ${BIGSCREEN_QML_FILES}
)

target_link_libraries(nebula-bigscreen
    PRIVATE
        Qt6::Quick
        Qt6::Gui
        ${BIGSCREEN_SDL_TARGET}
)

if(WIN32)
    add_custom_command(
        TARGET nebula-bigscreen
        POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            $<TARGET_RUNTIME_DLLS:nebula-bigscreen>
            $<TARGET_FILE_DIR:nebula-bigscreen>
        COMMAND_EXPAND_LISTS
        COMMENT "Copying runtime DLLs next to nebula-bigscreen"
    )
endif()

if(WIN32)
    set_target_properties(nebula-bigscreen PROPERTIES WIN32_EXECUTABLE TRUE)

    get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION)
    get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
    find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}" REQUIRED)

    add_custom_command(
        TARGET nebula-bigscreen
        POST_BUILD
        COMMAND "${WINDEPLOYQT_EXECUTABLE}"
            $<$<CONFIG:Debug>:--debug>
            $<$<NOT:$<CONFIG:Debug>>:--release>
            --qmldir "${CMAKE_CURRENT_SOURCE_DIR}/qml"
            "$<TARGET_FILE:nebula-bigscreen>"
        COMMENT "Deploying Qt runtime DLLs next to nebula-bigscreen"
    )
endif()

install(TARGETS nebula-bigscreen RUNTIME DESTINATION bin)
