#!/usr/bin/env bash
# Playwright MCP 서버 설치 검증 스크립트
# Playwright MCP 서버에 initialize 메시지를 보내고 응답을 확인합니다.

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_FILE="${SCRIPT_DIR}/verify-install.log"

log() {
  local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  echo "$msg"
  echo "$msg" >> "$LOG_FILE"
}

log "=== Playwright MCP 설치 검증 시작 ==="

# 1. Node.js / npm 버전 확인
log "Node.js 버전: $(node --version 2>&1 || echo 'NOT FOUND')"
log "npm 버전: $(npm --version 2>&1 || echo 'NOT FOUND')"

# 2. @playwright/mcp 패키지 확인
PACKAGE_JSON="${SCRIPT_DIR}/package.json"
if [[ -f "$PACKAGE_JSON" ]]; then
  MCP_VERSION=$(node -e "const p=require('${PACKAGE_JSON}'); console.log(p.dependencies?.['@playwright/mcp'] || 'NOT FOUND')" 2>&1)
  log "@playwright/mcp 버전 (package.json): ${MCP_VERSION}"
else
  log "ERROR: package.json 파일을 찾을 수 없습니다: ${PACKAGE_JSON}"
  exit 1
fi

# 3. node_modules 내 실제 설치 버전 확인
ACTUAL_VERSION=$(node -e "const p=require('${SCRIPT_DIR}/node_modules/@playwright/mcp/package.json'); console.log(p.version)" 2>&1)
log "@playwright/mcp 실제 설치 버전: ${ACTUAL_VERSION}"

# 4. Chromium 헤드리스 셸 바이너리 확인
PLAYWRIGHT_CACHE="${HOME}/.cache/ms-playwright"
HEADLESS_SHELL_MARKER="${PLAYWRIGHT_CACHE}/chromium_headless_shell-1212/INSTALLATION_COMPLETE"
if [[ -f "$HEADLESS_SHELL_MARKER" ]]; then
  log "Chromium Headless Shell: 설치 완료 (${PLAYWRIGHT_CACHE}/chromium_headless_shell-1212)"
else
  log "WARNING: Chromium Headless Shell 설치 마커를 찾을 수 없습니다. (${HEADLESS_SHELL_MARKER})"
fi

CHROMIUM_MARKER="${PLAYWRIGHT_CACHE}/chromium-1212/INSTALLATION_COMPLETE"
if [[ -f "$CHROMIUM_MARKER" ]]; then
  log "Chromium: 설치 완료 (${PLAYWRIGHT_CACHE}/chromium-1212)"
else
  log "WARNING: Chromium 설치 마커를 찾을 수 없습니다."
fi

# 5. MCP initialize 핸드셰이크 테스트
log "--- MCP initialize 메시지 전송 테스트 ---"

MCP_INIT_MSG='{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"verify-script","version":"1.0.0"}}}'

RESPONSE=$(echo "$MCP_INIT_MSG" | timeout 15 npx -y @playwright/mcp --headless 2>/dev/null || true)

if echo "$RESPONSE" | grep -q '"result"'; then
  log "MCP initialize 응답: 성공"
  SERVER_NAME=$(echo "$RESPONSE" | node -e "
    let data = '';
    process.stdin.on('data', d => data += d);
    process.stdin.on('end', () => {
      const lines = data.trim().split('\n');
      for (const line of lines) {
        try {
          const obj = JSON.parse(line);
          if (obj.result && obj.result.serverInfo) {
            console.log(obj.result.serverInfo.name + ' v' + obj.result.serverInfo.version);
            break;
          }
        } catch(e) {}
      }
    });
  " 2>/dev/null || echo "파싱 불가")
  log "MCP 서버 정보: ${SERVER_NAME}"
elif echo "$RESPONSE" | grep -q '"error"'; then
  log "ERROR: MCP 서버가 오류 응답을 반환했습니다."
  log "응답 내용: ${RESPONSE}"
  exit 1
else
  log "WARNING: MCP 서버 응답을 파싱할 수 없습니다. (타임아웃 또는 예상치 못한 응답)"
  log "원시 응답: ${RESPONSE:0:500}"
fi

# 6. Claude Code settings.json 확인
SETTINGS_FILE="${HOME}/.claude/settings.json"
if [[ -f "$SETTINGS_FILE" ]]; then
  if node -e "
    const s = require('${SETTINGS_FILE}');
    if (s.mcpServers && s.mcpServers.playwright) {
      console.log('playwright MCP 서버 설정: 존재함');
      console.log('  command: ' + s.mcpServers.playwright.command);
      console.log('  args: ' + JSON.stringify(s.mcpServers.playwright.args));
    } else {
      process.stderr.write('ERROR: playwright 키가 settings.json에 없습니다.\n');
      process.exit(1);
    }
    if (s.mcpServers && s.mcpServers.openclaw) {
      console.log('openclaw MCP 서버 설정: 존재함 (보존됨)');
    } else {
      process.stderr.write('WARNING: openclaw 키가 settings.json에 없습니다!\n');
    }
  " 2>&1 | while IFS= read -r line; do log "$line"; done; then
    log "settings.json 검증: 통과"
  else
    log "ERROR: settings.json 검증 실패"
    exit 1
  fi
else
  log "ERROR: settings.json 파일을 찾을 수 없습니다: ${SETTINGS_FILE}"
  exit 1
fi

log "=== 검증 완료: 모든 항목 통과 ==="
log "로그 파일: ${LOG_FILE}"
