#!/bin/sh
# Collaplex 音效 —— 主命令(日常三个动作)
#
#   collaplex-audio start   启动: 接管系统音频(全局输出走这条链)
#   collaplex-audio stop    停止: 恢复系统默认输出, 同时关掉面板
#   collaplex-audio web     面板: 起控制面板并打开浏览器
#
# 装好不会自动接管 —— 得手动 start。这样链路出问题时系统仍然能正常出声。
set -eu

ROOT="$(cd "$(dirname "$0")/.." && pwd)"
[ -d "$ROOT/dsp" ] || ROOT=/usr/share/collaplex-audio

PY="${PY:-$ROOT/.venv/bin/python}"
[ -x "$PY" ] || PY=/usr/bin/python3

WEB_PORT="${WEB_PORT:-8789}"
CONF_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/pipewire/pipewire.conf.d"

# 按命令行精确点名(不用 pkill -f, 免得误伤名字相近的东西)
pids() {
    for p in /proc/[0-9]*; do
        [ -r "$p/cmdline" ] || continue
        c=$(tr '\0' ' ' < "$p/cmdline" 2>/dev/null) || continue
        case "$c" in *"$1"*) printf '%s ' "${p#/proc/}";; esac
    done
}

case "${1:-}" in
start)
    echo "[Collaplex 音效] 启动链路..."
    bash "$ROOT/脚本/安装.sh"
    echo
    echo "面板: collaplex-audio web"
    ;;

stop)
    echo "[Collaplex 音效] 停止链路..."
    rm -f "$CONF_DIR/10-collaplex-vsink.conf" "$CONF_DIR/20-collaplex-hrtf.conf" \
          "$CONF_DIR/30-collaplex-eq.conf" "$CONF_DIR/91-clock.conf"
    for pid in $(pids "$ROOT/dsp/"); do kill "$pid" 2>/dev/null || true; done
    # 面板按相对路径起过(如 .venv/bin/python web/server.py), 只匹配绝对路径会漏, 用后段匹配
    for pid in $(pids "web/server.py"); do kill "$pid" 2>/dev/null || true; done
    rm -f /dev/shm/collaplex-eq /dev/shm/collaplex-loudness
    rm -f /dev/shm/collaplex-eq.lock /dev/shm/collaplex-loudness.lock
    systemctl --user restart pipewire pipewire-pulse wireplumber
    sleep 1
    echo "已停止。默认输出: $(wpctl inspect @DEFAULT_SINK@ 2>/dev/null | sed -n 's/.*node.description = //p' | head -1)"
    ;;

web)
    if [ -n "$(pids "$ROOT/web/server.py")" ]; then
        echo "面板已在运行: http://127.0.0.1:$WEB_PORT"
    else
        setsid "$PY" "$ROOT/web/server.py" "$WEB_PORT" >/dev/null 2>&1 &
        sleep 1
        echo "面板已启动: http://127.0.0.1:$WEB_PORT"
    fi
    xdg-open "http://127.0.0.1:$WEB_PORT" >/dev/null 2>&1 || true
    ;;

*)
    cat <<'EOF'
用法: collaplex-audio <命令>

  start   启动链路(接管系统音频)
  stop    停止链路(恢复系统默认输出)
  web     启动控制面板并打开浏览器
EOF
    exit 1
    ;;
esac
