cmake_minimum_required(VERSION 3.20)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

find_package(Qt6 6.6 REQUIRED COMPONENTS Gui Widgets Network DBus Concurrent Multimedia MultimediaWidgets WaylandClient)
if (Qt6_VERSION VERSION_GREATER_EQUAL 6.9.0)
  set(QT_NO_PRIVATE_MODULE_WARNING ON)
  find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)
endif()
find_package(LayerShellQt 6.0 REQUIRED)
find_package(KF6WindowSystem REQUIRED)
pkg_check_modules(LIBVTERM REQUIRED IMPORTED_TARGET vterm)
find_package(KWayland REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(WAYLAND_CLIENT REQUIRED IMPORTED_TARGET wayland-client)
find_program(WAYLAND_SCANNER_EXECUTABLE wayland-scanner REQUIRED)

set(WAYLAND_PROTOCOL_XMLS
    ${CMAKE_CURRENT_SOURCE_DIR}/../protocol/kde-blur.xml
    ${CMAKE_CURRENT_SOURCE_DIR}/../protocol/ext-background-effect-v1.xml
)
set(WAYLAND_PROTOCOL_SRCS)
foreach(PROTO_XML IN LISTS WAYLAND_PROTOCOL_XMLS)
  get_filename_component(PROTO_NAME ${PROTO_XML} NAME_WE)
  set(PROTO_GEN_C ${CMAKE_CURRENT_BINARY_DIR}/wayland-protocols/${PROTO_NAME}-protocol.c)
  set(PROTO_GEN_H ${CMAKE_CURRENT_BINARY_DIR}/wayland-protocols/${PROTO_NAME}-client-protocol.h)
  add_custom_command(
      OUTPUT ${PROTO_GEN_C} ${PROTO_GEN_H}
      COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/wayland-protocols
      COMMAND ${WAYLAND_SCANNER_EXECUTABLE} client-header ${PROTO_XML} ${PROTO_GEN_H}
      COMMAND ${WAYLAND_SCANNER_EXECUTABLE} private-code ${PROTO_XML} ${PROTO_GEN_C}
      DEPENDS ${PROTO_XML}
      VERBATIM)
  list(APPEND WAYLAND_PROTOCOL_SRCS ${PROTO_GEN_C})
endforeach()

set(GLASSTOP_COMMON_SRCS
    config/glasstop_config.cc
    display/popup_layer.cc
    view/desktop_menu.cc
    utils/desktop_item_launcher.cc
    utils/desktop_item_operations.cc
    utils/desktop_thumbnail_cache.cc
    utils/settings_launcher.cc
    utils/kde_window_utils.cc
    utils/kde_blur.cc
    utils/plasma_shell_surface.cc
    utils/screen_utils.cc
    utils/wallpaper_scaling.cc
    utils/wayland_surface_blur.cc
    utils/wayland_surface_utils.cc
    utils/album_images.cc
    utils/weather_service.cc
    utils/system_stats.cc
    utils/mpris_player_service.cc
    wallpaper/ascii_wallpaper.cc
    wallpaper/ascii_translated_wallpaper.cc
    view/desktop_widget_types.cc
    view/widget_sizes.cc
    ${WAYLAND_PROTOCOL_SRCS}
    config/glasstop_config.h
    view/desktop_grid.h
    display/popup_layer.h
    view/desktop_menu.h
    utils/desktop_item_launcher.h
    utils/desktop_item_operations.h
    utils/desktop_thumbnail_cache.h
    utils/settings_launcher.h
    utils/kde_window_utils.h
    utils/kde_blur.h
    utils/plasma_shell_surface.h
    utils/screen_utils.h
    utils/wallpaper_scaling.h
    utils/wayland_surface_blur.h
    utils/wayland_surface_utils.h
    utils/album_images.h
    utils/weather_service.h
    utils/system_stats.h
    utils/mpris_player_service.h
    wallpaper/ascii_wallpaper.h
    wallpaper/ascii_translated_wallpaper.h
)

add_library(glasstop_common STATIC ${GLASSTOP_COMMON_SRCS})
target_include_directories(glasstop_common PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}/wayland-protocols
)
target_link_libraries(glasstop_common PUBLIC
    Qt6::Gui
    Qt6::Widgets
    Qt6::Network
    Qt6::DBus
    Qt6::Concurrent
    Qt6::Multimedia
    Qt6::MultimediaWidgets
    Qt6::WaylandClient
    KF6::WindowSystem
    LayerShellQt::Interface
    Plasma::KWaylandClient
    PkgConfig::WAYLAND_CLIENT
)

if (TARGET Qt6::GuiPrivate)
  target_link_libraries(glasstop_common PRIVATE Qt6::GuiPrivate)
  target_compile_definitions(glasstop_common PRIVATE QT_FEATURE_wayland=1)
endif()

set(GLASSTOP_SRCS
    display/layer_window.cc
    view/desktop_context_menu.cc
    view/desktop_icon_layer.cc
    view/desktop_icon_manager.cc
    view/desktop_icon_widget.cc
    view/desktop_stack_grouper.cc
    view/desktop_stack_widget.cc
    view/desktop_quick_look.cc
    view/desktop_widget.cc
    view/metric_ring_widget.cc
    view/media_control_widget.cc
    view/desktop_widget_manager.cc
    view/desktop_widget_picker.cc
    view/notes_markdown_editor.cc
    view/terminal_pty.cc
    view/terminal_emulator.cc
    view/widget_terminal_surface.cc
    view/widget_terminal_view.cc
    view/glasstop_panel.cc
    view/glasstop_view.cc
    display/layer_window.h
    view/desktop_context_menu.h
    view/desktop_icon_layer.h
    view/desktop_icon_manager.h
    view/desktop_icon_widget.h
    view/desktop_stack_grouper.h
    view/desktop_stack_widget.h
    view/desktop_quick_look.h
    view/desktop_widget.h
    view/metric_ring_widget.h
    view/media_control_widget.h
    view/desktop_widget_manager.h
    view/desktop_widget_picker.h
    view/notes_markdown_editor.h
    view/terminal_pty.h
    view/terminal_emulator.h
    view/widget_terminal_surface.h
    view/widget_terminal_view.h
    view/desktop_widget_types.h
    view/widget_sizes.h
    view/glasstop_panel.h
    view/glasstop_view.h
)

add_executable(glasstop main.cc ${GLASSTOP_SRCS})
target_link_libraries(glasstop PRIVATE
    glasstop_common
    Qt6::Gui
    Qt6::Widgets
    PkgConfig::LIBVTERM
    util
    LayerShellQt::Interface
)

if (TARGET Qt6::GuiPrivate)
  target_link_libraries(glasstop PRIVATE Qt6::GuiPrivate)
endif()

install(TARGETS glasstop RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../configs/glasstop/defaults.jsonc
        DESTINATION ${CMAKE_INSTALL_PREFIX}/share/glasstop)
