#!/usr/bin/env bash
# start_live.sh — Lv2 ライブ議論参加システム 統合起動スクリプト
#
# 使い方:
#   ./start_live.sh              # 自動判定（HOLLYLAND検出→hollyland、なければbuiltin）
#   ./start_live.sh hollyland    # HOLLYLANDピンマイク2ch話者分離あり
#   ./start_live.sh builtin      # MacBook内蔵マイク1ch・話者分離なし
#   ./start_live.sh auto         # 上記自動判定と同じ

set -euo pipefail

# ================ パス定義 ================
LIVE_DIR="$(cd "$(dirname "$0")" && pwd)"
DASHBOARD_DIR="/Users/rk/Library/CloudStorage/GoogleDrive-ritsuha1021@gmail.com/マイドライブ/起業フォルダー/dashboard"
LOOP_PROMPT="$LIVE_DIR/loop_prompt.md"
PID_FILE="$LIVE_DIR/.live.pid"
LOG_FILE="$LIVE_DIR/.live.log"

# ================ モード ================
MODE="${1:-auto}"

# ================ ユーティリティ ================
ok()   { echo "✅ $*"; }
err()  { echo "❌ $*" >&2; }
info() { echo "ℹ️  $*"; }

# ================ 1. 環境チェック ================

# whisper-cli or whisper-cpp
WHISPER_BIN=""
if command -v whisper-cli >/dev/null 2>&1; then
  WHISPER_BIN="whisper-cli"
elif command -v whisper-cpp >/dev/null 2>&1; then
  WHISPER_BIN="whisper-cpp"
else
  err "whisper-cli / whisper-cpp が見つからない。"
  echo "   → brew install whisper-cpp"
  exit 1
fi

# ffmpeg
if ! command -v ffmpeg >/dev/null 2>&1; then
  err "ffmpeg が見つからない。"
  echo "   → brew install ffmpeg"
  exit 1
fi

# whisperモデル探索（medium→small→base→tiny の順）
MODEL_PATH=""
MODEL_NAME=""
for model_try in medium small base tiny; do
  for cand in \
    "$HOME/.cache/whisper/ggml-${model_try}.bin" \
    "$(brew --prefix 2>/dev/null)/share/whisper-cpp/ggml-${model_try}.bin" \
    "/opt/homebrew/share/whisper-cpp/ggml-${model_try}.bin" \
    "/usr/local/share/whisper-cpp/ggml-${model_try}.bin" \
    "$LIVE_DIR/models/ggml-${model_try}.bin"
  do
    if [ -f "$cand" ]; then
      MODEL_PATH="$cand"
      MODEL_NAME="$model_try"
      break 2
    fi
  done
done

if [ -z "$MODEL_PATH" ]; then
  err "whisperモデルが見つからない。"
  echo "   → whisper-cpp-download-ggml-model medium"
  exit 1
fi

ok "環境チェック完了（whisper: ${WHISPER_BIN} / model: ${MODEL_NAME}）"

# ================ 2. モード自動判定 ================
DEVICE_INDEX=""
DEVICE_DISPLAY=""

if [ "$MODE" = "auto" ]; then
  DEVICES="$(ffmpeg -f avfoundation -list_devices true -i "" 2>&1 || true)"

  if echo "$DEVICES" | grep -qi "Wireless Microphone"; then
    MODE="hollyland"
    DEVICE_DISPLAY="HOLLYLAND Wireless Microphone"
  else
    MODE="builtin"
    # 内蔵マイクのインデックスを抽出
    # 例: [AVFoundation indev @ ...] [0] MacBook Air Microphone
    BUILTIN_LINE="$(echo "$DEVICES" | grep -iE "\] MacBook" | head -1)"
    DEVICE_INDEX="$(echo "$BUILTIN_LINE" | grep -oE '\[[0-9]+\]' | head -1 | tr -d '[]')"
    if [ -z "$DEVICE_INDEX" ]; then
      DEVICE_INDEX="0"  # fallback
    fi
    DEVICE_DISPLAY="MacBook内蔵マイク [index: $DEVICE_INDEX]"
  fi

elif [ "$MODE" = "builtin" ]; then
  DEVICES="$(ffmpeg -f avfoundation -list_devices true -i "" 2>&1 || true)"
  BUILTIN_LINE="$(echo "$DEVICES" | grep -iE "\] MacBook" | head -1)"
  DEVICE_INDEX="$(echo "$BUILTIN_LINE" | grep -oE '\[[0-9]+\]' | head -1 | tr -d '[]')"
  if [ -z "$DEVICE_INDEX" ]; then
    DEVICE_INDEX="0"
  fi
  DEVICE_DISPLAY="MacBook内蔵マイク [index: $DEVICE_INDEX]"

elif [ "$MODE" = "hollyland" ]; then
  DEVICE_DISPLAY="HOLLYLAND Wireless Microphone"
fi

ok "モード: ${MODE}（${DEVICE_DISPLAY}）"

# ================ 3. dashboard 起動 ================
DASH_PID_FILE="$DASHBOARD_DIR/.server.pid"
DASH_STARTED=false

if [ -f "$DASH_PID_FILE" ]; then
  DASH_PID="$(cat "$DASH_PID_FILE" 2>/dev/null || true)"
  if [ -n "$DASH_PID" ] && kill -0 "$DASH_PID" 2>/dev/null; then
    info "dashboard 既起動済み（PID ${DASH_PID}）スキップ"
  else
    DASH_STARTED=true
  fi
else
  DASH_STARTED=true
fi

if [ "$DASH_STARTED" = true ]; then
  if [ -f "$DASHBOARD_DIR/start.sh" ]; then
    (cd "$DASHBOARD_DIR" && bash ./start.sh >/dev/null 2>&1) &
    DASH_BG_PID=$!
    sleep 2
    if kill -0 "$DASH_BG_PID" 2>/dev/null || [ -f "$DASH_PID_FILE" ]; then
      ok "dashboard 起動完了"
    else
      echo "⚠️  dashboard 起動失敗（transcribeは継続）"
    fi
  else
    echo "⚠️  $DASHBOARD_DIR/start.sh が見つからない（transcribeは継続）"
  fi
fi

# ================ 4. transcribe.sh 起動 ================
cd "$LIVE_DIR"

if [ "$MODE" = "hollyland" ]; then
  MODEL="${MODEL_NAME}" \
    bash ./transcribe.sh >"$LOG_FILE" 2>&1 &
  TRANSCRIBE_PID=$!
else
  # builtin: デバイスインデックス・左右同じ話者ラベルで起動
  MODEL="${MODEL_NAME}" \
  DEVICE_NAME=":${DEVICE_INDEX}" \
  CHUNK_SEC=20 \
  LEFT_NAME="話者" \
  RIGHT_NAME="話者" \
    bash ./transcribe.sh >"$LOG_FILE" 2>&1 &
  TRANSCRIBE_PID=$!
fi

# 起動確認（2秒待って生存チェック）
sleep 2
if ! kill -0 "$TRANSCRIBE_PID" 2>/dev/null; then
  err "transcribe.sh 起動失敗"
  echo "--- ログ末尾 ---"
  tail -n 20 "$LOG_FILE" 2>/dev/null || true
  exit 1
fi

echo "$TRANSCRIBE_PID" > "$PID_FILE"
ok "文字起こし開始（PID ${TRANSCRIBE_PID} / log: ${LOG_FILE}）"

# ================ 5. Jarvis参加方法案内 ================
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ ライブ参加システム起動完了"
echo ""
echo "📺 dashboard: http://localhost:8765"
echo "🎙️ 文字起こし PID: ${TRANSCRIBE_PID}（log: .live.log）"
echo ""
echo "🚫 /loop 経路は禁止（2026-05-04 2連続PCクラッシュ事故により確定）"
echo "   詳細: memory/feedback_no_loop.md / feedback_loop_outside_claude_code.md"
echo ""
echo "🤖 Jarvis参加方法（暫定・実装方針確定までの代替）:"
echo "    A. 手動オンデマンド ── 喋り終わってから別Claude Codeに transcript.md を読ませる"
echo "    B. 会議後一括レビュー ── transcribe.sh で記録だけ取り、終了後にJarvisが意見"
echo "    C. 外部Pythonデーモン化（本命・実装待ち） ── jarvis_daemon.py + Anthropic API直叩き"
echo ""
echo "停止方法: ./stop_live.sh"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
