#!/bin/bash
# test_finish_task_step0b.sh
# finish-task.sh Step 0b QC 프로세스 검증 기능 테스트
# 작성: 아르고스(테스터)
#
# 테스트 케이스:
#   TC1. Cycle 4 포함 보고서 → exit 1 차단
#   TC2. 로키(opus) 기록 없는 보고서 → exit 1 차단
#   TC3. 정상 보고서(Cycle 3 이내 + 로키 opus) → Step 0b PASS
#   TC4. 개발 작업(디자인 키워드 없음) → Step 0b 자체 스킵
#   TC5. SKIP_CYCLE_CHECK=1, SKIP_LOKI_CHECK=1 → 우회 통과

set -uo pipefail

WORKSPACE="/home/jay/workspace"
SCRIPT="$WORKSPACE/scripts/finish-task.sh"
TASK_ID="task-test-qc-step0b"
TASK_FILE="$WORKSPACE/memory/tasks/${TASK_ID}.md"
REPORT_FILE="$WORKSPACE/memory/reports/${TASK_ID}.md"
DONE_FILE="$WORKSPACE/memory/events/${TASK_ID}.done"

PASS_COUNT=0
FAIL_COUNT=0

# ─────────────────────────────────────────────
# 유틸 함수
# ─────────────────────────────────────────────

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

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

# 테스트용 디자인 task 파일 생성
create_design_task() {
    cat > "$TASK_FILE" <<'EOF'
# 배너 디자인 작업

이미지 배너 디자인 및 광고 소재 제작 작업입니다.
EOF
}

# 테스트용 개발 task 파일 생성 (디자인 키워드 없음)
create_dev_task() {
    cat > "$TASK_FILE" <<'EOF'
# API 엔드포인트 구현

백엔드 REST API 엔드포인트를 구현합니다.
데이터베이스 연결 및 CRUD 로직 작성.
EOF
}

# 정상 보고서 생성 (Cycle 3 이내 + 로키 opus 기록 포함)
create_normal_report() {
    cat > "$REPORT_FILE" <<'EOF'
# 작업 완료 보고서

## 작업 개요
배너 디자인 Cycle 2 완료.

## QC 이력
- Cycle 1: 초안 검토
- Cycle 2: 수정 후 최종 승인
- Cycle 3: 없음

## 모델 사용 기록

| 역할 | 모델 | 용도 |
|------|------|------|
| 로키 | claude-opus-4 | 디자인 QC 시각 검수 |
| 아르곤 | claude-sonnet-4 | 초안 생성 |

## 결과물
최종 배너 이미지 완성.
EOF
}

# Cycle 4 포함 보고서 생성
create_cycle4_report() {
    cat > "$REPORT_FILE" <<'EOF'
# 작업 완료 보고서

## 작업 개요
배너 디자인 작업.

## QC 이력
- Cycle 1: 초안 검토
- Cycle 2: 색상 수정
- Cycle 3: 레이아웃 수정
- Cycle 4: 추가 수정 진행

## 모델 사용 기록

| 역할 | 모델 | 용도 |
|------|------|------|
| 로키 | claude-opus-4 | 디자인 QC |

## 결과물
최종 배너 이미지.
EOF
}

# 로키(opus) 기록 없는 보고서 생성
create_no_loki_report() {
    cat > "$REPORT_FILE" <<'EOF'
# 작업 완료 보고서

## 작업 개요
배너 디자인 Cycle 2 완료.

## QC 이력
- Cycle 1: 초안 검토
- Cycle 2: 수정 후 승인

## 모델 사용 기록

| 역할 | 모델 | 용도 |
|------|------|------|
| 아르곤 | claude-sonnet-4 | 초안 생성 및 수정 |

## 결과물
최종 배너 이미지 완성.
EOF
}

# 로키는 있지만 opus 없는 보고서 생성 (로키가 sonnet 사용 케이스)
create_loki_no_opus_report() {
    cat > "$REPORT_FILE" <<'EOF'
# 작업 완료 보고서

## 작업 개요
배너 디자인 작업.

## QC 이력
- Cycle 1: 검토
- Cycle 2: 수정

## 모델 사용 기록

| 역할 | 모델 | 용도 |
|------|------|------|
| 로키 | claude-sonnet-4 | 디자인 검토 |

## 결과물
배너 완성.
EOF
}

# 공통 정리
cleanup() {
    rm -f "$TASK_FILE" 2>/dev/null || true
    rm -f "$REPORT_FILE" 2>/dev/null || true
    rm -f "$DONE_FILE" 2>/dev/null || true
}

echo "========================================"
echo " finish-task.sh Step 0b QC 프로세스 검증 테스트"
echo "========================================"
echo ""

# ─────────────────────────────────────────────
# TC1. Cycle 4 포함 보고서 → exit 1 차단
# ─────────────────────────────────────────────
echo "[TC1] Cycle 4 포함 보고서 → exit 1 차단"

cleanup
create_design_task
create_cycle4_report

EXIT_CODE=0
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?

# exit code 1 확인
if [ "$EXIT_CODE" -eq 1 ]; then
    pass "exit code 1 반환됨"
else
    fail "exit code가 1이 아님 (실제: $EXIT_CODE)"
fi

# 차단 메시지 확인
if echo "$OUTPUT" | grep -q "\[ERROR\].*Cycle 상한"; then
    pass "Cycle 상한 초과 ERROR 메시지 출력됨"
else
    fail "Cycle 상한 ERROR 메시지 없음 (출력: $(echo "$OUTPUT" | head -5))"
fi

# .done 파일 미생성 확인
if [ ! -f "$DONE_FILE" ]; then
    pass ".done 파일이 생성되지 않음"
else
    fail ".done 파일이 잘못 생성됨"
fi

cleanup
echo ""

# ─────────────────────────────────────────────
# TC2. 로키(opus) 기록 없는 보고서 → exit 1 차단
# ─────────────────────────────────────────────
echo "[TC2] 로키(opus) 기록 없는 보고서 → exit 1 차단"

cleanup
create_design_task
create_no_loki_report

EXIT_CODE=0
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?

# exit code 1 확인
if [ "$EXIT_CODE" -eq 1 ]; then
    pass "exit code 1 반환됨"
else
    fail "exit code가 1이 아님 (실제: $EXIT_CODE)"
fi

# 차단 메시지 확인
if echo "$OUTPUT" | grep -q "\[ERROR\].*로키.*opus"; then
    pass "로키(opus) 미참여 ERROR 메시지 출력됨"
else
    fail "로키(opus) ERROR 메시지 없음 (출력: $(echo "$OUTPUT" | head -5))"
fi

# .done 파일 미생성 확인
if [ ! -f "$DONE_FILE" ]; then
    pass ".done 파일이 생성되지 않음"
else
    fail ".done 파일이 잘못 생성됨"
fi

cleanup
echo ""

# ─────────────────────────────────────────────
# TC2b. 로키는 있지만 opus 없는 보고서 → exit 1 차단
# ─────────────────────────────────────────────
echo "[TC2b] 로키 있지만 opus 없는 보고서 → exit 1 차단"

cleanup
create_design_task
create_loki_no_opus_report

EXIT_CODE=0
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?

if [ "$EXIT_CODE" -eq 1 ]; then
    pass "exit code 1 반환됨 (로키+opus 조합 필수 검증)"
else
    fail "exit code가 1이 아님 (실제: $EXIT_CODE) — 로키+opus 조합 체크 실패"
fi

if echo "$OUTPUT" | grep -q "\[ERROR\].*로키"; then
    pass "로키(opus) 미참여 ERROR 메시지 출력됨"
else
    fail "로키 ERROR 메시지 없음 (출력: $(echo "$OUTPUT" | head -5))"
fi

cleanup
echo ""

# ─────────────────────────────────────────────
# TC3. 정상 보고서(Cycle 3 이내 + 로키 opus) → Step 0b PASS
# ─────────────────────────────────────────────
echo "[TC3] 정상 보고서(Cycle 3 이내 + 로키 opus) → Step 0b PASS"

cleanup
create_design_task
create_normal_report

EXIT_CODE=0
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?

# Step 0b 관련 ERROR 메시지 없어야 함
if echo "$OUTPUT" | grep -q "\[ERROR\].*Cycle 상한"; then
    fail "정상 보고서인데 Cycle 상한 ERROR 발생"
else
    pass "Cycle 상한 체크 PASS (Cycle 3 이내)"
fi

if echo "$OUTPUT" | grep -q "\[ERROR\].*로키"; then
    fail "정상 보고서인데 로키 ERROR 발생"
else
    pass "로키(opus) 기록 체크 PASS"
fi

# SKIP 메시지가 없어도 됨 — Step 0b를 정상 통과한 것
if echo "$OUTPUT" | grep -qE "\[ERROR\].*(Cycle 상한|로키)"; then
    fail "Step 0b에서 예상치 못한 ERROR 발생"
else
    pass "Step 0b 전체 검증 PASS (차단 없음)"
fi

cleanup
echo ""

# ─────────────────────────────────────────────
# TC4. 개발 작업(디자인 키워드 없음) → Step 0b 스킵
# ─────────────────────────────────────────────
echo "[TC4] 개발 작업(디자인 키워드 없음) → Step 0b 자체 스킵"

cleanup
create_dev_task
# 보고서 없음 (디자인 작업이 아니므로 보고서 불필요)

EXIT_CODE=0
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?

# Step 0b의 ERROR 메시지가 없어야 함
if echo "$OUTPUT" | grep -qE "\[ERROR\].*(Cycle 상한|로키)"; then
    fail "개발 작업인데 Step 0b 검증이 실행됨"
else
    pass "Step 0b 검증 스킵됨 (디자인 키워드 없음)"
fi

# exit 1이 Step 0b 때문에 발생하지 않았는지 확인
if [ "$EXIT_CODE" -eq 1 ]; then
    # Step 0b가 아닌 다른 이유로 실패했는지 확인
    if echo "$OUTPUT" | grep -qE "\[ERROR\].*(Cycle 상한|로키)"; then
        fail "Step 0b 때문에 exit 1 발생"
    else
        pass "Step 0b는 exit 1 발생 없음 (다른 단계 에러는 무관)"
    fi
else
    pass "Step 0b로 인한 차단 없음"
fi

cleanup
echo ""

# ─────────────────────────────────────────────
# TC5. SKIP_CYCLE_CHECK=1, SKIP_LOKI_CHECK=1 → 우회 통과
# ─────────────────────────────────────────────
echo "[TC5] SKIP_CYCLE_CHECK=1 + SKIP_LOKI_CHECK=1 → Step 0b 우회 통과"

cleanup
create_design_task
# Cycle 4 + 로키 없는 최악 보고서 사용
cat > "$REPORT_FILE" <<'EOF'
# 작업 완료 보고서

## 작업 개요
배너 디자인 작업.

## QC 이력
- Cycle 4: 계속 수정 중

## 모델 사용 기록

| 역할 | 모델 | 용도 |
|------|------|------|
| 아르곤 | claude-sonnet-4 | 단독 진행 |

## 결과물
배너.
EOF

EXIT_CODE=0
OUTPUT=$(SKIP_CYCLE_CHECK=1 SKIP_LOKI_CHECK=1 bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?

# SKIP WARN 메시지 확인
if echo "$OUTPUT" | grep -q "SKIP_CYCLE_CHECK=1.*우회"; then
    pass "SKIP_CYCLE_CHECK=1 우회 메시지 출력됨"
else
    fail "SKIP_CYCLE_CHECK 우회 메시지 없음 (출력: $(echo "$OUTPUT" | head -5))"
fi

if echo "$OUTPUT" | grep -q "SKIP_LOKI_CHECK=1.*우회"; then
    pass "SKIP_LOKI_CHECK=1 우회 메시지 출력됨"
else
    fail "SKIP_LOKI_CHECK 우회 메시지 없음 (출력: $(echo "$OUTPUT" | head -5))"
fi

# Step 0b에서 exit 1이 발생하지 않아야 함
if echo "$OUTPUT" | grep -qE "\[ERROR\].*(Cycle 상한|로키)"; then
    fail "SKIP 플래그에도 불구하고 Step 0b ERROR 발생"
else
    pass "SKIP 플래그로 Step 0b ERROR 없이 통과"
fi

cleanup
echo ""

# ─────────────────────────────────────────────
# TC5b. SKIP_CYCLE_CHECK=1만 → Cycle 우회, 로키 체크는 여전히 작동
# ─────────────────────────────────────────────
echo "[TC5b] SKIP_CYCLE_CHECK=1만 → Cycle 우회, 로키 체크는 여전히 차단"

cleanup
create_design_task
# Cycle 4 + 로키 없는 보고서
cat > "$REPORT_FILE" <<'EOF'
# 작업 완료 보고서

## 작업 개요
배너 디자인.

## QC 이력
- Cycle 4: 수정 진행

## 모델 사용 기록

| 역할 | 모델 | 용도 |
|------|------|------|
| 아르곤 | claude-sonnet-4 | 단독 진행 |

## 결과물
배너.
EOF

EXIT_CODE=0
OUTPUT=$(SKIP_CYCLE_CHECK=1 bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?

# Cycle 우회 메시지 확인
if echo "$OUTPUT" | grep -q "SKIP_CYCLE_CHECK=1.*우회"; then
    pass "SKIP_CYCLE_CHECK=1 우회 메시지 출력됨"
else
    fail "SKIP_CYCLE_CHECK 우회 메시지 없음"
fi

# 로키 체크는 여전히 차단해야 함
if [ "$EXIT_CODE" -eq 1 ] && echo "$OUTPUT" | grep -q "\[ERROR\].*로키"; then
    pass "로키 체크는 여전히 exit 1로 차단됨"
else
    fail "로키 체크가 차단되지 않음 (EXIT_CODE=$EXIT_CODE)"
fi

cleanup
echo ""

# ─────────────────────────────────────────────
# TC6. 보고서 파일 없는 디자인 작업 → WARN만 출력, 차단 없음
# ─────────────────────────────────────────────
echo "[TC6] 디자인 작업인데 보고서 파일 없음 → WARN만, 차단 없음"

cleanup
create_design_task
# 보고서 파일 미생성

EXIT_CODE=0
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?

# WARN 메시지 확인
if echo "$OUTPUT" | grep -q "\[WARN\].*보고서 파일 없음"; then
    pass "보고서 없음 WARN 메시지 출력됨"
else
    fail "보고서 없음 WARN 메시지 없음 (출력: $(echo "$OUTPUT" | head -5))"
fi

# Step 0b로 인한 exit 1이 아닌지 확인
if echo "$OUTPUT" | grep -qE "\[ERROR\].*(Cycle 상한|로키)"; then
    fail "보고서 없는데 Step 0b ERROR 발생"
else
    pass "Step 0b ERROR 없음 (보고서 없으면 QC 검증 스킵)"
fi

cleanup
echo ""

# ─────────────────────────────────────────────
# TC7. "팀장 시각 검수" 패턴 → WARNING만, exit 1 없음
# ─────────────────────────────────────────────
echo "[TC7] '팀장 시각 검수' 패턴 감지 → WARNING만 출력, 차단 없음"

cleanup
create_design_task
# 팀장 시각 검수 패턴이 포함된 정상 보고서 (로키+opus 있음)
cat > "$REPORT_FILE" <<'EOF'
# 작업 완료 보고서

## 작업 개요
배너 디자인 Cycle 2 완료.

## QC 이력
- Cycle 1: 팀장 시각 검수 진행
- Cycle 2: 최종 승인

## 모델 사용 기록

| 역할 | 모델 | 용도 |
|------|------|------|
| 로키 | claude-opus-4 | QC 검수 |

## 결과물
배너 완성.
EOF

EXIT_CODE=0
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?

# WARN 메시지 확인
if echo "$OUTPUT" | grep -q "\[WARN\].*팀장 시각 검수"; then
    pass "팀장 시각 검수 WARN 메시지 출력됨"
else
    fail "팀장 시각 검수 WARN 메시지 없음 (출력: $(echo "$OUTPUT" | head -5))"
fi

# Step 0b에서 exit 1이 아닌지 확인 (WARNING만이어야 함)
if echo "$OUTPUT" | grep -qE "\[ERROR\].*(Cycle 상한|로키)"; then
    fail "팀장 시각 검수 패턴으로 ERROR/exit 1 발생 (WARN만 출력해야 함)"
else
    pass "Step 0b에서 exit 1 없음 (WARNING만 출력으로 통과)"
fi

cleanup
echo ""

# ─────────────────────────────────────────────
# 최종 결과
# ─────────────────────────────────────────────
echo "========================================"
echo " 테스트 결과 요약"
echo "========================================"
echo "  PASS: $PASS_COUNT"
echo "  FAIL: $FAIL_COUNT"
TOTAL=$((PASS_COUNT + FAIL_COUNT))
echo "  TOTAL: $TOTAL"
echo ""

if [ "$FAIL_COUNT" -eq 0 ]; then
    echo "  모든 테스트 통과!"
    exit 0
else
    echo "  일부 테스트 실패. 위 FAIL 항목을 확인하세요."
    exit 1
fi
