#!/usr/bin/env bash
# Extra experiment after a successful upstream quickstart. No source patches.
# Usage: bash open-scion-concurrent-land.sh /path/to/quickstart-workdir
set -euo pipefail
work="$(cd "$1" && pwd)"
server_pid=""
cleanup() {
  if [ -n "$server_pid" ]; then
    kill "$server_pid" 2>/dev/null || true
    wait "$server_pid" 2>/dev/null || true
  fi
}
trap cleanup EXIT

"$work/bin/gitaly" serve "$work/config.toml" > "$work/concurrent-server.log" 2>&1 &
server_pid=$!
export GRAFT_ADDRESS="unix:$work/run/gitaly.sock"
export GRAFT_STORAGE=default
as_agent() {
  local agent="$1"; shift
  GRAFT_TOKEN="$(cat "$work/tokens/$agent")" \
    GRAFT_USER="$agent" \
    GRAFT_AUTHOR="$agent <$agent@example.com>" "$@"
}

# A real clone RPC, rather than only socket existence, verifies readiness.
# Each attempt uses a new destination; failed pre-ready calls can leave it empty.
[ ! -e "$work/release-land" ] && [ ! -e "$work/ready-planner" ] && [ ! -e "$work/ready-builder" ]
[ ! -e "$work/concurrent-planner" ] && [ ! -e "$work/concurrent-builder" ]
ready=false
for attempt in $(seq 50); do
  kill -0 "$server_pid"
  if as_agent planner "$work/bin/graft" clone "$GRAFT_ADDRESS" demo.git "$work/readiness-$attempt" --branch feature/demo > "$work/readiness.log" 2>&1; then
    mv "$work/readiness-$attempt" "$work/concurrent-planner"
    cat "$work/readiness.log"
    ready=true
    break
  fi
  sleep 0.2
done
[ "$ready" = true ] || { cat "$work/readiness.log"; exit 1; }
as_agent builder "$work/bin/graft" clone "$GRAFT_ADDRESS" demo.git "$work/concurrent-builder" --branch feature/demo
printf 'from planner\n' > "$work/concurrent-planner/planner.txt"
printf 'from builder\n' > "$work/concurrent-builder/builder.txt"

# Both separate client processes wait on the same release file.
for agent in planner builder; do
  (
    cd "$work/concurrent-$agent"
    touch "$work/ready-$agent"
    while [ ! -f "$work/release-land" ]; do sleep 0.02; done
    as_agent "$agent" "$work/bin/graft" commit -m "Concurrent $agent file" --land feature/demo
  ) > "$work/concurrent-$agent.log" 2>&1 &
  if [ "$agent" = planner ]; then planner_pid=$!; else builder_pid=$!; fi
done
for _ in $(seq 100); do
  [ ! -f "$work/ready-planner" ] || [ ! -f "$work/ready-builder" ] || break
  sleep 0.02
done
[ -f "$work/ready-planner" ] && [ -f "$work/ready-builder" ]
touch "$work/release-land"
wait "$planner_pid"
wait "$builder_pid"
cat "$work/concurrent-planner.log" "$work/concurrent-builder.log"

cd "$work/concurrent-planner"
planner="$(as_agent planner "$work/bin/graft" cat feature/demo:planner.txt)"
builder="$(as_agent planner "$work/bin/graft" cat feature/demo:builder.txt)"
[ "$planner" = 'from planner' ]
[ "$builder" = 'from builder' ]
printf 'planner.txt: %s\nbuilder.txt: %s\nConcurrent land read-back checks passed.\n' "$planner" "$builder"
as_agent planner "$work/bin/graft" log --json
