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 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(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(GLASSLIGHT_SRCS
    main.cc
    config/glasslight_config.cc
    display/layer_window.cc
    model/app_catalog.cc
    utils/app_launcher.cc
    utils/desktop_file.cc
    utils/icon_cache.cc
    utils/icon_utils.cc
    utils/kde_window_utils.cc
    utils/screen_utils.cc
    utils/single_instance.cc
    utils/wayland_surface_blur.cc
    utils/wayland_surface_utils.cc
    view/glasslight_window.cc
    view/search_panel.cc
    view/results_panel.cc
    view/app_grid_item.cc
    config/glasslight_config.h
    display/layer_window.h
    model/app_entry.h
    model/app_catalog.h
    utils/app_launcher.h
    utils/desktop_file.h
    utils/glass_paint.h
    utils/icon_cache.h
    utils/icon_utils.h
    utils/kde_window_utils.h
    utils/screen_utils.h
    utils/single_instance.h
    utils/smooth_scroll.h
    utils/wayland_surface_blur.h
    utils/wayland_surface_utils.h
    view/glasslight_window.h
    view/search_panel.h
    view/results_panel.h
    view/app_grid_item.h
    ${WAYLAND_PROTOCOL_SRCS}
)

add_executable(glasslight ${GLASSLIGHT_SRCS})
target_include_directories(glasslight PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}/wayland-protocols
)
target_link_libraries(glasslight PRIVATE
    Qt6::Gui
    Qt6::Widgets
    Qt6::Network
    Qt6::DBus
    Qt6::WaylandClient
    LayerShellQt::Interface
    PkgConfig::WAYLAND_CLIENT
)

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

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