#!/bin/sh
# pico-bridge installer for Linux: Claude chats and limits -> Raspberry Pi Pico over USB.
#   Install:   curl -fsSL https://pico.bralin.kz/install.sh | sh
#   Remove:    curl -fsSL https://pico.bralin.kz/install.sh | sh -s -- --uninstall
# Cowork notifications are Windows-only; Claude Code chats and limits work here.
set -eu

BASE="https://pico.bralin.kz"
DIR="${XDG_DATA_HOME:-$HOME/.local/share}/pico-bridge"
UNIT_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user"
UNIT="$UNIT_DIR/pico-bridge.service"

say() { printf '  %s\n' "$*"; }
step() { printf '\n\033[33m> %s\033[0m\n' "$*"; }
die() { printf '\n\033[31m%s\033[0m\n' "$*" >&2; exit 1; }

fetch() {
    if command -v curl >/dev/null 2>&1; then curl -fsSL "$1" -o "$2"
    elif command -v wget >/dev/null 2>&1; then wget -qO "$2" "$1"
    else die "Нужен curl или wget"; fi
}

if [ "${1:-}" = "--uninstall" ]; then
    step "Удаляю pico-bridge"
    systemctl --user disable --now pico-bridge.service 2>/dev/null || true
    rm -f "$UNIT"
    systemctl --user daemon-reload 2>/dev/null || true
    rm -rf "$DIR"
    say "Готово: сервис и папка $DIR удалены."
    exit 0
fi

printf '\033[33mpico-bridge: чаты и лимиты Claude на экране Raspberry Pi Pico\033[0m\n'

step "Проверяю Python 3.9+"
command -v python3 >/dev/null 2>&1 || die "Нет python3. Debian/Ubuntu: sudo apt install python3 python3-venv"
python3 -c 'import sys; sys.exit(sys.version_info < (3, 9))' || die "Нужен Python 3.9 или новее"
say "$(python3 --version)"

step "Готовлю папку $DIR"
mkdir -p "$DIR"
if [ ! -x "$DIR/venv/bin/python" ]; then
    python3 -m venv "$DIR/venv" 2>/dev/null ||
        die "Не создаётся venv. Debian/Ubuntu: sudo apt install python3-venv"
fi

step "Ставлю pyserial"
"$DIR/venv/bin/python" -m pip install --quiet --disable-pip-version-check --upgrade pyserial ||
    die "pip install не удался (нет интернета?)"

step "Скачиваю демон"
fetch "$BASE/pico_bridge.py" "$DIR/pico_bridge.py"
say "$DIR/pico_bridge.py"

step "Доступ к USB-порту"
PORT_GROUP=""
for dev in /dev/ttyACM*; do
    [ -e "$dev" ] && PORT_GROUP="$(stat -c %G "$dev")" && break
done
if [ -z "$PORT_GROUP" ]; then
    if getent group dialout >/dev/null; then PORT_GROUP=dialout; else PORT_GROUP=uucp; fi
fi
if id -nG | tr ' ' '\n' | grep -qx "$PORT_GROUP"; then
    say "ты уже в группе $PORT_GROUP"
else
    say "Нужна группа $PORT_GROUP, чтобы открывать /dev/ttyACM* (спросит пароль sudo)"
    sudo usermod -aG "$PORT_GROUP" "$USER" && NEED_RELOGIN=1 ||
        say "Не вышло. Сделай сам: sudo usermod -aG $PORT_GROUP $USER"
fi

step "Проверяю Claude Code"
if command -v claude >/dev/null 2>&1 || [ -x "$HOME/.local/bin/claude" ]; then
    say "CLI найден"
else
    say "CLI claude не найден: лимиты работать не будут. Установка: https://claude.com/claude-code"
fi
[ -f "$HOME/.claude/.credentials.json" ] ||
    say "Нет входа в CLI: запусти 'claude' и введи /login (подписка Claude), иначе лимитов не будет."

step "Включаю автозапуск (systemd --user)"
command -v systemctl >/dev/null 2>&1 || die "Нет systemd. Запускай вручную: $DIR/venv/bin/python $DIR/pico_bridge.py"
mkdir -p "$UNIT_DIR"
cat > "$UNIT" <<EOF
[Unit]
Description=pico-bridge: Claude chats and limits -> Raspberry Pi Pico ($BASE)

[Service]
ExecStart=$DIR/venv/bin/python $DIR/pico_bridge.py
Restart=always
RestartSec=60

[Install]
WantedBy=default.target
EOF
systemctl --user daemon-reload
systemctl --user enable pico-bridge.service >/dev/null 2>&1
systemctl --user restart pico-bridge.service

step "Что видит демон"
"$DIR/venv/bin/python" "$DIR/pico_bridge.py" --list || true

printf '\n\033[32mГотово. Демон работает и будет стартовать сам.\033[0m\n'
if [ "${NEED_RELOGIN:-}" = 1 ]; then
    say "Важно: выйди из системы и зайди снова, чтобы заработала группа $PORT_GROUP."
fi
say "Лог:      $DIR/state/bridge.log   (или journalctl --user -u pico-bridge)"
say "Статус:   systemctl --user status pico-bridge"
say "Удалить:  curl -fsSL $BASE/install.sh | sh -s -- --uninstall"
