# harness_check.ps1 — GDI 하네스 보조 검증 훅 (PostToolUse: Write|Edit)
# drafts/ 의 .md 저장 시, '단위 붙은 수치'가 있으나 같은 줄에 출처/표기 마커가 없는 줄을
# '검토 후보'로 stderr에 보고한다. 휴리스틱이라 오탐 가능.
# 기본은 권고형(비차단, exit 0). 강제하려면 마지막 줄 exit 0 -> exit 2.
$ErrorActionPreference = 'SilentlyContinue'
try { $raw = [Console]::In.ReadToEnd() } catch { exit 0 }
if (-not $raw) { exit 0 }
try { $data = $raw | ConvertFrom-Json } catch { exit 0 }
$path = $data.tool_input.file_path
if (-not $path) { exit 0 }
$norm = ($path -replace '\\','/')
if ($norm -notmatch 'drafts' -or $path -notmatch '\.md$') { exit 0 }
if (-not (Test-Path -LiteralPath $path)) { exit 0 }

$numUnit = '[\d,]+(?:\.\d+)?\s*(?:%|％|p|억\s*원|만\s*원|조\s*원|원|개소|개|명|건|호|배|ha|㏊|㎢|km|㎞|톤|t|년|월|일|회|위|차)'
$markers = @('[확인요망','[추정','(출처','자료 :','자료:','[예시','[데이터 확인요망','[서지 확인요망')
$flagged = New-Object System.Collections.Generic.List[string]
$i = 0
foreach ($line in [System.IO.File]::ReadLines($path, [System.Text.Encoding]::UTF8)) {
  $i++
  $s = $line.Trim()
  if ([string]::IsNullOrEmpty($s) -or $s.StartsWith('|')) { continue }   # 표 행 건너뜀
  if ($s -match $numUnit) {
    $hit = $false
    foreach ($m in $markers) { if ($s.Contains($m)) { $hit = $true; break } }
    if (-not $hit) {
      $t = if ($s.Length -gt 120) { $s.Substring(0,120) } else { $s }
      $flagged.Add(("  L{0}: {1}" -f $i, $t))
    }
  }
}
if ($flagged.Count -eq 0) { exit 0 }
$max = 25
$name = Split-Path -Leaf $path
$out = New-Object System.Collections.Generic.List[string]
$out.Add('[GDI 하네스 검토 요망] 다음 줄에 단위 수치가 있으나 같은 줄에 출처/표기가 없음.')
$out.Add('이미 출처 대장에 등재됐거나 인근 줄에 근거가 있으면 무시, 아니면 [확인요망]/[추정] 부착 권장:')
$out.Add("(파일: $name)")
foreach ($f in ($flagged | Select-Object -First $max)) { $out.Add($f) }
if ($flagged.Count -gt $max) { $out.Add("  …외 $($flagged.Count - $max)건") }
[Console]::Error.WriteLine(($out -join "`n"))
exit 0
