#!/usr/bin/env bash
set -uo pipefail
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
preflight="$script_dir/web-preflight.sh"
work="$(mktemp -d)"
runner=""
stale=""
trap '[[ -z "$runner" ]] || kill "$runner" 2>/dev/null; [[ -z "$stale" ]] || kill "$stale" 2>/dev/null; rm -rf "$work"' EXIT
mkdir -p "$work/release/server" "$work/pages"
printf entry >"$work/release/server/entry.mjs"
printf page >"$work/pages/index.astro"
cat >"$work/server.py" <<'PY'
import http.server, os
open(os.environ["PID_FILE"], "w").write(str(os.getpid()))
class H(http.server.BaseHTTPRequestHandler):
 def do_GET(self): self.send_response(500 if os.environ.get("UNHEALTHY") else 200); self.end_headers()
 def log_message(self, *args): pass
http.server.HTTPServer(("127.0.0.1", int(os.environ["PORT"])), H).serve_forever()
PY
cat >"$work/fake-node" <<'SH'
#!/usr/bin/env bash
exec python3 "$FAKE_SERVER" "$@"
SH
chmod +x "$work/fake-node"
stale_port="$(python3 - <<'PY'
import socket
with socket.socket() as sock:
 sock.bind(("127.0.0.1", 0)); print(sock.getsockname()[1])
PY
)"
python3 -m http.server "$stale_port" --bind 127.0.0.1 --directory "$work" >/dev/null 2>&1 & stale=$!
sleep 0.1
PID_FILE="$work/pid" FAKE_SERVER="$work/server.py" OVERDECK_WEB_PREFLIGHT_PORT="$stale_port" OVERDECK_WEB_NODE_BIN="$work/fake-node" "$preflight" "$work/release" "$work/pages"
rc=$?
if [[ $rc -eq 0 ]] && kill -0 "$stale" 2>/dev/null && ! kill -0 "$(<"$work/pid")" 2>/dev/null; then echo "ok   random preflight preserves stale fixed-port process and cleans owned child"; else echo "FAIL random preflight ownership" >&2; exit 1; fi
rm -f "$work/pid"
PID_FILE="$work/pid" FAKE_SERVER="$work/server.py" UNHEALTHY=1 OVERDECK_WEB_NODE_BIN="$work/fake-node" "$preflight" "$work/release" "$work/pages" >/dev/null 2>&1 & runner=$!
for _ in {1..50}; do [[ -s "$work/pid" ]] && break; sleep 0.02; done
child="$(<"$work/pid")"
kill -TERM "$runner"
wait "$runner" 2>/dev/null
runner=""
for _ in {1..50}; do kill -0 "$child" 2>/dev/null || break; sleep 0.02; done
if ! kill -0 "$child" 2>/dev/null; then echo "ok   interruption cleans only identified preflight child"; else echo "FAIL interrupted preflight leaked child" >&2; exit 1; fi
