# kde-ollie top-level Makefile
# Build order: libollie.so (Go) → ollie-kde daemon (C++/CMake)

BUILD_DIR := build-cmake
LIB_DIR := build

.PHONY: all lib daemon clean run

all: daemon

# Step 1: Build libollie.so from Go
lib: $(LIB_DIR)/libollie.so

$(LIB_DIR)/libollie.so: lib/capi.go lib/go.mod
	cd lib && go build -buildmode=c-shared -o ../$(LIB_DIR)/libollie.so

# Step 2: Build the C++ daemon against libollie.so
daemon: lib
	cmake -B $(BUILD_DIR) -S .
	cmake --build $(BUILD_DIR)

# Step 2b: Build using KF5/Qt5 (for Plasma 5.27)
kf5: lib
	cp CMakeLists.txt CMakeLists.txt.kf6.bak
	cp CMakeLists-kf5.txt CMakeLists.txt
	cmake -B $(BUILD_DIR) -S . --fresh
	cmake --build $(BUILD_DIR)
	mv CMakeLists.txt.kf6.bak CMakeLists.txt

# Install the KF5 build
kf5-install: kf5
	@echo "=== Installing ollie-kde (KF5) ==="
	# Daemon + shared library
	sudo install -m755 $(BUILD_DIR)/ollie-kde /usr/bin/
	sudo install -m755 $(BUILD_DIR)/ollie-tray /usr/bin/
	sudo install -m755 $(LIB_DIR)/libollie.so /usr/lib/x86_64-linux-gnu/
	# KRunner plugin
	sudo install -m755 $(BUILD_DIR)/lib/krunner_ollie.so \
		/usr/lib/x86_64-linux-gnu/qt5/plugins/kf5/krunner/
	# Kate plugin
	sudo install -m755 $(BUILD_DIR)/lib/ollie_kate.so \
		/usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/
	# Plasmoid QML plugin
	sudo mkdir -p /usr/lib/x86_64-linux-gnu/qt5/qml/org/ollie/private
	sudo install -m755 $(BUILD_DIR)/lib/libollieprivateplugin.so \
		/usr/lib/x86_64-linux-gnu/qt5/qml/org/ollie/private/
	sudo install -m644 plasmoid/plugin/qmldir \
		/usr/lib/x86_64-linux-gnu/qt5/qml/org/ollie/private/
	# Plasmoid package (swap metadata + QML for Plasma 5)
	cp plasmoid/metadata.json plasmoid/metadata.json.kf6.bak
	cp plasmoid/contents/ui/main.qml plasmoid/contents/ui/main.qml.kf6.bak
	cp plasmoid/metadata-kf5.json plasmoid/metadata.json
	cp plasmoid/contents/ui/main-kf5.qml plasmoid/contents/ui/main.qml
	kpackagetool5 -t Plasma/Applet -u plasmoid/ 2>/dev/null || \
		kpackagetool5 -t Plasma/Applet -i plasmoid/
	mv plasmoid/metadata.json.kf6.bak plasmoid/metadata.json
	mv plasmoid/contents/ui/main.qml.kf6.bak plasmoid/contents/ui/main.qml
	# Dolphin service menus + helpers
	mkdir -p ~/.local/share/kio/servicemenus
	install -m755 dolphin/ollie-actions.desktop ~/.local/share/kio/servicemenus/
	sudo install -m755 dolphin/ollie-ask /usr/local/bin/
	sudo install -m755 dolphin/ollie-session-here /usr/local/bin/
	# XDG autostart (starts with Plasma session)
	sudo install -m644 org.ollie.SessionManager.desktop /etc/xdg/autostart/
	# Finalize
	sudo ldconfig
	kquitapp5 krunner 2>/dev/null; true
	@echo ""
	@echo "=== Installation complete (KF5) ==="
	@echo "Restart Kate, KRunner, and plasmashell to pick up plugins."

kf5-uninstall:
	@echo "=== Uninstalling ollie-kde (KF5) ==="
	pkill -u "$$(id -u)" -x ollie-kde 2>/dev/null; true
	sudo rm -f /usr/bin/ollie-kde /usr/bin/ollie-tray
	sudo rm -f /usr/lib/x86_64-linux-gnu/libollie.so
	sudo rm -f /usr/lib/x86_64-linux-gnu/qt5/plugins/kf5/krunner/krunner_ollie.so
	sudo rm -f /usr/lib/x86_64-linux-gnu/qt5/plugins/ktexteditor/ollie_kate.so
	sudo rm -rf /usr/lib/x86_64-linux-gnu/qt5/qml/org/ollie
	kpackagetool5 -t Plasma/Applet -r org.ollie.plasmoid 2>/dev/null; true
	rm -f ~/.local/share/kio/servicemenus/ollie-actions.desktop
	sudo rm -f /usr/local/bin/ollie-ask /usr/local/bin/ollie-session-here
	sudo rm -f /etc/xdg/autostart/org.ollie.SessionManager.desktop
	sudo ldconfig
	kquitapp5 krunner 2>/dev/null; true
	@echo "=== Uninstall complete (KF5) ==="

# Run the daemon (useful for testing)
run: daemon
	LD_LIBRARY_PATH=$(LIB_DIR):$$LD_LIBRARY_PATH ./$(BUILD_DIR)/ollie-kde

# Run the system tray (daemon must be running)
tray: daemon
	./$(BUILD_DIR)/ollie-tray

# Install KRunner plugin
krunner-install: daemon
	sudo cp $(BUILD_DIR)/lib/kf6/krunner/krunner_ollie.so \
		/usr/lib64/qt6/plugins/kf6/krunner/
	kquitapp6 krunner 2>/dev/null; true
	@echo "KRunner plugin installed. Restart krunner or re-login."

clean:
	rm -rf $(BUILD_DIR)
	rm -f $(LIB_DIR)/libollie.so $(LIB_DIR)/libollie.h

# Install Dolphin service menus
dolphin-install:
	mkdir -p ~/.local/share/kio/servicemenus
	install -m755 dolphin/ollie-actions.desktop ~/.local/share/kio/servicemenus/
	sudo install -m755 dolphin/ollie-ask /usr/local/bin/
	sudo install -m755 dolphin/ollie-session-here /usr/local/bin/
	@echo "Dolphin menus installed. Restart Dolphin or re-open context menu."

# Install plasmoid to user's local plasma directory
plasmoid-install: daemon
	kpackagetool6 -t Plasma/Applet -u plasmoid/ 2>/dev/null || \
		kpackagetool6 -t Plasma/Applet -i plasmoid/
	sudo mkdir -p /usr/lib64/qt6/qml/org/ollie/private
	sudo cp $(BUILD_DIR)/org/ollie/private/ollie-plasmoid-pluginplugin.so \
		/usr/lib64/qt6/qml/org/ollie/private/libollie-plasmoid-pluginplugin.so
	sudo cp $(BUILD_DIR)/org/ollie/private/ollie-plasmoid-plugin.qmltypes \
		/usr/lib64/qt6/qml/org/ollie/private/
	sudo cp $(BUILD_DIR)/lib/libollie-plasmoid-plugin.so /usr/lib64/
	printf 'module org.ollie.private\nplugin ollie-plasmoid-pluginplugin\ntypeinfo ollie-plasmoid-plugin.qmltypes\ndepends QtQuick\n' | \
		sudo tee /usr/lib64/qt6/qml/org/ollie/private/qmldir > /dev/null
	sudo ldconfig
	@echo "Plasmoid installed. Restart plasmashell or add widget."

plasmoid-uninstall:
	kpackagetool6 -t Plasma/Applet -r org.ollie.plasmoid 2>/dev/null || true
	sudo rm -rf /usr/lib64/qt6/qml/org/ollie
	sudo rm -f /usr/lib64/libollie-plasmoid-plugin.so
	sudo ldconfig
	@echo "Plasmoid uninstalled."

install: daemon
	@echo "=== Installing ollie-kde ==="
	# Daemon + shared library
	sudo install -m755 $(BUILD_DIR)/ollie-kde /usr/bin/
	sudo install -m755 $(BUILD_DIR)/ollie-tray /usr/bin/
	sudo install -m755 $(LIB_DIR)/libollie.so /usr/lib64/
	# KRunner plugin
	sudo install -m755 $(BUILD_DIR)/lib/kf6/krunner/krunner_ollie.so \
		/usr/lib64/qt6/plugins/kf6/krunner/
	# Kate plugin
	sudo install -m755 $(BUILD_DIR)/lib/kf6/ktexteditor/ollie_kate.so \
		/usr/lib64/qt6/plugins/kf6/ktexteditor/
	# Plasmoid QML plugin
	sudo mkdir -p /usr/lib64/qt6/qml/org/ollie/private
	sudo cp $(BUILD_DIR)/org/ollie/private/ollie-plasmoid-pluginplugin.so \
		/usr/lib64/qt6/qml/org/ollie/private/libollie-plasmoid-pluginplugin.so
	sudo cp $(BUILD_DIR)/org/ollie/private/ollie-plasmoid-plugin.qmltypes \
		/usr/lib64/qt6/qml/org/ollie/private/
	sudo install -m755 $(BUILD_DIR)/lib/libollie-plasmoid-plugin.so /usr/lib64/
	printf 'module org.ollie.private\nplugin ollie-plasmoid-pluginplugin\ntypeinfo ollie-plasmoid-plugin.qmltypes\ndepends QtQuick\n' | \
		sudo tee /usr/lib64/qt6/qml/org/ollie/private/qmldir > /dev/null
	# Plasmoid package
	kpackagetool6 -t Plasma/Applet -u plasmoid/ 2>/dev/null || \
		kpackagetool6 -t Plasma/Applet -i plasmoid/
	# Dolphin service menus + helpers
	mkdir -p ~/.local/share/kio/servicemenus
	install -m755 dolphin/ollie-actions.desktop ~/.local/share/kio/servicemenus/
	sudo install -m755 dolphin/ollie-ask /usr/local/bin/
	sudo install -m755 dolphin/ollie-session-here /usr/local/bin/
	# XDG autostart (starts with Plasma session)
	sudo install -m644 org.ollie.SessionManager.desktop /etc/xdg/autostart/
	# Finalize
	sudo ldconfig
	kquitapp6 krunner 2>/dev/null; true
	@echo ""
	@echo "=== Installation complete ==="
	@echo "Restart Kate, KRunner, and plasmashell to pick up plugins."

uninstall:
	@echo "=== Uninstalling ollie-kde ==="
	# Stop daemon
	pkill -u "$(shell id -u)" -x ollie-kde 2>/dev/null; true
	# Daemon + shared library
	sudo rm -f /usr/bin/ollie-kde /usr/bin/ollie-tray
	sudo rm -f /usr/lib64/libollie.so /usr/lib64/libollie-plasmoid-plugin.so
	# KRunner plugin
	sudo rm -f /usr/lib64/qt6/plugins/kf6/krunner/krunner_ollie.so
	# Kate plugin
	sudo rm -f /usr/lib64/qt6/plugins/kf6/ktexteditor/ollie_kate.so
	# Plasmoid QML plugin
	sudo rm -rf /usr/lib64/qt6/qml/org/ollie
	# Plasmoid package
	kpackagetool6 -t Plasma/Applet -r org.ollie.plasmoid 2>/dev/null; true
	# Dolphin service menus + helpers
	rm -f ~/.local/share/kio/servicemenus/ollie-actions.desktop
	sudo rm -f /usr/local/bin/ollie-ask /usr/local/bin/ollie-session-here
	# XDG autostart
	sudo rm -f /etc/xdg/autostart/org.ollie.SessionManager.desktop
	# Finalize
	sudo ldconfig
	kquitapp6 krunner 2>/dev/null; true
	@echo "=== Uninstall complete ==="
