#!/usr/bin/env bash
# slop-check — ui-quality 스킬 하드밴 중 grep으로 잡히는 패턴의 기계 검사.
# LLM 감각만 믿지 않고 반복 slop을 결정적으로 잡는다 (verify 단계에서 호출).
# 대상: src/**/*.tsx|ts|css. 위반 발견 시 파일:라인 출력 + exit 1.

set -uo pipefail

TARGET="${1:-src}"
[ -d "$TARGET" ] || { echo "slop-check: '$TARGET' 없음 — 검사 대상 없음 (스캐폴드 전)"; exit 0; }

fail=0
check() { # check <label> <grep-ERE> [extra grep args...]
  local label="$1" pattern="$2"; shift 2
  local hits
  hits=$(grep -rnE "$pattern" "$TARGET" --include='*.tsx' --include='*.ts' --include='*.css' "$@" 2>/dev/null || true)
  if [ -n "$hits" ]; then
    echo "✗ [$label]"
    echo "$hits" | head -10
    fail=1
  fi
}

# gradient text — AI 클리셰 1호
check "gradient-text" 'bg-clip-text'
# 장식용 glassmorphism
check "glassmorphism" 'backdrop-blur'
# uppercase eyebrow 라벨
check "uppercase-eyebrow" 'uppercase[^"]*tracking-wide|tracking-wide[^"]*uppercase'
# emoji를 아이콘으로 (JSX 안 pictograph)
# 브래킷 표현식은 BSD grep에서 멀티바이트가 불안정 — alternation으로 매칭한다
check "emoji-icon" '(🔔|🔍|✅|⚠️|🚀|✨|🎉|📊|📈|🔥|💡|⭐️|❌|🟢|🔴)'
# 웹폰트 수동 import (폰트는 index.css 한 곳)
check "font-import" '@import[^;]*(fonts\.googleapis|font)'
# 인라인 style 하드코딩 색
check "inline-hex-style" 'style=\{\{[^}]*#[0-9a-fA-F]{3,6}'

# 인라인 <svg> 금지 — 아이콘은 lucide-react, 브랜드 자산은 파일로 (shared/ui의 shadcn 생성물은 예외)
svg_hits=$(grep -rn '<svg' "$TARGET" --include='*.tsx' 2>/dev/null | grep -v 'shared/ui/' || true)
if [ -n "$svg_hits" ]; then
  echo "✗ [inline-svg] 아이콘은 lucide-react에서 import, 이미지는 파일 자산으로"
  echo "$svg_hits" | head -10
  fail=1
fi

# em dash(—) 금지 — 한국어 UI에 어색한 대표적 AI 문장부호 (주석·생성물 제외)
emdash_hits=$(grep -rn '—' "$TARGET" --include='*.tsx' --include='*.ts' 2>/dev/null   | grep -v '_generated' | grep -vE ':[0-9]+: *(//|\*|/\*|\{/\*)' || true)
if [ -n "$emdash_hits" ]; then
  echo "✗ [em-dash] — 대신 한국어 문장부호(쉼표·괄호·가운뎃점)로"
  echo "$emdash_hits" | head -10
  fail=1
fi

if [ "$fail" -eq 0 ]; then
  echo "slop-check PASS — 기계 검출 가능한 slop 패턴 0건"
fi
exit "$fail"
