#!/usr/bin/env bash
# test_ci_preflight.sh — ci_preflight.sh 기능 검증 테스트
# 작성자: 하누만 (개발4팀 테스터)
# task-2148

SCRIPT="/home/jay/workspace/scripts/ci_preflight.sh"
PASS_COUNT=0
FAIL_COUNT=0

pass() {
  echo "[PASS] $1"
  PASS_COUNT=$(( PASS_COUNT + 1 ))
}

fail() {
  echo "[FAIL] $1"
  FAIL_COUNT=$(( FAIL_COUNT + 1 ))
}

# --- 시나리오 1: 멀티 스택 프로젝트 ---
echo ""
echo "=== 시나리오 1: 멀티 스택 프로젝트 (pytest + tsc + vitest) ==="

rm -rf /tmp/ci_test_multi
mkdir -p /tmp/ci_test_multi
touch /tmp/ci_test_multi/pyproject.toml
echo '{"compilerOptions":{}}' > /tmp/ci_test_multi/tsconfig.json
touch /tmp/ci_test_multi/vitest.config.ts

OUTPUT=$(bash "$SCRIPT" /tmp/ci_test_multi 2>&1)
EXIT_CODE=$?

# pytest 러너 감지 확인
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] runner=pytest'; then
  pass "시나리오1: pytest 러너 감지됨"
else
  fail "시나리오1: pytest 러너 미감지"
fi

# tsc 러너 감지 확인
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] runner=tsc'; then
  pass "시나리오1: tsc 러너 감지됨"
else
  fail "시나리오1: tsc 러너 미감지"
fi

# vitest 러너 감지 확인
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] runner=vitest'; then
  pass "시나리오1: vitest 러너 감지됨"
else
  fail "시나리오1: vitest 러너 미감지"
fi

# runner= 줄이 3개인지 확인
RUNNER_LINE_COUNT=$(echo "$OUTPUT" | grep -c '\[CI-PREFLIGHT\] runner=')
if [[ "$RUNNER_LINE_COUNT" -eq 3 ]]; then
  pass "시나리오1: runner= 줄 정확히 3개"
else
  fail "시나리오1: runner= 줄 수 불일치 (기대=3, 실제=${RUNNER_LINE_COUNT})"
fi

# overall= 줄이 1개인지 확인
OVERALL_LINE_COUNT=$(echo "$OUTPUT" | grep -c '\[CI-PREFLIGHT\] overall=')
if [[ "$OVERALL_LINE_COUNT" -eq 1 ]]; then
  pass "시나리오1: overall= 줄 정확히 1개"
else
  fail "시나리오1: overall= 줄 수 불일치 (기대=1, 실제=${OVERALL_LINE_COUNT})"
fi

# --- 시나리오 2: Python 전용 프로젝트 ---
echo ""
echo "=== 시나리오 2: Python 전용 프로젝트 (requirements.txt) ==="

rm -rf /tmp/ci_test_python
mkdir -p /tmp/ci_test_python
touch /tmp/ci_test_python/requirements.txt

OUTPUT=$(bash "$SCRIPT" /tmp/ci_test_python 2>&1)
EXIT_CODE=$?

# pytest만 감지
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] runner=pytest'; then
  pass "시나리오2: pytest 러너 감지됨"
else
  fail "시나리오2: pytest 러너 미감지"
fi

# tsc, vitest, jest는 감지되지 않아야 함
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] runner=tsc'; then
  fail "시나리오2: tsc 러너가 감지되면 안 됨"
else
  pass "시나리오2: tsc 러너 미감지 (정상)"
fi

if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] runner=vitest'; then
  fail "시나리오2: vitest 러너가 감지되면 안 됨"
else
  pass "시나리오2: vitest 러너 미감지 (정상)"
fi

# runner= 줄이 정확히 1개
RUNNER_LINE_COUNT=$(echo "$OUTPUT" | grep -c '\[CI-PREFLIGHT\] runner=')
if [[ "$RUNNER_LINE_COUNT" -eq 1 ]]; then
  pass "시나리오2: runner= 줄 정확히 1개"
else
  fail "시나리오2: runner= 줄 수 불일치 (기대=1, 실제=${RUNNER_LINE_COUNT})"
fi

# exit code는 0이어야 함 (pytest가 SKIP=0이므로)
if [[ "$EXIT_CODE" -eq 0 ]]; then
  pass "시나리오2: exit code 0"
else
  fail "시나리오2: exit code 불일치 (기대=0, 실제=${EXIT_CODE})"
fi

# overall=PASS
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] overall=PASS'; then
  pass "시나리오2: overall=PASS"
else
  fail "시나리오2: overall=PASS 아님 (실제: $(echo "$OUTPUT" | grep '\[CI-PREFLIGHT\] overall='))"
fi

# --- 시나리오 3: 빈 프로젝트 ---
echo ""
echo "=== 시나리오 3: 빈 프로젝트 (러너 없음) ==="

rm -rf /tmp/ci_test_empty
mkdir -p /tmp/ci_test_empty

OUTPUT=$(bash "$SCRIPT" /tmp/ci_test_empty 2>&1)
EXIT_CODE=$?

# No runners detected 메시지
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] No runners detected'; then
  pass "시나리오3: 'No runners detected' 출력됨"
else
  fail "시나리오3: 'No runners detected' 없음"
fi

# overall=PASS
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] overall=PASS'; then
  pass "시나리오3: overall=PASS"
else
  fail "시나리오3: overall=PASS 아님"
fi

# exit code 0
if [[ "$EXIT_CODE" -eq 0 ]]; then
  pass "시나리오3: exit code 0"
else
  fail "시나리오3: exit code 불일치 (기대=0, 실제=${EXIT_CODE})"
fi

# runner= 줄 없어야 함
RUNNER_LINE_COUNT=$(echo "$OUTPUT" | grep -c '\[CI-PREFLIGHT\] runner=')
if [[ "$RUNNER_LINE_COUNT" -eq 0 ]]; then
  pass "시나리오3: runner= 줄 없음 (정상)"
else
  fail "시나리오3: runner= 줄 있으면 안 됨 (실제=${RUNNER_LINE_COUNT})"
fi

# --- 시나리오 4: CLI 에러 케이스 ---
echo ""
echo "=== 시나리오 4: CLI 에러 케이스 ==="

# 4-1: 인자 없이 실행
OUTPUT=$(bash "$SCRIPT" 2>&1)
EXIT_CODE=$?

if [[ "$EXIT_CODE" -eq 1 ]]; then
  pass "시나리오4-1: 인자 없음 → exit 1"
else
  fail "시나리오4-1: exit code 불일치 (기대=1, 실제=${EXIT_CODE})"
fi

if echo "$OUTPUT" | grep -qi 'usage\|error'; then
  pass "시나리오4-1: 에러/사용법 메시지 출력됨"
else
  fail "시나리오4-1: 에러 메시지 없음"
fi

# 4-2: 존재하지 않는 디렉토리
OUTPUT=$(bash "$SCRIPT" /tmp/ci_test_nonexistent_xyzabc 2>&1)
EXIT_CODE=$?

if [[ "$EXIT_CODE" -eq 1 ]]; then
  pass "시나리오4-2: 존재하지 않는 디렉토리 → exit 1"
else
  fail "시나리오4-2: exit code 불일치 (기대=1, 실제=${EXIT_CODE})"
fi

if echo "$OUTPUT" | grep -qi 'error\|not a directory'; then
  pass "시나리오4-2: 에러 메시지 출력됨"
else
  fail "시나리오4-2: 에러 메시지 없음"
fi

# --- 시나리오 5: 실제 workspace 프로젝트 ---
echo ""
echo "=== 시나리오 5: 실제 workspace 프로젝트 (/home/jay/workspace) ==="

WORKSPACE="/home/jay/workspace"

# pyproject.toml 존재 여부 확인
if [[ -f "$WORKSPACE/pyproject.toml" ]]; then
  pass "시나리오5: workspace에 pyproject.toml 존재"
else
  fail "시나리오5: workspace에 pyproject.toml 없음"
fi

OUTPUT=$(bash "$SCRIPT" "$WORKSPACE" 2>&1)
EXIT_CODE=$?

# pytest 감지
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] runner=pytest'; then
  pass "시나리오5: pytest 러너 감지됨"
else
  fail "시나리오5: pytest 러너 미감지"
fi

# overall= 줄 존재
if echo "$OUTPUT" | grep -q '\[CI-PREFLIGHT\] overall='; then
  pass "시나리오5: overall= 줄 존재"
else
  fail "시나리오5: overall= 줄 없음"
fi

# pytest 결과가 0(PASS) 또는 SKIP이어야 함 (비정상 fail 아님)
if echo "$OUTPUT" | grep '\[CI-PREFLIGHT\] runner=pytest' | grep -q 'exit=0\|exit=SKIP'; then
  pass "시나리오5: pytest exit=0 또는 SKIP (정상)"
else
  PYTEST_LINE=$(echo "$OUTPUT" | grep '\[CI-PREFLIGHT\] runner=pytest')
  fail "시나리오5: pytest 비정상 종료 ($PYTEST_LINE)"
fi

# exit code 0 (PASS) or 2 (WARN) → 1(FAIL)이 아니어야 함
if [[ "$EXIT_CODE" -ne 1 ]]; then
  pass "시나리오5: overall FAIL(exit 1) 아님 (exit=${EXIT_CODE})"
else
  fail "시나리오5: overall=FAIL 발생 (exit=1)"
fi

# --- 최종 결과 ---
echo ""
echo "=============================="
echo "총 결과: PASS=${PASS_COUNT}, FAIL=${FAIL_COUNT}"
TOTAL=$(( PASS_COUNT + FAIL_COUNT ))
echo "테스트: ${TOTAL}개 중 ${PASS_COUNT}개 통과"
echo "=============================="

if [[ "$FAIL_COUNT" -gt 0 ]]; then
  exit 1
else
  exit 0
fi
