#!/bin/bash
# Reproduction of pingdotgg/t3code#26696, adapted from the reporter's script.
# Usage: repro.sh <worktree> <port> <cli command words...>
# Runs a scratch T3 home in a new timestamped dir under /tmp/issue-lead-26696-r1/runs.
set -u
WT=$1; PORT=$2; shift 2
SRV=$WT/apps/server
RUN=/tmp/issue-lead-26696-r1/runs/$(date +%Y%m%d-%H%M%S)-$$
mkdir -p "$RUN"
H=$RUN/home; DB=$H/userdata/statev2.sqlite
unset T3CODE_HOME
cd "$SRV"
ledger() { sqlite3 "$DB" "SELECT migration_id || ' ' || name FROM effect_sql_migrations ORDER BY migration_id DESC LIMIT 2;"; }
add_migration() {
  cat > src/persistence/Migrations/073_$1.ts <<TS
import * as Effect from "effect/Effect";
import * as SqlClient from "effect/sql/SqlClient";
export default Effect.gen(function* () {
  const sql = yield* SqlClient.SqlClient;
  yield* sql\`CREATE TABLE IF NOT EXISTS repro_$1 (id INTEGER PRIMARY KEY)\`;
});
TS
  perl -0pi -e "s|(import Migration0072 from \"./Migrations/072_WaitingLinkRequestIndex.ts\";)|\$1\nimport Migration0073 from \"./Migrations/073_$1.ts\";|; s|(  \[72, \"WaitingLinkRequestIndex\", Migration0072\],)|\$1\n  [73, \"$1\", Migration0073],|" src/persistence/Migrations.ts
}
revert_migration() {
  git -C "$WT" checkout -q -- apps/server/src/persistence/Migrations.ts
  rm -f "$SRV/src/persistence/Migrations/073_$1.ts"
}
start_server() {
  node src/bin.ts serve --base-dir "$H" --host 127.0.0.1 --port $PORT --no-browser >"$1" 2>&1 &
  SERVER_PID=$!
  echo "server pid $SERVER_PID"
  for _ in $(seq 1 240); do
    grep -q "Listening on" "$1" && return 0
    kill -0 $SERVER_PID 2>/dev/null || return 1
    sleep 0.5
  done
  return 1
}
stop_server() { kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; }

echo "== commit $(git -C "$WT" rev-parse --short HEAD), home $H, cli: $*"
echo "== 1. start the server"
start_server "$RUN/server1.log" || { echo "server failed"; tail -20 "$RUN/server1.log"; exit 1; }
ledger
echo "== 2. newer CLI: same checkout plus 073_CliOnlyProbe"
add_migration CliOnlyProbe
node src/bin.ts "$@" --base-dir "$H" >"$RUN/cli.out" 2>"$RUN/cli.err"; echo "cli exit=$?"
echo "-- cli stderr (last 5):"; tail -5 "$RUN/cli.err"
echo "-- ledger:"; ledger
kill -0 $SERVER_PID 2>/dev/null && echo "server still running: yes" || echo "server still running: no"
revert_migration CliOnlyProbe
stop_server
echo "== 3. restart the unmodified server"
start_server "$RUN/server2.log" && echo started || echo "start failed"
grep -o "Database migration history diverges[^\"]*" "$RUN/server2.log" | head -1
stop_server
echo "== 4. a later build ships a different 073 (ReleasedFeature)"
add_migration ReleasedFeature
start_server "$RUN/server3.log" && echo "started ok" || echo "start failed (pid alive: no)"
grep -o "would skip required schema migrations[^\"]*" "$RUN/server3.log" | head -1 | cut -c1-200
kill -0 $SERVER_PID 2>/dev/null && stop_server
revert_migration ReleasedFeature
git -C "$WT" status --short
echo "run dir: $RUN"
