cmake_minimum_required(VERSION 3.16)
project(bianbu-displays VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

# Find Qt6
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets DBus LinguistTools)

# Optional Wayland layer-shell support for real-screen identify overlays.
find_package(LayerShellQt QUIET)
if(LayerShellQt_FOUND)
    set(HAVE_LAYER_SHELL TRUE)
else()
    set(HAVE_LAYER_SHELL FALSE)
endif()

# Find bianbu-control-center-sdk
find_package(PkgConfig REQUIRED)
pkg_check_modules(CONTROL_CENTER REQUIRED bianbu-control-center-sdk)

# Option to build as plugin
option(BUILD_PLUGIN "Build as control center plugin" OFF)

# ============================================================================
# Source files — organized by MVC + Service layers
# ============================================================================

set(MODEL_SOURCES
    src/model/monitormodel.cpp
)
set(MODEL_HEADERS
    src/model/monitormodel.h
)

set(VIEW_SOURCES
    src/view/monitorpreview.cpp
    src/view/screenidentifyoverlay.cpp
    src/view/settingspanel.cpp
    src/view/confirmdialog.cpp
)
set(VIEW_HEADERS
    src/view/monitorpreview.h
    src/view/screenidentifyoverlay.h
    src/view/settingspanel.h
    src/view/confirmdialog.h
)

set(CONTROLLER_SOURCES
    src/controller/monitorcontroller.cpp
)
set(CONTROLLER_HEADERS
    src/controller/monitorcontroller.h
)

set(SERVICE_SOURCES
    src/service/labwcadapter.cpp
    src/service/backlightmanager.cpp
)
set(SERVICE_HEADERS
    src/service/labwcadapter.h
    src/service/backlightmanager.h
)

set(COMMON_HEADERS
    src/displayconfig.h
)

set(ALL_SOURCES
    ${MODEL_SOURCES}
    ${VIEW_SOURCES}
    ${CONTROLLER_SOURCES}
    ${SERVICE_SOURCES}
)

set(ALL_HEADERS
    ${COMMON_HEADERS}
    ${MODEL_HEADERS}
    ${VIEW_HEADERS}
    ${CONTROLLER_HEADERS}
    ${SERVICE_HEADERS}
)

# Translation files
set(TS_FILES
    ${CMAKE_CURRENT_SOURCE_DIR}/src/plugin/translations/bianbu-control-center-displays_zh_CN.ts
)

# Resources
set(RESOURCES
    resources/resources.qrc
)

# ============================================================================
# Main executable
# ============================================================================

add_executable(bianbu-displays
    src/main.cpp
    ${ALL_SOURCES}
    ${ALL_HEADERS}
    ${RESOURCES}
)

# Add translations
qt6_add_translations(bianbu-displays
    TS_FILES ${TS_FILES}
    QM_FILES_OUTPUT_VARIABLE QM_FILES
)

target_include_directories(bianbu-displays PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${CMAKE_CURRENT_SOURCE_DIR}/src/model
    ${CMAKE_CURRENT_SOURCE_DIR}/src/view
    ${CMAKE_CURRENT_SOURCE_DIR}/src/controller
    ${CMAKE_CURRENT_SOURCE_DIR}/src/service
    ${CONTROL_CENTER_INCLUDE_DIRS}
)

target_link_libraries(bianbu-displays PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::DBus
    ${CONTROL_CENTER_LIBRARIES}
)

if(HAVE_LAYER_SHELL)
    target_link_libraries(bianbu-displays PRIVATE LayerShellQt::Interface)
    target_compile_definitions(bianbu-displays PRIVATE HAVE_LAYER_SHELL=1)
endif()

target_compile_definitions(bianbu-displays PRIVATE
    PACKAGE_DATA_DIR="${CMAKE_INSTALL_PREFIX}/share/bianbu-displays"
    PACKAGE_LOCALE_DIR="${CMAKE_INSTALL_PREFIX}/share/locale"
)

# ============================================================================
# Plugin library (optional, for control center integration)
# ============================================================================

if(BUILD_PLUGIN)

    # Plugin translation files
    set(PLUGIN_TS_FILES
        ${CMAKE_CURRENT_SOURCE_DIR}/src/plugin/translations/bianbu-control-center-displays_zh_CN.ts
    )

    add_library(bianbu-displays-plugin SHARED
        src/plugin/display_plugin.cpp
        src/plugin/display_plugin.h
        ${ALL_SOURCES}
        ${ALL_HEADERS}
        ${RESOURCES}
    )

    qt6_add_translations(bianbu-displays-plugin
        TS_FILES ${PLUGIN_TS_FILES}
        QM_FILES_OUTPUT_VARIABLE PLUGIN_QM_FILES
    )

    target_include_directories(bianbu-displays-plugin PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/src
        ${CMAKE_CURRENT_SOURCE_DIR}/src/model
        ${CMAKE_CURRENT_SOURCE_DIR}/src/view
        ${CMAKE_CURRENT_SOURCE_DIR}/src/controller
        ${CMAKE_CURRENT_SOURCE_DIR}/src/service
        ${CONTROL_CENTER_INCLUDE_DIRS}
    )

    target_link_libraries(bianbu-displays-plugin PRIVATE
        Qt6::Core
        Qt6::Gui
        Qt6::Widgets
        Qt6::DBus
        ${CONTROL_CENTER_LIBRARIES}
    )

    if(HAVE_LAYER_SHELL)
        target_link_libraries(bianbu-displays-plugin PRIVATE LayerShellQt::Interface)
        target_compile_definitions(bianbu-displays-plugin PRIVATE HAVE_LAYER_SHELL=1)
    endif()

    target_compile_definitions(bianbu-displays-plugin PRIVATE
        PACKAGE_DATA_DIR="${CMAKE_INSTALL_PREFIX}/share/bianbu-displays"
        PACKAGE_LOCALE_DIR="${CMAKE_INSTALL_PREFIX}/share/locale"
        BUILD_PLUGIN
    )
endif()

# ============================================================================
# Backlight helper (privileged sysfs writer)
# ============================================================================

add_executable(display-backlight-helper
    helper/display-backlight-helper.cpp
)
target_link_libraries(display-backlight-helper PRIVATE Qt6::Core)

# ============================================================================
# Install targets
# ============================================================================

include(GNUInstallDirs)

install(TARGETS bianbu-displays DESTINATION ${CMAKE_INSTALL_BINDIR})
install(TARGETS display-backlight-helper
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/display-settings)
install(FILES data/bianbu-displays.desktop
        DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install(FILES data/org.display-settings.backlight.policy
        DESTINATION ${CMAKE_INSTALL_DATADIR}/polkit-1/actions)

# Install standalone translation files
if(QM_FILES)
    install(FILES ${QM_FILES}
            DESTINATION ${CMAKE_INSTALL_DATADIR}/bianbu-displays/translations)
endif()

if(BUILD_PLUGIN)
    install(TARGETS bianbu-displays-plugin
            DESTINATION ${CMAKE_INSTALL_LIBDIR}/bianbu-control-center)
    # Install plugin translation files
    if(PLUGIN_QM_FILES)
        install(FILES ${PLUGIN_QM_FILES}
                DESTINATION ${CMAKE_INSTALL_DATADIR}/bianbu-control-center/translations)
    endif()
endif()
