#!/bin/sh
# dsh-pair-access — установщик плагина «Доступ с телефона».
#
#   curl -fsSL https://dsh-mobile.lidogenerator.top/install.sh | sh
#
# Ставит плагин в профиль харнеса, активирует его в уже запущенном процессе
# (живой харнес перечитывает профиль) и печатает одну ссылку для телефона.
# Если харнес не запущен — ссылка появится при следующем запуске.
# Ничего не меняет вне DSH_HOME; повторный запуск = обновление.
set -eu

BASE_URL="https://dsh-mobile.lidogenerator.top"
PACKAGE="dsh-pair-access"
PROFILE="web"
VERSION="latest"
SOURCE=""
DSH_BIN="${DSH_BIN:-}"
CHECK_ONLY=0
FORCE=0
UNINSTALL=0
ACTIVATE=1
WAIT_SECONDS="${WAIT_SECONDS:-40}"

usage() {
  cat <<'TXT'
Установка плагина «Доступ с телефона» для DeepSeek Harness.

Использование:
  install.sh [флаги]

Флаги:
  --profile <имя>     профиль харнеса (по умолчанию web)
  --version <tag>     версия плагина (по умолчанию latest)
  --source <путь|url> поставить из локального tarball/каталога вместо сервера
  --dsh-bin <путь>    путь к dsh, если его нет в PATH
  --no-activate       только установить, профиль не перечитывать
  --check             только проверить окружение, ничего не ставить
  --force             продолжать при предупреждениях
  --uninstall         удалить плагин из профиля
  -h, --help          эта справка
TXT
}

while [ $# -gt 0 ]; do
  case "$1" in
    --profile) PROFILE="${2:?--profile требует значение}"; shift 2 ;;
    --version) VERSION="${2:?--version требует значение}"; shift 2 ;;
    --source) SOURCE="${2:?--source требует значение}"; shift 2 ;;
    --dsh-bin) DSH_BIN="${2:?--dsh-bin требует значение}"; shift 2 ;;
    --no-activate) ACTIVATE=0; shift ;;
    --check) CHECK_ONLY=1; shift ;;
    --force) FORCE=1; shift ;;
    --uninstall) UNINSTALL=1; shift ;;
    -h|--help) usage; exit 0 ;;
    *) echo "неизвестный флаг: $1" >&2; usage >&2; exit 2 ;;
  esac
done

say() { printf '%s\n' "$*"; }
ok() { printf '✓ %s\n' "$*"; }
warn() { printf '⚠ %s\n' "$*"; }
fail() { printf '✗ %s\n' "$*" >&2; exit 1; }

# --- 1. dsh на месте ---------------------------------------------------------
if [ -z "$DSH_BIN" ]; then
  DSH_BIN="$(command -v dsh || true)"
fi
[ -n "$DSH_BIN" ] || fail "не найден dsh. Сначала установите DeepSeek Harness: https://github.com/deepseek-ai/deepseek-harness"

if command -v python3 >/dev/null 2>&1; then
  DSH_BIN="$(python3 -c 'import os,sys;print(os.path.realpath(sys.argv[1]))' "$DSH_BIN")"
fi
[ -x "$DSH_BIN" ] || fail "dsh найден, но не исполняется: $DSH_BIN"

DSH_VERSION="$("$DSH_BIN" --version 2>/dev/null | head -1 || true)"
ok "dsh ${DSH_VERSION:-неизвестной версии} ($DSH_BIN)"

# --- 2. профиль --------------------------------------------------------------
DSH_HOME="${DSH_HOME:-$HOME/.dsh}"
PROFILE_DIR="$DSH_HOME/profiles/$PROFILE"
[ -f "$PROFILE_DIR/package.json" ] || fail "нет профиля «$PROFILE» в $DSH_HOME.
Запустите один раз: dsh --profile $PROFILE --help — и повторите установку."
ok "профиль $PROFILE ($PROFILE_DIR)"
STATE_DIR="$DSH_HOME/dsh-pair-access"
PATCH_FILE="$PROFILE_DIR/cordis.patch.yml"

running_harness() {
  command -v lsof >/dev/null 2>&1 || return 1
  lsof -nP -iTCP -sTCP:LISTEN 2>/dev/null | grep -q "bin.ts web"
}

if [ "$CHECK_ONLY" -eq 1 ]; then
  if running_harness; then ok "харнес запущен: плагин активируется сразу после установки"; else warn "харнес не запущен: ссылка появится при следующем запуске"; fi
  say ""
  say "Проверка окружения завершена."
  exit 0
fi

# --- 3. установка / удаление -------------------------------------------------
if [ "$UNINSTALL" -eq 1 ]; then
  say ""
  say "→ удаляю $PACKAGE из профиля $PROFILE"
  "$DSH_BIN" plugin --profile "$PROFILE" remove "$PACKAGE" || fail "не удалось удалить плагин"
  if [ -f "$PATCH_FILE" ]; then
    printf '\n# dsh-pair-access: uninstall %s\n' "$(date +%s)" >> "$PATCH_FILE"
  fi
  ok "плагин удалён"
  exit 0
fi

if [ -z "$SOURCE" ]; then
  if [ "$VERSION" = "latest" ]; then
    SOURCE="$BASE_URL/dist/$PACKAGE.tgz"
  else
    SOURCE="$BASE_URL/dist/$PACKAGE-$VERSION.tgz"
  fi
fi

say ""
say "→ ставлю $PACKAGE в профиль $PROFILE"
say "  источник: $SOURCE"
"$DSH_BIN" plugin --profile "$PROFILE" add "$SOURCE" >/tmp/dsh-pair-access-install.log 2>&1 || {
  printf '✗ установка не удалась. Лог:\n' >&2
  sed 's/^/  /' /tmp/dsh-pair-access-install.log >&2
  exit 1
}
ok "плагин установлен"

# --- 4. активация в запущенном харнесе ---------------------------------------
# Живой харнес следит за cordis.patch.yml профиля и перечитывает состав плагинов:
# правка файла активирует новую версию без остановки процесса и без флагов.
PANEL_URL=""
if [ "$ACTIVATE" -eq 1 ]; then
  say ""
  say "→ активирую плагин"
  rm -f "$STATE_DIR/panel-url" 2>/dev/null || true
  mkdir -p "$PROFILE_DIR" 2>/dev/null || true
  printf '\n# dsh-pair-access: activate %s\n' "$(date +%s)" >> "$PATCH_FILE"

  waited=0
  while [ "$waited" -lt "$WAIT_SECONDS" ]; do
    if [ -s "$STATE_DIR/panel-url" ]; then
      PANEL_URL="$(head -1 "$STATE_DIR/panel-url")"
      break
    fi
    sleep 1
    waited=$((waited + 1))
  done

  if [ -n "$PANEL_URL" ]; then
    ok "плагин работает"
  elif running_harness; then
    warn "харнес не перечитал профиль за ${WAIT_SECONDS}с."
    say "  Перезапустите харнес — при старте плагин активируется сам."
  else
    warn "харнес не запущен."
    say "  Запустите его — плагин активируется при старте."
  fi
fi

# --- 5. что дальше -----------------------------------------------------------
say ""
if [ -n "$PANEL_URL" ]; then
  say "Телефон: откройте ссылку на ноутбуке и отсканируйте QR приложением DSH Mobile"
  say ""
  say "  $PANEL_URL"
  say ""
  say "Приложение: $BASE_URL/download/dsh-mobile-release.apk"
else
  say "Дальше:"
  say "  1) запустите харнес:  dsh --profile $PROFILE"
  say "  2) откройте ссылку, которую напечатает плагин (она же в $STATE_DIR/panel-url)"
  say "  3) сканируйте QR приложением: $BASE_URL/download/dsh-mobile-release.apk"
fi
say ""
say "Отозвать все устройства: удалите $STATE_DIR/devices.json и перезапустите харнес."
