#!/bin/bash
# Koe ノード インストーラ (Apple Silicon Mac / ローカル合成ノード)
# あなたのMacで本人声TTSを合成し、仲間の声生成を手伝う。参照音声はディスクに書かない設計。
#   curl -fsSL https://koe.live/i | KOE_INVITE=xxxx bash
#
# 必要: Apple Silicon・Python3・ffmpeg・招待トークン(KOE_INVITE)
# 初回起動時に音声モデル(約1〜2GB)を自動ダウンロードします(数分)。
set -e

ORCH="${KOE_ORCH:-https://koe.live}"
DIR="$HOME/.koe-node"
PORT="${KOE_WORKER_PORT:-8790}"
OFFICIAL="dd0e3ca6f9544f57"

# --- 前提チェック ---
[ "$(uname -m)" = "arm64" ] || { echo "✗ Apple Silicon (arm64) のMacが必要です。"; exit 1; }
command -v python3 >/dev/null 2>&1 || { echo "✗ python3 が見つかりません。"; exit 1; }
[ -n "${KOE_INVITE:-}" ] || { echo "✗ KOE_INVITE=<招待トークン> が必要です(焚き火で発行)。"; exit 1; }
if ! command -v ffmpeg >/dev/null 2>&1; then
  if command -v brew >/dev/null 2>&1; then echo "→ ffmpeg を brew で導入"; brew install ffmpeg || true
  else echo "⚠ ffmpeg が必要です: https://brew.sh で brew を入れて 'brew install ffmpeg'"; fi
fi

mkdir -p "$DIR"
echo "→ agent / worker を取得"
curl -fsSL "$ORCH/download/koe_node.py"   -o "$DIR/koe_node.py"
curl -fsSL "$ORCH/download/koe_worker.py" -o "$DIR/koe_worker.py"

# agent hash 照合(コードは公開・誰でも監査可。一致は『公開版と同一』の意味。無保存は公式agentの設計)
YOURS=$(shasum -a 256 "$DIR/koe_node.py" | cut -c1-16)
if [ "$YOURS" = "$OFFICIAL" ]; then echo "  ✓ agent は公開版と一致"
else echo "  ⚠ agent hash 不一致($YOURS != $OFFICIAL)。新しい版かも。$DIR/koe_node.py を監査の上で続行を。"; fi

echo "→ Python環境を構築(初回は数分)"
python3 -m venv "$DIR/.venv"
"$DIR/.venv/bin/pip" install -q --upgrade pip >/dev/null
"$DIR/.venv/bin/pip" install -q mlx-audio fastapi uvicorn

# 自機worker用トークン(生成・保存)
TOKEN_FILE="$DIR/token"
[ -f "$TOKEN_FILE" ] || { head -c 24 /dev/urandom | xxd -p | tr -d '\n' > "$TOKEN_FILE"; }
TTS_TOKEN="$(cat "$TOKEN_FILE")"
NAME="${KOE_NODE_NAME:-}"  # 既定は空=公開面はサーバが擬名化(本名/端末名を出さない)。見せたい人は KOE_NODE_NAME=@handle

PY="$DIR/.venv/bin/python"
PLDIR="$HOME/Library/LaunchAgents"; mkdir -p "$PLDIR"

# worker(合成エンジン) LaunchAgent
cat > "$PLDIR/live.koe.worker.plist" <<PL
<?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>live.koe.worker</string>
  <key>ProgramArguments</key><array>
    <string>$PY</string><string>-m</string><string>uvicorn</string>
    <string>koe_worker:app</string><string>--host</string><string>127.0.0.1</string>
    <string>--port</string><string>$PORT</string>
  </array>
  <key>WorkingDirectory</key><string>$DIR</string>
  <key>EnvironmentVariables</key><dict>
    <key>TTS_TOKEN</key><string>$TTS_TOKEN</string>
    <key>PATH</key><string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
  </dict>
  <key>RunAtLoad</key><true/><key>KeepAlive</key><true/><key>ThrottleInterval</key><integer>10</integer>
  <key>StandardOutPath</key><string>$DIR/worker.log</string>
  <key>StandardErrorPath</key><string>$DIR/worker.log</string>
</dict></plist>
PL

# node(ジョブのポーリング/結果返却) LaunchAgent
cat > "$PLDIR/live.koe.node.plist" <<PL
<?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>live.koe.node</string>
  <key>ProgramArguments</key><array>
    <string>$PY</string><string>$DIR/koe_node.py</string>
  </array>
  <key>WorkingDirectory</key><string>$DIR</string>
  <key>EnvironmentVariables</key><dict>
    <key>KOE_ORCH</key><string>$ORCH</string>
    <key>KOE_INVITE</key><string>$KOE_INVITE</string>
    <key>KOE_WORKER</key><string>http://127.0.0.1:$PORT</string>
    <key>TTS_TOKEN</key><string>$TTS_TOKEN</string>
    <key>KOE_NODE_NAME</key><string>$NAME</string>
    <key>PATH</key><string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
  </dict>
  <key>RunAtLoad</key><true/><key>KeepAlive</key><true/><key>ThrottleInterval</key><integer>10</integer>
  <key>StandardOutPath</key><string>$DIR/node.log</string>
  <key>StandardErrorPath</key><string>$DIR/node.log</string>
</dict></plist>
PL

launchctl unload "$PLDIR/live.koe.worker.plist" 2>/dev/null || true
launchctl unload "$PLDIR/live.koe.node.plist" 2>/dev/null || true
launchctl load "$PLDIR/live.koe.worker.plist"
launchctl load "$PLDIR/live.koe.node.plist"

echo
echo "✅ ノードを起動しました(再起動後も自動で立ち上がります)。"
echo "   初回の合成で音声モデル(約1〜2GB)を自動ダウンロードします。"
echo "   稼働状況: $ORCH/nodes/live"
echo "   ログ: $DIR/worker.log / $DIR/node.log"
echo "   停止: launchctl unload ~/Library/LaunchAgents/live.koe.{worker,node}.plist"
