#!/usr/bin/env bash
set -euo pipefail

SCRIPT_DIR="$(
  CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")" >/dev/null 2>&1
  pwd -P
)"

ROOT="$(
  CDPATH= cd -- "$SCRIPT_DIR/.." >/dev/null 2>&1
  pwd -P
)"

TMP="$ROOT/tests/.tmp"

rm -rf -- "$TMP"
mkdir -p -- "$TMP/logs"

export TRACEFLOW_LOG_DIR="$TMP/logs"
export TRACEFLOW_ENABLED=1

pass=0
fail=0

ok() {
  printf 'PASS  %s\n' "$1"
  pass=$((pass + 1))
}

no() {
  printf 'FAIL  %s\n' "$1" >&2
  fail=$((fail + 1))
}

if bash -n "$ROOT/bin/traceflow.sh"; then
  ok 'Bash syntax'
else
  no 'Bash syntax'
fi

if bash -n "$ROOT/bin/traceflow"; then
  ok 'CLI syntax'
else
  no 'CLI syntax'
fi

if python3 -m py_compile \
  "$ROOT/src/traceflow.py" \
  "$ROOT/src/fileflow.py"; then
  ok 'Python syntax'
else
  no 'Python syntax'
fi

if command -v php >/dev/null 2>&1; then
  if php -l "$ROOT/src/TraceFlow.php" >/dev/null &&
     php -l "$ROOT/examples/runtime-file-flow.php" >/dev/null; then
    ok 'PHP syntax'
  else
    no 'PHP syntax'
  fi

  if php "$ROOT/examples/runtime-file-flow.php"; then
    ok 'PHP include runtime capture'
  else
    no 'PHP include runtime capture'
  fi
else
  printf 'SKIP  PHP unavailable\n'
fi

if command -v node >/dev/null 2>&1; then
  if node --check "$ROOT/src/traceflow.js" &&
     node "$ROOT/tests/test-js.mjs"; then
    ok 'Node/JS resource timing'
  else
    no 'Node/JS resource timing'
  fi
else
  printf 'SKIP  Node unavailable\n'
fi

if "$ROOT/examples/demo.sh" >/dev/null; then
  ok 'Cross-language demo'
else
  no 'Cross-language demo'
fi

if python3 "$ROOT/src/fileflow.py" scan \
  --root "$ROOT" \
  --entry examples/flow-demo/index.php \
  --entry examples/flow-demo/bin/job.sh \
  --entry examples/flow-demo/jobs/importer.py \
  --output "$TMP/graph.json" &&
  python3 - "$TMP/graph.json" <<'PY'
import json
import sys

graph = json.load(open(sys.argv[1], encoding="utf-8"))

kinds = {edge["kind"] for edge in graph["edges"]}

required = {
    "php.include",
    "html.script",
    "html.stylesheet",
    "css.import",
    "js.import",
    "shell.source",
    "python.import",
}

missing = required - kinds

if missing:
    raise SystemExit(
        "Missing expected static-flow edge types: "
        + ", ".join(sorted(missing))
    )
PY
then
  ok 'Static file-flow scan'
else
  no 'Static file-flow scan'
fi

if python3 "$ROOT/src/fileflow.py" tree \
  --root "$ROOT" \
  --entry examples/flow-demo/index.php \
  --paths root >"$TMP/tree.txt" &&
  grep -Fq '$ROOT/examples/flow-demo/app/bootstrap.php' "$TMP/tree.txt"; then
  ok 'Static hierarchy tree and root paths'
else
  no 'Static hierarchy tree and root paths'
fi

if "$ROOT/bin/traceflow" validate; then
  ok 'JSONL validation'
else
  no 'JSONL validation'
fi

trace_count="$(
  "$ROOT/bin/traceflow" list |
  sed '/^[[:space:]]*$/d' |
  wc -l |
  tr -d '[:space:]'
)"

if [[ "$trace_count" -ge 1 ]]; then
  ok 'Trace CLI list'
else
  no 'Trace CLI list'
fi

printf '\nResults: %s passed; %s failed\n' "$pass" "$fail"

[[ "$fail" -eq 0 ]]
