#!/bin/bash
# test_knowhow_check.sh
# finish-task.sh Step 0 노하우 freshness 체크 기능 테스트
# 작성: 아르고스(테스터)

set -uo pipefail

WORKSPACE="/home/jay/workspace"
SCRIPT="$WORKSPACE/scripts/finish-task.sh"
TIMER_FILE="$WORKSPACE/memory/task-timers.json"
TASK_ID="task-test-knowhow"
TASK_FILE="$WORKSPACE/memory/tasks/${TASK_ID}.md"
DONE_FILE="$WORKSPACE/memory/events/${TASK_ID}.done"

KNOWHOW_FILES=(
    "$WORKSPACE/memory/specs/knowhow-design.md"
    "$WORKSPACE/memory/specs/design-qc-knowhow.md"
    "$WORKSPACE/memory/specs/knowhow-marketing.md"
)

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-timers.json에 테스트 타이머 등록
register_timer() {
    local start_time="$1"
    python3 - <<PYEOF
import json
TIMER_FILE = '$TIMER_FILE'
with open(TIMER_FILE) as f:
    data = json.load(f)
data['tasks']['$TASK_ID'] = {
    'task_id': '$TASK_ID',
    'start_time': '$start_time',
    'status': 'running'
}
with open(TIMER_FILE, 'w') as f:
    json.dump(data, f, indent=2, ensure_ascii=False)
PYEOF
}

# task-timers.json에서 테스트 타이머 제거
remove_timer() {
    python3 - <<PYEOF
import json
TIMER_FILE = '$TIMER_FILE'
with open(TIMER_FILE) as f:
    data = json.load(f)
data['tasks'].pop('$TASK_ID', None)
with open(TIMER_FILE, 'w') as f:
    json.dump(data, f, indent=2, ensure_ascii=False)
PYEOF
}

# 노하우 파일들의 원래 mtime 저장
save_knowhow_mtimes() {
    python3 - <<'PYEOF'
import os, json
files = [
    '/home/jay/workspace/memory/specs/knowhow-design.md',
    '/home/jay/workspace/memory/specs/design-qc-knowhow.md',
    '/home/jay/workspace/memory/specs/knowhow-marketing.md',
]
mtimes = {}
for f in files:
    if os.path.exists(f):
        mtimes[f] = os.path.getmtime(f)
print(json.dumps(mtimes))
PYEOF
}

# 노하우 파일들 mtime 원복
restore_knowhow_mtimes() {
    local mtimes_json="$1"
    python3 - <<PYEOF
import os, json
mtimes = json.loads('$mtimes_json')
for path, mtime in mtimes.items():
    if os.path.exists(path):
        os.utime(path, (mtime, mtime))
PYEOF
}

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

echo "========================================"
echo " finish-task.sh 노하우 freshness 체크 테스트"
echo "========================================"
echo ""

# ─────────────────────────────────────────────
# 테스트 1: 디자인 키워드 + 노하우 미업데이트 → 차단 확인
# ─────────────────────────────────────────────
echo "[TEST 1] 디자인 키워드 + 노하우 미업데이트 → exit 1 차단"

# 노하우 mtime 원본 보존
SAVED_MTIMES=$(save_knowhow_mtimes)

# task 파일 생성 (디자인 키워드 포함)
cat > "$TASK_FILE" <<'EOF'
# 디자인 작업 테스트

배너 디자인 및 이미지 제작 작업입니다.
EOF

# 미래 시간으로 start_time 등록 (2099년 → 노하우 파일보다 항상 미래)
register_timer "2099-01-01T00:00:00"

# finish-task.sh 실행하여 stdout+stderr 캡처
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || EXIT_CODE=$?
EXIT_CODE="${EXIT_CODE:-0}"

# Step 0 차단 메시지 확인
if echo "$OUTPUT" | grep -q "\[ERROR\].*노하우"; then
    pass "Step 0에서 '[ERROR] ❌ 노하우' 메시지 출력됨"
else
    fail "Step 0 차단 메시지가 출력되지 않음 (출력: $(echo "$OUTPUT" | head -3))"
fi

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

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

# 정리
cleanup
restore_knowhow_mtimes "$SAVED_MTIMES"
echo ""

# ─────────────────────────────────────────────
# 테스트 2: 디자인 키워드 + 노하우 업데이트 → PASS 확인
# ─────────────────────────────────────────────
echo "[TEST 2] 디자인 키워드 + 노하우 업데이트 → Step 0 PASS"

# task 파일 생성 (디자인 키워드 포함)
cat > "$TASK_FILE" <<'EOF'
# 디자인 작업 테스트

배너 디자인 및 이미지 제작 작업입니다.
EOF

# 과거 시간으로 start_time 등록 (2020년 → 노하우 파일이 그 이후이므로 PASS)
register_timer "2020-01-01T00:00:00"

# finish-task.sh 실행 (후속 단계 에러는 무시)
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || true

# Step 0 차단 메시지가 없는지 확인
if echo "$OUTPUT" | grep -q "\[ERROR\].*노하우"; then
    fail "Step 0에서 불필요한 차단 발생"
else
    pass "Step 0 차단 메시지 없음 (노하우 체크 PASS)"
fi

# 정리
cleanup
echo ""

# ─────────────────────────────────────────────
# 테스트 3: SKIP_KNOWHOW_CHECK=1 → 우회 통과 확인
# ─────────────────────────────────────────────
echo "[TEST 3] SKIP_KNOWHOW_CHECK=1 → Step 0 우회 확인"

# 노하우 mtime 원본 보존
SAVED_MTIMES=$(save_knowhow_mtimes)

# task 파일 생성 (디자인 키워드 포함)
cat > "$TASK_FILE" <<'EOF'
# 디자인 작업 테스트

배너 디자인 및 이미지 제작 작업입니다.
EOF

# 미래 시간으로 start_time 등록 (테스트 1과 동일 조건)
register_timer "2099-01-01T00:00:00"

# SKIP_KNOWHOW_CHECK=1로 실행 (후속 단계 에러는 무시)
OUTPUT=$(SKIP_KNOWHOW_CHECK=1 bash "$SCRIPT" "$TASK_ID" 2>&1) || true

# Step 0에서 exit 1이 발생하지 않았는지 확인: 차단 후 exit하면 [WARN] SKIP 메시지 없이 끝남
# SKIP_KNOWHOW_CHECK=1이면 [WARN] 메시지가 출력되어야 함
if echo "$OUTPUT" | grep -q "SKIP_KNOWHOW_CHECK=1로 우회"; then
    pass "SKIP_KNOWHOW_CHECK=1로 우회 메시지 확인됨"
else
    # exit 1로 차단됐는지 재확인
    if echo "$OUTPUT" | grep -q "\[ERROR\].*노하우" && ! echo "$OUTPUT" | grep -q "\[WARN\].*우회"; then
        fail "SKIP_KNOWHOW_CHECK=1임에도 Step 0에서 exit 1로 차단됨"
    else
        pass "Step 0에서 exit 1 차단 없이 진행됨 (우회 성공)"
    fi
fi

# 정리
cleanup
restore_knowhow_mtimes "$SAVED_MTIMES"
echo ""

# ─────────────────────────────────────────────
# 테스트 4: 일반 개발 작업 (키워드 없음) → 영향 없음 확인
# ─────────────────────────────────────────────
echo "[TEST 4] 일반 개발 작업 (키워드 없음) → Step 0 영향 없음"

# task 파일 생성 (디자인/마케팅 키워드 없음)
cat > "$TASK_FILE" <<'EOF'
# API 엔드포인트 구현

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

# 미래 시간으로 start_time 등록
register_timer "2099-01-01T00:00:00"

# finish-task.sh 실행 (후속 단계 에러는 무시)
OUTPUT=$(bash "$SCRIPT" "$TASK_ID" 2>&1) || true

# Step 0 차단 메시지가 없는지 확인
if echo "$OUTPUT" | grep -q "\[ERROR\].*노하우"; then
    fail "키워드 없는 작업인데 Step 0에서 차단됨"
else
    pass "Step 0 차단 없음 (일반 개발 작업은 영향 없음)"
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
