cmake_minimum_required(VERSION 3.16)
project(kde-ollie VERSION 0.1.0 LANGUAGES CXX)

# Default to user-local install if no prefix specified
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local" CACHE PATH "Install prefix" FORCE)
endif()

# Ensure Qt6 is used
set(QT_DEFAULT_MAJOR_VERSION 6)

# Build lib9p (Go shared library) as part of the cmake build.
set(OLLIE9P_LIBRARY "${CMAKE_CURRENT_SOURCE_DIR}/lib9p/libollie9p.so")
set(OLLIE9P_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/lib9p/libollie9p.h")
set(OLLIE9P_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/lib9p")

add_custom_command(
    OUTPUT "${OLLIE9P_LIBRARY}" "${OLLIE9P_HEADER}"
    COMMAND go build -buildmode=c-shared -o "${OLLIE9P_LIBRARY}"
    WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib9p"
    COMMENT "Building lib9p (Go shared library)"
    VERBATIM
)
add_custom_target(lib9p_build DEPENDS "${OLLIE9P_LIBRARY}" "${OLLIE9P_HEADER}")

# The native clients link against the bundled C ABI library. Install it as a
# normal runtime library beside the executable, not in the Qt plugin tree.
# CMAKE_INSTALL_LIBDIR is relative to the install prefix (normally lib).
add_library(ollie9p SHARED IMPORTED GLOBAL)
set_target_properties(ollie9p PROPERTIES
    IMPORTED_LOCATION "${OLLIE9P_LIBRARY}"
    INTERFACE_INCLUDE_DIRECTORIES "${OLLIE9P_INCLUDE_DIR}"
)

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

find_package(ECM REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})

include(KDEInstallDirs)
include(GNUInstallDirs)
include(KDECMakeSettings)
include(KDECompilerSettings NO_POLICY_SCOPE)

install(FILES "${OLLIE9P_LIBRARY}" DESTINATION "${CMAKE_INSTALL_LIBDIR}")

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# --- Qt6 / KF6 ---
find_package(Qt6 REQUIRED COMPONENTS Core Widgets Quick QuickControls2 Network)
find_package(KF6CoreAddons REQUIRED)
find_package(KF6Config REQUIRED)
find_package(KF6SyntaxHighlighting REQUIRED)
find_package(KF6Runner REQUIRED)
find_package(KF6KIO REQUIRED)
find_package(KF6TextEditor REQUIRED)

# KDE's KDE_INSTALL_PLUGINDIR defaults to lib64/plugins/ but Qt6 plugins
# live under lib64/qt6/plugins/. Override so kcoreaddons_add_plugin installs
# to the correct location.
set(KDE_INSTALL_PLUGINDIR "${QT6_INSTALL_PLUGINS}" CACHE PATH "" FORCE)

# --- KRunner Plugin ---
kcoreaddons_add_plugin(krunner_ollie SOURCES krunner/ollie_runner.cpp INSTALL_NAMESPACE "kf6/krunner")
target_link_libraries(krunner_ollie
    KF6::Runner
    Qt6::Core
    Qt6::Widgets
)

# --- Kate Plugin ---
kcoreaddons_add_plugin(ollie_kate SOURCES
    kate/ollie_kate.cpp
    kate/ollie_ghost.cpp
    gui/lib9pclient.cpp
    INSTALL_NAMESPACE "kf6/ktexteditor"
)
add_dependencies(ollie_kate lib9p_build)
target_include_directories(ollie_kate PRIVATE
    ${CMAKE_SOURCE_DIR}/gui
    $ENV{HOME}/.local/include
)
target_link_libraries(ollie_kate
    KF6::TextEditor
    KF6::SyntaxHighlighting
    Qt6::Core
    Qt6::Widgets
    ${CMAKE_CURRENT_SOURCE_DIR}/lib9p/libollie9p.so
)

# --- KIO Worker ---
kcoreaddons_add_plugin(kio_ollie SOURCES
    kio/ollie_kio.cpp
    gui/lib9pclient.cpp
    INSTALL_NAMESPACE "kf6/kio"
)
add_dependencies(kio_ollie lib9p_build)
target_include_directories(kio_ollie PRIVATE
    ${CMAKE_SOURCE_DIR}/gui
    ${CMAKE_SOURCE_DIR}/kio
    $ENV{HOME}/.local/include
)
target_link_libraries(kio_ollie
    KF6::KIOCore
    Qt6::Core
    Qt6::Network
    ${CMAKE_CURRENT_SOURCE_DIR}/lib9p/libollie9p.so
)

# --- GUI App ---
add_executable(ollie-gui
    gui/main.cpp
    gui/ollie9pclient.cpp
    gui/sessionmodel.cpp
    gui/lib9pclient.cpp
    gui/lib9pstreamer.cpp
    gui/chatblockmodel.cpp
    gui/thememanager.cpp
    gui/clipboardhelper.cpp
    gui/plumber.cpp
    gui/ninep.cpp
    gui/plumbmsg.cpp
)
add_dependencies(ollie-gui lib9p_build)
target_include_directories(ollie-gui PRIVATE
    ${CMAKE_SOURCE_DIR}/gui
    $ENV{HOME}/.local/include
)
target_link_libraries(ollie-gui
    Qt6::Core
    Qt6::Widgets
    Qt6::Quick
    Qt6::QuickControls2
    Qt6::Network
    KF6::ConfigCore
    KF6::SyntaxHighlighting
    ${CMAKE_CURRENT_SOURCE_DIR}/lib9p/libollie9p.so
)
qt_add_resources(ollie-gui "gui"
    PREFIX "/"
    BASE gui
    FILES
        gui/main.qml
        gui/SettingsDialog.qml
        gui/NewSessionDialog.qml
        gui/NewAgentDialog.qml
        gui/GoalDialog.qml
        gui/ProcManagerWindow.qml
        gui/ChatBlockDelegate.qml
        gui/SessionTree.qml
        gui/ChatPane.qml
        gui/TextSelection.js
        gui/ollie.svg
)

# --- Install ---
install(TARGETS ollie-gui DESTINATION ${KDE_INSTALL_BINDIR})
# Note: KIO protocol is defined via ollie.json embedded in the plugin (KF6 style)
# The ollie.protocol file is not needed for KF6
