#!/usr/bin/env bash
# description: Manage KDE Plasma Activities via D-Bus. Args: <list|current|switch|create|remove> [name_or_id]
set -euo pipefail

SERVICE="org.kde.ActivityManager"
OBJ_PATH="/ActivityManager/Activities"
IFACE="org.kde.ActivityManager.Activities"

cmd="${1:-list}"

case "$cmd" in
    list)
        # List all activities with their names and states
        ids=$(gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.ListActivities" 2>/dev/null | \
            sed "s/^(\[//;s/\],)$//;s/'//g;s/, /\n/g")

        if [ -z "$ids" ]; then
            echo "ERROR: cannot list activities (ActivityManager not running?)" >&2
            exit 1
        fi

        current=$(gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.CurrentActivity" 2>/dev/null | \
            sed "s/^('//;s/',)$//")

        echo "ID	STATE	NAME"
        while IFS= read -r id; do
            [ -z "$id" ] && continue
            name=$(gdbus call --session --dest "$SERVICE" \
                --object-path "$OBJ_PATH" \
                --method "$IFACE.ActivityName" "$id" 2>/dev/null | \
                sed "s/^('//;s/',)$//")
            if [ "$id" = "$current" ]; then
                state="active"
            else
                state="stopped"
            fi
            echo "$id	$state	$name"
        done <<< "$ids"
        ;;
    current)
        id=$(gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.CurrentActivity" 2>/dev/null | \
            sed "s/^('//;s/',)$//")
        name=$(gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.ActivityName" "$id" 2>/dev/null | \
            sed "s/^('//;s/',)$//")
        echo "$id	$name"
        ;;
    switch)
        target="${2:?usage: gui_activities switch <name_or_id>}"

        # Try as ID first
        result=$(gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.SetCurrentActivity" "$target" 2>/dev/null) && {
            echo "switched to: $target"
            exit 0
        }

        # Search by name
        ids=$(gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.ListActivities" 2>/dev/null | \
            sed "s/^(\[//;s/\],)$//;s/'//g;s/, /\n/g")

        while IFS= read -r id; do
            [ -z "$id" ] && continue
            name=$(gdbus call --session --dest "$SERVICE" \
                --object-path "$OBJ_PATH" \
                --method "$IFACE.ActivityName" "$id" 2>/dev/null | \
                sed "s/^('//;s/',)$//")
            if echo "$name" | grep -qi "$target"; then
                gdbus call --session --dest "$SERVICE" \
                    --object-path "$OBJ_PATH" \
                    --method "$IFACE.SetCurrentActivity" "$id" >/dev/null
                echo "switched to: $name ($id)"
                exit 0
            fi
        done <<< "$ids"

        echo "ERROR: no activity matching '$target'" >&2
        exit 1
        ;;
    create)
        name="${2:?usage: gui_activities create <name>}"
        id=$(gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.AddActivity" "$name" 2>/dev/null | \
            sed "s/^('//;s/',)$//")
        echo "created: $id ($name)"
        ;;
    remove)
        target="${2:?usage: gui_activities remove <name_or_id>}"

        # Try as ID directly
        gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.RemoveActivity" "$target" 2>/dev/null && {
            echo "removed: $target"
            exit 0
        }

        # Search by name
        ids=$(gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.ListActivities" 2>/dev/null | \
            sed "s/^(\[//;s/\],)$//;s/'//g;s/, /\n/g")

        while IFS= read -r id; do
            [ -z "$id" ] && continue
            name=$(gdbus call --session --dest "$SERVICE" \
                --object-path "$OBJ_PATH" \
                --method "$IFACE.ActivityName" "$id" 2>/dev/null | \
                sed "s/^('//;s/',)$//")
            if echo "$name" | grep -qi "$target"; then
                gdbus call --session --dest "$SERVICE" \
                    --object-path "$OBJ_PATH" \
                    --method "$IFACE.RemoveActivity" "$id" >/dev/null
                echo "removed: $name ($id)"
                exit 0
            fi
        done <<< "$ids"

        echo "ERROR: no activity matching '$target'" >&2
        exit 1
        ;;
    *)
        echo "usage: gui_activities <list|current|switch|create|remove> [name_or_id]" >&2
        exit 1
        ;;
esac
