#!/usr/bin/env bash
#
# ミドルウェア・ランタイム依存の準備スクリプト
#
# npm install 後や依存バージョン更新後に実行して、
# npm パッケージ以外のランタイム依存が揃っていることを確認する。
#
#   ./scripts/prepare.sh
#
set -euo pipefail

PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$PROJECT_DIR"

OK=0
WARN=0
FAIL=0

pass()  { echo "  ✓ $1"; OK=$((OK + 1)); }
warn()  { echo "  △ $1"; WARN=$((WARN + 1)); }
fail()  { echo "  ✗ $1"; FAIL=$((FAIL + 1)); }

echo "=== ランタイム依存チェック ==="
echo ""

# -------------------------------------------------
# 1. Playwright ブラウザバイナリ
# -------------------------------------------------
echo "[1/4] Playwright ブラウザ..."

# playwright が要求する chromium のパスを取得
EXPECTED_PATH=$(node -e "
  try {
    const { chromium } = require('playwright');
    console.log(chromium.executablePath());
  } catch { process.exit(1); }
" 2>/dev/null) || EXPECTED_PATH=""

if [ -n "$EXPECTED_PATH" ] && [ -x "$EXPECTED_PATH" ]; then
  pass "chromium: $EXPECTED_PATH"
else
  echo "  → ブラウザバイナリが見つかりません。インストール中..."
  if npx playwright install chromium 2>&1 | tail -3; then
    pass "chromium インストール完了"
  else
    fail "chromium のインストールに失敗しました。手動で 'npx playwright install chromium' を実行してください"
  fi
fi

# システム共有ライブラリ（libnspr4, libnss3, libatk 等）の確認・インストール
# playwright install-deps は不足ライブラリを apt 等でインストールする（root 権限が必要）
if [ -n "$EXPECTED_PATH" ] && [ -x "$EXPECTED_PATH" ]; then
  # ldd でリンク切れを簡易チェック
  MISSING_LIBS=$(ldd "$EXPECTED_PATH" 2>/dev/null | grep "not found" || true)
  if [ -n "$MISSING_LIBS" ]; then
    echo "  → 共有ライブラリが不足しています。インストール中..."
    echo "$MISSING_LIBS" | head -5 | sed 's/^/      /'
    if npx playwright install-deps chromium 2>&1 | tail -3; then
      pass "システム依存ライブラリ インストール完了"
    else
      warn "システム依存ライブラリのインストールに失敗しました（root 権限が必要です）。手動で 'sudo npx playwright install-deps chromium' を実行してください"
    fi
  else
    pass "システム依存ライブラリ: OK"
  fi
fi

echo ""

# -------------------------------------------------
# 2. noVNC 依存（オプション）
# -------------------------------------------------
echo "[2/4] noVNC 依存（オプション）..."

NOVNC_DEPS=(Xvfb x11vnc websockify)
NOVNC_MISSING=()
for cmd in "${NOVNC_DEPS[@]}"; do
  if command -v "$cmd" >/dev/null 2>&1; then
    pass "$cmd: $(command -v "$cmd")"
  else
    NOVNC_MISSING+=("$cmd")
  fi
done

if [ ${#NOVNC_MISSING[@]} -gt 0 ]; then
  warn "未インストール: ${NOVNC_MISSING[*]} — noVNC CAPTCHA 解決を使う場合は ./scripts/setup-novnc.sh を実行してください"
fi

echo ""

# -------------------------------------------------
# 3. better-sqlite3 ネイティブモジュール
# -------------------------------------------------
echo "[3/4] ネイティブモジュール..."

if node -e "require('better-sqlite3')" 2>/dev/null; then
  pass "better-sqlite3: ロード OK"
else
  fail "better-sqlite3 のロードに失敗しました。'npm rebuild better-sqlite3' を試してください"
fi

echo ""

# -------------------------------------------------
# 4. 日本語フォント（AnnotateImage のテキスト描画用）
# -------------------------------------------------
echo "[4/4] 日本語フォント（オプション）..."

if command -v fc-list >/dev/null 2>&1; then
  if fc-list :lang=ja 2>/dev/null | grep -q .; then
    pass "日本語フォント: 利用可能"
  else
    warn "日本語フォント未検出 — AnnotateImage のテキスト描画が □□□ になる可能性があります。'sudo apt install fonts-noto-cjk' を実行してください"
  fi
else
  warn "fc-list コマンドなし — フォント検出をスキップしました"
fi

echo ""

# -------------------------------------------------
# サマリー
# -------------------------------------------------
echo "=== 結果: ✓ $OK  △ $WARN  ✗ $FAIL ==="

if [ "$FAIL" -gt 0 ]; then
  echo ""
  echo "エラーがあります。上記の指示に従って修正してください。"
  exit 1
fi

echo ""
echo "準備完了です。"
