#!/usr/bin/env python3
"""Detect tests that read/write real TOML files. Used as a CI gate.

Run from repo root: python scripts/check_test_toml_paths.py
Exits 0 if all tests use sandboxed paths, 1 otherwise.
"""
from __future__ import annotations
import re
import sys
from pathlib import Path

TOML_BASENAMES = {
 "manual_slop", "config", "credentials",
 "presets", "personas", "tool_presets",
 "workspace_profiles", "tool_presets",
}

PATTERNS = [
 re.compile(rf'Path\(["\'](?:{"|".join(TOML_BASENAMES)})\.toml["\']'),
 re.compile(rf'open\(["\'](?:{"|".join(TOML_BASENAMES)})\.toml["\']'),
 re.compile(rf'["\']\.{{1,2}}/(?:{"|".join(TOML_BASENAMES)})\.toml["\']'),
 re.compile(rf'Path\(["\']\.\./(?:{"|".join(TOML_BASENAMES)})\.toml["\']'),
 re.compile(r'Path\(["\']tests/artifacts/'),
 re.compile(r'Path\(["\']C:[/\\]+projects'),
]

EXCLUDE_DIRS = {"artifacts", "logs", "__pycache__", "snapshots"}


def find_violations(tests_dir: Path) -> list[tuple[Path, int, str]]:
 violations = []
 for test_file in tests_dir.rglob("test_*.py"):
  if any(excluded in test_file.parts for excluded in EXCLUDE_DIRS):
   continue
  try:
   content = test_file.read_text(encoding="utf-8")
  except (OSError, UnicodeDecodeError):
   continue
  for lineno, line in enumerate(content.splitlines(), start=1):
   for pattern in PATTERNS:
    if pattern.search(line):
     violations.append((test_file, lineno, line.strip()))
     break
 return violations


def main() -> int:
 repo_root = Path(__file__).resolve().parent.parent
 tests_dir = repo_root / "tests"
 if not tests_dir.exists():
  print(f"Tests dir not found: {tests_dir}", file=sys.stderr)
  return 1
 violations = find_violations(tests_dir)
 if not violations:
  print("OK: No tests reference real TOML files.")
  return 0
 print(f"FAIL: {len(violations)} test(s) reference real TOML files:")
 for path, lineno, line in violations:
  rel = path.relative_to(repo_root)
  print(f"  {rel}:{lineno}: {line}")
 return 1


if __name__ == "__main__":
 sys.exit(main())
