#!/bin/bash
#
# Установка VION Agent на macOS одной командой:
#
#   curl -fsSL https://api.vionllm.tech/macos/install.sh | bash
#
# Скрипт скачивает сборку, СВЕРЯЕТ ЕЁ КОНТРОЛЬНУЮ СУММУ, ставит в «Программы»,
# снимает карантин и запускает. Сумма зашита здесь, а не читается рядом с
# файлом: подменивший файл подменил бы и соседнюю сумму, а эту строку видно
# в исходнике, который вы скачиваете по https.
#
set -euo pipefail

VERSION="1.1.5"
# Одна сборка на тип процессора, у каждой своя сумма (почему суммы здесь — см. выше).
SHA_ARM64="67efb6cad30469795d57af59b86d68944fb645f3565149a3669e1510cc0f1938"
SIZE_ARM64="155 МБ"
SHA_X64="cfab73e1a9931447a775d830f27a7d4089b5b91e22cab04d1264437bd0d4850d"
SIZE_X64="160 МБ"
APP="VION Agent.app"

green=$'\033[32m'; yellow=$'\033[33m'; red=$'\033[31m'; grey=$'\033[90m'; off=$'\033[0m'
step()  { printf '%s▸%s %s\n' "$green" "$off" "$1"; }
quiet() { printf '%s  %s%s\n' "$grey" "$1" "$off"; }
fail()  { printf '%s✗%s %s\n' "$red" "$off" "$1" >&2; exit 1; }

# ── Проверки до того, как что-то скачано ─────────────────────────────────────

[ "$(uname -s)" = "Darwin" ] || fail "Это установщик для macOS."

# macOS 12 — нижняя граница самого приложения (Electron): на 11 оно не откроется,
# и лучше сказать это до скачивания 160 МБ, чем после.
MACOS="$(sw_vers -productVersion 2>/dev/null || echo 0)"
if [ "${MACOS%%.*}" -lt 12 ] 2>/dev/null; then
  fail "VION Agent работает на macOS 12 и новее, а у вас macOS $MACOS."
fi

# Процессор, а не оболочка: Терминал, открытый через Rosetta на Mac с M-чипом,
# отвечает на uname «x86_64», и человек получил бы сборку для Intel, которая
# работала бы у него медленнее. hw.optional.arm64 говорит о самом железе.
if [ "$(sysctl -n hw.optional.arm64 2>/dev/null || echo 0)" = "1" ]; then
  ARCH="arm64"; SHA="$SHA_ARM64"; SIZE="$SIZE_ARM64"; KIND="Apple Silicon"
else
  ARCH="x64"; SHA="$SHA_X64"; SIZE="$SIZE_X64"; KIND="Intel"
fi
FILE="VION-Agent-${VERSION}-mac-${ARCH}.dmg"
URL="https://api.vionllm.tech/macos/alpha/${FILE}"

# ── Скачивание ───────────────────────────────────────────────────────────────

TMP="$(mktemp -d "${TMPDIR:-/tmp}/vion-agent.XXXXXX")"
# Убрать за собой в любом случае: и при ошибке, и при Ctrl-C.
trap 'hdiutil detach "$TMP/mnt" >/dev/null 2>&1 || true; rm -rf "$TMP"' EXIT

step "Скачиваю VION Agent ${VERSION} для Mac на ${KIND} (${SIZE})"
curl -fL --progress-bar -o "$TMP/$FILE" "$URL" \
  || fail "Не удалось скачать. Проверьте интернет и доступ к api.vionllm.tech."

step "Проверяю контрольную сумму"
GOT="$(shasum -a 256 "$TMP/$FILE" | awk '{print $1}')"
if [ "$GOT" != "$SHA" ]; then
  fail "Контрольная сумма не совпала — файл скачан не полностью или подменён.
  ожидалась: $SHA
  получена:  $GOT
  Повторите установку; если повторится — напишите в поддержку."
fi
quiet "совпала"

# ── Установка ────────────────────────────────────────────────────────────────

# В /Applications, если туда можно писать, иначе в домашние «Программы»:
# просить пароль ради установки приложения незачем.
if [ -w /Applications ]; then
  DEST="/Applications"
else
  DEST="$HOME/Applications"
  mkdir -p "$DEST"
  quiet "нет прав на /Applications — ставлю в $DEST"
fi

if pgrep -f "$APP/Contents/MacOS" >/dev/null 2>&1; then
  step "Закрываю запущенную копию"
  osascript -e 'tell application "VION Agent" to quit' >/dev/null 2>&1 || true
  # Дать окну закрыться самому, прежде чем настаивать.
  for _ in 1 2 3 4 5 6 7 8 9 10; do
    pgrep -f "$APP/Contents/MacOS" >/dev/null 2>&1 || break
    sleep 1
  done
  pkill -f "$APP/Contents/MacOS" >/dev/null 2>&1 || true
fi

step "Устанавливаю в ${DEST}"
mkdir -p "$TMP/mnt"
hdiutil attach -nobrowse -readonly -mountpoint "$TMP/mnt" "$TMP/$FILE" >/dev/null \
  || fail "Не удалось открыть образ."

rm -rf "${DEST:?}/$APP"
cp -R "$TMP/mnt/$APP" "$DEST/" || fail "Не удалось скопировать приложение."
hdiutil detach "$TMP/mnt" >/dev/null 2>&1 || true

# ── То, ради чего обычно приходится лезть в настройки ────────────────────────

step "Снимаю карантин"
xattr -dr com.apple.quarantine "$DEST/$APP" 2>/dev/null || true

# Сборка подписана нашим сертификатом, а не Apple. Если строгая проверка
# подписи не проходит, macOS показывает «программа повреждена» — ad-hoc подпись
# это чинит, и лучше сделать это здесь, чем оставить человеку.
if ! codesign --verify --deep --strict "$DEST/$APP" >/dev/null 2>&1; then
  step "Заверяю подпись локально"
  codesign --force --deep --sign - "$DEST/$APP" >/dev/null 2>&1 \
    || printf '%s!%s подпись заверить не удалось; если macOS скажет «повреждено», выполните:\n  codesign --force --deep --sign - "%s/%s"\n' "$yellow" "$off" "$DEST" "$APP"
fi

INSTALLED="$(defaults read "$DEST/$APP/Contents/Info.plist" CFBundleShortVersionString 2>/dev/null || echo "$VERSION")"

step "Запускаю"
open "$DEST/$APP"

printf '\n%s✓%s VION Agent %s установлен: %s/%s\n' "$green" "$off" "$INSTALLED" "$DEST" "$APP"
printf '%s  Первый запуск дольше обычного: приложение разворачивает рабочую часть,\n  это несколько минут и требует интернета.%s\n' "$grey" "$off"
