#!/usr/bin/env bash
# 安裝 screen agent 為 systemd user service（Linux），登入圖形桌面後自動啟動。
# 用法：install_agent_service.sh             安裝
#       install_agent_service.sh --check     只檢查系統是否符合需求，不改任何東西
#       install_agent_service.sh --uninstall
# agent 只連插在這台電腦上的 dongle：每次連線前用 USB 問它現在的位址（dongle 可能在不同電腦之間拔插，不寫死名稱或 IP）
#       install_agent_service.sh --uninstall
#
# 不需要 sudo，而且不要用 sudo 執行：這是「使用者」服務，只寫 ~ 底下（~/.local/share、~/.config），
# 必須跑在你登入的桌面工作階段裡才抓得到螢幕。缺的系統套件（python3-venv、gst-launch-1.0…）要先由管理員裝好，本腳本只會告訴你缺什麼。
#
# 所需檔案放在本腳本旁邊（repo 的 host/，或從網頁下載的 screen_agent.py、requirements.txt），安裝時複製到 ~/.local/share/geek-kvm-agent，
# 所以裝好之後下載資料夾可以刪掉。
#
# unit 名稱依 XDG 慣例 app-<應用程式ID>@….service，xdg-desktop-portal 才能認出 agent
# 是哪個應用程式（搭配 .desktop 檔），遠端桌面授權才記得住，不必每次重按允許。
set -euo pipefail
SRC=$(cd "$(dirname "$0")" && pwd)

APP_ID=io.github.geekkvm.Agent
UNIT="app-${APP_ID}@.service"
INSTANCE="app-${APP_ID}@default.service"
UNIT_DIR=~/.config/systemd/user
DESKTOP=~/.local/share/applications/${APP_ID}.desktop
DEST=~/.local/share/geek-kvm-agent
MIN_PY="3 9"

CHECK_ONLY=0
case "${1:-}" in
    --uninstall)
        systemctl --user disable --now "$INSTANCE" 2>/dev/null || true
        rm -rf "$UNIT_DIR/$UNIT" "$DESKTOP" "$DEST"
        systemctl --user daemon-reload 2>/dev/null || true
        echo "已移除（~/.config/esp32s3geek_kvm 的 token 與 agent.env 保留）"
        exit 0 ;;
    --check) CHECK_ONLY=1; shift ;;
esac
[ $# -eq 0 ] || { echo "用法：$0 [--check|--uninstall]" >&2; exit 2; }

# ---- 安裝前檢查：全部做完再決定要不要繼續，沒通過就不動系統 ----
errors=0
ok()   { echo "  [ok]   $*"; }
warn() { echo "  [警告] $*"; }
bad()  { echo "  [缺少] $*" >&2; errors=$((errors + 1)); }

echo "檢查系統…"
[ "$(uname -s)" = Linux ] && ok "Linux" || bad "本腳本只支援 Linux（Windows／macOS 請直接執行 screen_agent.py）"
[ "$(id -u)" -ne 0 ] && ok "以一般使用者執行（不需要 sudo）" || bad "請不要用 root／sudo 執行：服務要裝在你自己的桌面工作階段"

PYBIN=$(command -v python3 || true)
if [ -z "$PYBIN" ]; then
    bad "找不到 python3"
elif ! "$PYBIN" -c "import sys; sys.exit(sys.version_info < ($(echo $MIN_PY | tr ' ' ',')))"; then
    bad "python3 太舊（$("$PYBIN" -V 2>&1)），需要 ${MIN_PY// /.} 以上"
else
    ok "$("$PYBIN" -V 2>&1)"
    "$PYBIN" -c "import venv, ensurepip" 2>/dev/null && ok "python3 venv／ensurepip" \
        || bad "python3 沒有 venv 模組（Debian／Ubuntu：sudo apt install python3-venv）"
fi

if ! command -v systemctl >/dev/null; then
    bad "找不到 systemctl（這個腳本需要 systemd）"
elif systemctl --user show-environment >/dev/null 2>&1; then
    ok "systemd 使用者工作階段"
else
    bad "連不上 systemd --user（請在登入桌面後的終端機執行，不要用 ssh 或 sudo）"
fi

[ -r "$SRC/screen_agent.py" ] && ok "screen_agent.py" || bad "$SRC 裡沒有 screen_agent.py"
[ -r "$SRC/requirements.txt" ] && ok "requirements.txt" || bad "$SRC 裡沒有 requirements.txt"

case "${XDG_SESSION_TYPE:-}" in
    wayland)
        ok "Wayland 桌面（用 xdg-desktop-portal 擷取，第一次會跳出「分享螢幕」對話框，按允許）"
        command -v gst-launch-1.0 >/dev/null || warn "找不到 gst-launch-1.0，Wayland 擷取會失敗（Debian／Ubuntu：sudo apt install gstreamer1.0-tools gstreamer1.0-pipewire）"
        command -v pipewire >/dev/null || warn "找不到 pipewire（Wayland 擷取需要）" ;;
    x11) ok "X11 桌面" ;;
    *)   warn "看不出是 Wayland 或 X11（XDG_SESSION_TYPE 是空的）；請在桌面的終端機執行" ;;
esac

ok "agent 用 USB 向插在這台電腦上的 dongle 查詢位址（需要 pyserial，相依套件會裝）；dongle 要接上 USB"
if command -v curl >/dev/null; then
    curl -fsS -m 5 -o /dev/null https://pypi.org/simple/ 2>/dev/null && ok "連得到 PyPI（要下載相依套件）" \
        || warn "連不到 pypi.org，安裝相依套件可能失敗"
fi
FREE_MB=$(df -Pm ~ 2>/dev/null | awk 'NR==2 {print $4}')
[ "${FREE_MB:-9999}" -ge 600 ] && ok "家目錄剩 ${FREE_MB:-?} MB" || bad "家目錄剩 ${FREE_MB} MB，至少需要約 600 MB（相依套件，含 WebRTC 的 aiortc）"

if [ "$errors" -gt 0 ]; then
    echo "有 $errors 項需求不符，尚未安裝任何東西。補齊後再執行一次。" >&2
    exit 1
fi
[ "$CHECK_ONLY" -eq 1 ] && { echo "系統符合需求。"; exit 0; }

# ---- 安裝 ----
mkdir -p "$DEST" "$UNIT_DIR" "$(dirname "$DESKTOP")"
install -m 644 "$SRC/screen_agent.py" "$SRC/requirements.txt" "$DEST/"
[ -x "$DEST/.venv/bin/python" ] || "$PYBIN" -m venv "$DEST/.venv"
echo "安裝相依套件（第一次需要一點時間）…"
"$DEST/.venv/bin/pip" install --quiet --disable-pip-version-check -r "$DEST/requirements.txt"
PY="$DEST/.venv/bin/python"

cat > "$DESKTOP" <<EOF
[Desktop Entry]
Type=Application
Name=Geek KVM screen agent
Exec=$PY $DEST/screen_agent.py
NoDisplay=true
EOF

cat > "$UNIT_DIR/$UNIT" <<EOF
[Unit]
Description=Geek KVM screen agent
PartOf=graphical-session.target
After=graphical-session.target

[Service]
# 選填：~/.config/esp32s3geek_kvm/agent.env 放 KVM_TURN=turn:host:3478、KVM_TURN_USER=…、KVM_TURN_PASSWORD=…（WebRTC 的 TURN 中繼）
EnvironmentFile=-%h/.config/esp32s3geek_kvm/agent.env
ExecStart=$PY -u $DEST/screen_agent.py
Restart=on-failure
RestartSec=5

[Install]
WantedBy=graphical-session.target
EOF

systemctl --user daemon-reload
systemctl --user enable --now "$INSTANCE"
echo "已安裝並啟動 $INSTANCE（連插在這台電腦上的 dongle）"
echo "查看 log：journalctl --user -u '$INSTANCE' -f"
echo "移除：$0 --uninstall"
