#!/bin/bash
# Автозапуск staging Dolphin Manager на macOS через launchd.
# Отличия от prod install_autostart.command:
#   - целевая папка:      ~/dolphin-manager-staging/
#   - порт:               8766 (prod — 8765, не конфликтует)
#   - launchd label:      com.chig1r.dolphin-manager-staging
#   - plist файл:         ~/Library/LaunchAgents/com.chig1r.dolphin-manager-staging.plist
#   - agent.url в config: https://staging.kabanwork.82-221-101-9.sslip.io
#   - DM_STAGING=1:       guard блокирует реальный Dolphin API (защита от случайного api_token)
# Если на машине уже стоит prod локалка — обе работают параллельно (разные порты/папки/plist).
set -e
cd "$(dirname "$0")"
SRC="$(pwd)"
LABEL="com.chig1r.dolphin-manager-staging"
PLIST="$HOME/Library/LaunchAgents/$LABEL.plist"
TARGET="$HOME/dolphin-manager-staging"
PORT=8766

PY=""
for cand in \
  /Library/Frameworks/Python.framework/Versions/Current/bin/python3 \
  /Library/Frameworks/Python.framework/Versions/3.14/bin/python3 \
  /Library/Frameworks/Python.framework/Versions/3.13/bin/python3 \
  /Library/Frameworks/Python.framework/Versions/3.12/bin/python3 \
  /Library/Frameworks/Python.framework/Versions/3.11/bin/python3 \
  /opt/homebrew/bin/python3 \
  /usr/local/bin/python3
do
  if [ -x "$cand" ]; then
    if "$cand" -c 'import sys; sys.exit(0 if sys.version_info >= (3,9) else 1)' 2>/dev/null; then
      PY="$cand"; break
    fi
  fi
done
if [ -z "$PY" ]; then
  echo ""
  echo "✗ Python 3.9+ не найден."
  echo "  Поставь: https://www.python.org/downloads/macos/ → двойной клик по .pkg → повтори one-liner."
  echo ""
  exit 1
fi
echo "→ использую Python: $PY"

needs_migration=0
case "$SRC" in
  "$HOME/Desktop"/*|"$HOME/Documents"/*|"$HOME/Downloads"/*|"$HOME/Library/Mobile Documents"/*|/Volumes/*|/tmp/*|/private/tmp/*)
    needs_migration=1 ;;
esac
has_provenance=0
if [ -f "$SRC/app.py" ] && xattr "$SRC/app.py" 2>/dev/null | grep -q com.apple.provenance; then
  has_provenance=1
fi

if [ "$needs_migration" = "1" ] || [ "$has_provenance" = "1" ]; then
  echo "→ копирую рабочие файлы в $TARGET/ (чистое место)…"
  mkdir -p "$TARGET"
  for item in app.py dm requirements.txt start.command restart.command keepawake.command \
              start.bat install_autostart.bat install_autostart_staging.command install_autostart_staging.bat \
              uninstall_autostart.command uninstall_autostart_staging.command \
              diag_staging.command recover_staging.command \
              web README.md; do
    if [ -e "$SRC/$item" ]; then
      rm -rf "$TARGET/$item" 2>/dev/null || true
      cp -R "$SRC/$item" "$TARGET/" 2>/dev/null || true
    fi
  done
  find "$TARGET" -maxdepth 3 \( -name "*.py" -o -name "*.command" -o -name "*.sh" \) -exec xattr -d com.apple.provenance {} \; 2>/dev/null || true
  DIR="$TARGET"
else
  DIR="$SRC"
fi

mkdir -p "$HOME/Library/LaunchAgents" "$DIR/logs"

# первичный staging-config: пустой api_token Dolphin + staging agent url.
# api_key пользователь впишет сам через http://127.0.0.1:8766/ → Настройки → «Агент kabanwork» → Ключ.
if [ ! -f "$DIR/config.json" ]; then
  cat > "$DIR/config.json" <<CFG
{
  "api_token": "",
  "local_base": "http://localhost:3001/v1.0",
  "cloud_base": "https://dolphin-anty-api.com",
  "source": "auto",
  "proxy": {"type": "none", "host": "", "port": "", "user": "", "pass": ""},
  "ext": {"id": "lhdmopcibgkjkcjhinfpnlkdpcjgfkkm", "name_match": "[STAGING]"},
  "agent": {
    "url": "https://staging.kabanwork.82-221-101-9.sslip.io",
    "key": "",
    "enabled": true
  },
  "ui": {"port": $PORT, "open_browser": false}
}
CFG
  echo "→ создан пустой config.json (впиши api_key в http://127.0.0.1:$PORT/ после запуска)"
fi

"$PY" -m pip install --user -q -r "$DIR/requirements.txt" >/dev/null 2>&1 || true

cat > "$PLIST" <<PLIST
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>Label</key><string>$LABEL</string>
  <key>ProgramArguments</key><array>
    <string>$PY</string><string>$DIR/app.py</string><string>--no-browser</string><string>--port</string><string>$PORT</string>
  </array>
  <key>WorkingDirectory</key><string>$DIR</string>
  <key>EnvironmentVariables</key><dict>
    <key>PATH</key><string>/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    <key>LANG</key><string>en_US.UTF-8</string>
    <key>HOME</key><string>$HOME</string>
    <key>DM_STAGING</key><string>1</string>
    <key>DM_EXT_ID_DEFAULT</key><string>lhdmopcibgkjkcjhinfpnlkdpcjgfkkm</string>
  </dict>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict>
  <key>ThrottleInterval</key><integer>10</integer>
  <key>StandardOutPath</key><string>$DIR/logs/manager.log</string>
  <key>StandardErrorPath</key><string>$DIR/logs/manager.err.log</string>
</dict></plist>
PLIST

launchctl bootout gui/$(id -u)/$LABEL 2>/dev/null || true
launchctl unload "$PLIST" 2>/dev/null || true
OLD="$(lsof -ti tcp:$PORT -sTCP:LISTEN 2>/dev/null || true)"
if [ -n "$OLD" ]; then
  echo "→ останавливаю запущенную копию на $PORT (pid $OLD)"
  kill $OLD 2>/dev/null || true
  sleep 1
fi
launchctl bootstrap gui/$(id -u) "$PLIST" 2>&1 || launchctl load -w "$PLIST"
launchctl kickstart -k gui/$(id -u)/$LABEL 2>/dev/null || true

sleep 3
if curl -s -m 3 http://127.0.0.1:$PORT/api/ping | grep -q dolphin-manager; then
  V=$(curl -s -m 2 http://127.0.0.1:$PORT/api/ping | python3 -c 'import json,sys;print(json.load(sys.stdin).get("version","?"))' 2>/dev/null || echo "?")
  echo ""
  echo "✓ staging Dolphin Manager v$V запущен через launchd:"
  echo "  папка:  $DIR"
  echo "  логи:   $DIR/logs/manager.log"
  echo "  порт:   $PORT"
  echo "  URL:    http://127.0.0.1:$PORT"
  echo ""
  echo "Следующий шаг:"
  echo "  1. Открой http://127.0.0.1:$PORT в браузере."
  echo "  2. Настройки → карточка «Агент kabanwork» → поле «Ключ» → вставь свой api_key."
  echo "     Взять: https://staging.kabanwork.82-221-101-9.sslip.io → Настройки → «Мой ключ»."
  echo "  3. Через ≤5 сек: на сайте в шапке «Локалка: ✓» зелёным."
  echo ""
  echo "Prod-локалка (если установлена) продолжает работать на 8765 — не конфликтует."
else
  echo ""
  echo "✗ staging локалка не ответила на http://127.0.0.1:$PORT/api/ping"
  echo "  смотри: $DIR/logs/manager.err.log"
  exit 1
fi
