cmake_minimum_required(VERSION 3.22)
project(lumen-wallpaper VERSION 0.1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

find_package(ECM 6.0.0 REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
include(KDEInstallDirs)
include(KDECMakeSettings)
include(KDECompilerSettings NO_POLICY_SCOPE)

find_package(Qt6 6.6 REQUIRED COMPONENTS Core Gui Qml Quick)

set(LUMEN_PACKAGE_ID dev.emil.lumen)
set(LUMEN_INSTALL_DIR "${KDE_INSTALL_DATADIR}/plasma/wallpapers/${LUMEN_PACKAGE_ID}")
set(LUMEN_RUST_LIBRARY "${CMAKE_BINARY_DIR}/cargo/release/liblumen_renderer.a")

file(GLOB_RECURSE LUMEN_RUST_SOURCES CONFIGURE_DEPENDS
    "${CMAKE_SOURCE_DIR}/renderer/*.rs"
)
add_custom_command(
    OUTPUT "${LUMEN_RUST_LIBRARY}"
    COMMAND "${CMAKE_COMMAND}" -E env CARGO_TARGET_DIR=${CMAKE_BINARY_DIR}/cargo
            cargo build --release
    WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
    DEPENDS ${LUMEN_RUST_SOURCES}
            "${CMAKE_SOURCE_DIR}/Cargo.toml"
            "${CMAKE_SOURCE_DIR}/Cargo.lock"
    COMMENT "Building the Rust Vulkan renderer"
    VERBATIM
)
add_custom_target(lumen_renderer_build DEPENDS "${LUMEN_RUST_LIBRARY}")
add_library(lumen_renderer STATIC IMPORTED GLOBAL)
set_target_properties(lumen_renderer PROPERTIES IMPORTED_LOCATION "${LUMEN_RUST_LIBRARY}")
add_dependencies(lumen_renderer lumen_renderer_build)

add_library(lumenplugin MODULE
    src/plugin.cpp
    src/plugin.h
    src/wallpaperitem.cpp
    src/wallpaperitem.h
    src/rendernode.cpp
    src/rendernode.h
    src/lumen_ffi.h
)
target_include_directories(lumenplugin PRIVATE "${CMAKE_SOURCE_DIR}/src")
target_link_libraries(lumenplugin PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Qml
    Qt6::Quick
    lumen_renderer
    ${CMAKE_DL_LIBS}
    pthread
    m
)
set_target_properties(lumenplugin PROPERTIES
    PREFIX "lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/package/contents/ui/lumen"
)

install(DIRECTORY package/ DESTINATION "${LUMEN_INSTALL_DIR}")
install(TARGETS lumenplugin
    LIBRARY DESTINATION "${LUMEN_INSTALL_DIR}/contents/ui/lumen"
)
