#!/usr/bin/env bash
# verify — 품질 게이트 단일 진입점 (로컬 = CI 동일 파일, SSOT).
# 독립 게이트 10개를 병렬 실행해 wall-clock을 최느린 스텝으로 압축하고,
# 실패한 게이트의 로그만 노출한다. 전부 통과하면 마지막에 build.
# (colin-web-harness의 병렬 러너 패턴 이식)

set -u
cd "$(dirname "$0")/.."

LOGDIR=$(mktemp -d)
trap 'rm -rf "$LOGDIR"' EXIT

pids=""
names=""

run() { # run <이름> <명령...>
  local name="$1"; shift
  ( "$@" >"$LOGDIR/$name.log" 2>&1; echo $? >"$LOGDIR/$name.code" ) &
  pids="$pids $!"
  names="$names $name"
}

BIN=./node_modules/.bin

run oxlint      "$BIN/oxlint" --type-aware --max-warnings 0
run oxfmt       "$BIN/oxfmt" --check
run depcruise   "$BIN/depcruise" src --config .dependency-cruiser.cjs
run steiger     "$BIN/steiger" src
run tsc         "$BIN/tsc" -b
run vitest      "$BIN/vitest" run
run smell       bash .claude/scripts/code-smell.sh
run slop        bash .claude/scripts/slop-check.sh
run contrast    node .claude/scripts/contrast-check.mjs
run knip        "$BIN/knip" --no-config-hints

wait

fail=0
for name in $names; do
  code=$(cat "$LOGDIR/$name.code" 2>/dev/null || echo 1)
  if [ "$code" != "0" ]; then
    fail=1
    echo ""
    echo "✗ [$name] FAIL (exit $code)"
    tail -40 "$LOGDIR/$name.log"
  else
    # 성공해도 마지막 줄은 노출 — warning 은닉 방지
    echo "✓ [$name] $(tail -1 "$LOGDIR/$name.log" | head -c 120)"
  fi
done

if [ "$fail" != "0" ]; then
  echo ""
  echo "✗ verify: 실패한 게이트를 고치고 다시 실행하라 (pnpm verify)"
  exit 1
fi

echo ""
echo "— 게이트 전부 통과. build 실행 —"
"$BIN/vite" build
