#!/usr/bin/env bash
# FastAI runner installer.
#
# Использование (одной командой на удалённом сервере / своём Mac):
#   curl -fsSL https://fst-runner.fstai.xyz/install.sh | \
#     FASTAI_URL=https://app.fst.ac \
#     FASTAI_RUNNER_TOKEN=<твой_токен> \
#     bash
#
# Запускает runner в foreground. По умолчанию ставит в ~/fastai-runner.
# Опции:
#   FASTAI_DIR=~/fastai-runner   куда положить runner.py + venv
#   FASTAI_PYTHON=python3        интерпретатор для venv (нужен 3.11+)
#   INSTALL_URL=https://fst-runner.fstai.xyz   откуда качать файлы runner'а
#   SYSTEMD=1                    создать и запустить systemd-юнит fastai-runner
#                                (требует sudo, ставит в /opt/fastai-runner)

set -euo pipefail

err() { echo "[install] ERROR: $*" >&2; exit 1; }
log() { echo "[install] $*"; }

[ -n "${FASTAI_URL:-}" ]          || err "не задана FASTAI_URL (например https://app.fst.ac)"
[ -n "${FASTAI_RUNNER_TOKEN:-}" ] || err "не задан FASTAI_RUNNER_TOKEN (получите его в UI: Настройки → Runners)"

INSTALL_URL="${INSTALL_URL:-https://fst-runner.fstai.xyz}"
FASTAI_PYTHON="${FASTAI_PYTHON:-python3}"
SYSTEMD="${SYSTEMD:-0}"

if [ "$SYSTEMD" = "1" ]; then
  FASTAI_DIR="${FASTAI_DIR:-/opt/fastai-runner}"
else
  FASTAI_DIR="${FASTAI_DIR:-$HOME/fastai-runner}"
fi

command -v "$FASTAI_PYTHON" >/dev/null 2>&1 || err "не найден $FASTAI_PYTHON (поставьте Python 3.11+)"
command -v curl >/dev/null 2>&1 || err "не найден curl"

# Проверка минимальной версии Python — нужно 3.11+ (требование claude-agent-sdk).
"$FASTAI_PYTHON" -c 'import sys; sys.exit(0 if sys.version_info >= (3,11) else 1)' \
  || err "$FASTAI_PYTHON ниже 3.11 (нужно для claude-agent-sdk). Поставьте свежее: на Debian/Ubuntu — sudo apt install python3.11, на macOS — brew install python@3.11"

PY_VER="$("$FASTAI_PYTHON" -c 'import sys;print("%d.%d"%sys.version_info[:2])')"
log "python: $FASTAI_PYTHON ($PY_VER)"

# 1. Подготовка директории.
log "директория: $FASTAI_DIR"
if [ "$SYSTEMD" = "1" ] && [ ! -d "$FASTAI_DIR" ]; then
  sudo mkdir -p "$FASTAI_DIR"
  sudo chown "$USER:$(id -gn)" "$FASTAI_DIR"
else
  mkdir -p "$FASTAI_DIR"
fi
cd "$FASTAI_DIR"

# 2. Скачиваем runner.py, protocol.py и requirements.txt.
#    Защита: curl -f, но landing-HTML отдаётся с 200 на любые отсутствующие пути —
#    поэтому ДОПОЛНИТЕЛЬНО проверяем что файл не пустой и начинается не с '<'.
download() {
  local name="$1"
  log "скачиваю $name с $INSTALL_URL/$name"
  curl -fsSL "$INSTALL_URL/$name" -o "$name.new"
  if [ ! -s "$name.new" ] || head -c 1 "$name.new" | grep -q '^<'; then
    rm -f "$name.new"
    err "не удалось скачать $name (вернулся HTML или пустой файл — проверьте $INSTALL_URL)"
  fi
  mv "$name.new" "$name"
}

download runner.py
download protocol.py
download requirements.txt

# 3. Venv + зависимости.
if [ ! -d venv ]; then
  log "создаю venv"
  "$FASTAI_PYTHON" -m venv venv
fi

# macOS python.org build: системный CA-стор может быть пуст → TLS падает на pip и WS.
# Подставляем certifi.
if [ "$(uname)" = "Darwin" ]; then
  if ! ./venv/bin/python -c 'import ssl; ctx=ssl.create_default_context(); import urllib.request; urllib.request.urlopen("https://pypi.org/simple/", timeout=5)' 2>/dev/null; then
    log "macOS: системный CA не настроен, подставляю certifi"
    ./venv/bin/pip install -q certifi
    CERT_FILE="$(./venv/bin/python -c 'import certifi; print(certifi.where())')"
    export SSL_CERT_FILE="$CERT_FILE"
    export REQUESTS_CA_BUNDLE="$CERT_FILE"
  fi
fi

log "ставлю зависимости из requirements.txt"
./venv/bin/pip install -q --upgrade pip >/dev/null
./venv/bin/pip install -q -r requirements.txt

# 4. Запуск.
if [ "$SYSTEMD" = "1" ]; then
  log "ставлю systemd-юнит fastai-runner"
  UNIT_PATH=/etc/systemd/system/fastai-runner.service
  ENV_PATH=/etc/fastai-runner.env
  RUN_GROUP="$(id -gn)"

  sudo tee "$ENV_PATH" >/dev/null <<EOF
FASTAI_URL=$FASTAI_URL
FASTAI_RUNNER_TOKEN=$FASTAI_RUNNER_TOKEN
EOF
  sudo chown "$USER:$RUN_GROUP" "$ENV_PATH"
  sudo chmod 600 "$ENV_PATH"

  sudo tee "$UNIT_PATH" >/dev/null <<EOF
[Unit]
Description=FastAI remote runner
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=$USER
Group=$RUN_GROUP
WorkingDirectory=$FASTAI_DIR
EnvironmentFile=$ENV_PATH
ExecStart=$FASTAI_DIR/venv/bin/python $FASTAI_DIR/runner.py
Restart=always
RestartSec=5

# Минимальная hardening-гигиена (runner держит твой OAuth-токен).
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=read-only
ReadWritePaths=$FASTAI_DIR
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

  sudo systemctl daemon-reload
  sudo systemctl enable --now fastai-runner
  log "ок! статус:"
  sudo systemctl --no-pager --lines=10 status fastai-runner || true
  log "логи: sudo journalctl -u fastai-runner -f"
  log "при обновлении зависимостей (pip install) — sudo systemctl restart fastai-runner"
else
  log "запускаю в foreground (Ctrl+C — выход)"
  export FASTAI_URL FASTAI_RUNNER_TOKEN
  exec ./venv/bin/python runner.py
fi
