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

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SCRIPT="$ROOT/scripts/migrate-unified-runtime-volume.sh"
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT

source_root="$TMP/source"
target_root="$TMP/target"
mkdir -p "$source_root/meshx/ags-repos/example.git" "$source_root/meshx/automation-blobs" "$target_root"
git init --bare -q "$source_root/meshx/ags-repos/example.git"
printf 'payload\n' > "$source_root/meshx/automation-blobs/blob"

"$SCRIPT" --expected-repositories 1 copy "$source_root" "$target_root" >/dev/null
"$SCRIPT" --expected-repositories 1 verify "$source_root" "$target_root" >/dev/null
"$SCRIPT" --expected-repositories 1 copy "$source_root" "$target_root" >/dev/null

printf 'changed\n' > "$target_root/meshx/automation-blobs/blob"
if "$SCRIPT" --expected-repositories 1 verify "$source_root" "$target_root" >/dev/null 2>&1; then
  echo "expected verify to reject changed payload" >&2
  exit 1
fi
if "$SCRIPT" --expected-repositories 1 copy "$source_root" "$target_root" >/dev/null 2>&1; then
  echo "expected copy to reject a non-empty target" >&2
  exit 1
fi

empty_source="$TMP/empty-source"
empty_target="$TMP/empty-target"
mkdir -p "$empty_source/meshx/ags-repos" "$empty_target"
if "$SCRIPT" verify "$empty_source" "$empty_target" >/dev/null 2>&1; then
  echo "expected verify to reject an empty source by default" >&2
  exit 1
fi
"$SCRIPT" --allow-empty copy "$empty_source" "$empty_target" >/dev/null
"$SCRIPT" --allow-empty verify "$empty_source" "$empty_target" >/dev/null

missing_source="$TMP/missing-source"
missing_target="$TMP/missing-target"
mkdir -p "$missing_source" "$missing_target"
if "$SCRIPT" --allow-empty verify "$missing_source" "$missing_target" >/dev/null 2>&1; then
  echo "expected verify to reject a source without the AGS marker directory" >&2
  exit 1
fi

retry_source="$TMP/retry-source"
retry_target="$TMP/retry-target"
fake_bin="$TMP/fake-bin"
mkdir -p "$retry_source/meshx/ags-repos/example.git" "$retry_source/meshx/automation-blobs" "$retry_target" "$fake_bin"
git init --bare -q "$retry_source/meshx/ags-repos/example.git"
printf 'retry\n' > "$retry_source/meshx/automation-blobs/blob"
cat > "$fake_bin/cp" <<'EOF'
#!/usr/bin/env bash
exit 1
EOF
chmod +x "$fake_bin/cp"
if PATH="$fake_bin:$PATH" "$SCRIPT" --expected-repositories 1 copy "$retry_source" "$retry_target" >/dev/null 2>&1; then
  echo "expected injected copy failure" >&2
  exit 1
fi
if find "$retry_target" -name '.unified-volume-stage-*' -print -quit | grep -q .; then
  echo "copy failure left staging data behind" >&2
  exit 1
fi
"$SCRIPT" --expected-repositories 1 copy "$retry_source" "$retry_target" >/dev/null
"$SCRIPT" --expected-repositories 1 verify "$retry_source" "$retry_target" >/dev/null

partial_retry_source="$TMP/partial-retry-source"
partial_retry_target="$TMP/partial-retry-target"
partial_fake_bin="$TMP/partial-fake-bin"
partial_cp_count="$TMP/partial-cp-count"
real_cp="$(command -v cp)"
mkdir -p "$partial_retry_source/meshx/ags-repos/example.git" "$partial_retry_source/meshx/automation-blobs" "$partial_retry_target" "$partial_fake_bin"
git init --bare -q "$partial_retry_source/meshx/ags-repos/example.git"
printf 'second-copy\n' > "$partial_retry_source/meshx/automation-blobs/blob"
cat > "$partial_fake_bin/cp" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
count=0
[[ ! -f "$INJECT_CP_COUNT" ]] || count="$(cat "$INJECT_CP_COUNT")"
count=$((count + 1))
printf '%s\n' "$count" > "$INJECT_CP_COUNT"
if [[ "$count" -eq 2 ]]; then
  exit 1
fi
exec "$REAL_CP" "$@"
EOF
chmod +x "$partial_fake_bin/cp"
if INJECT_CP_COUNT="$partial_cp_count" REAL_CP="$real_cp" PATH="$partial_fake_bin:$PATH" \
  "$SCRIPT" --expected-repositories 1 copy "$partial_retry_source" "$partial_retry_target" >/dev/null 2>&1; then
  echo "expected injected second-subtree copy failure" >&2
  exit 1
fi
if find "$partial_retry_target" -mindepth 1 -print -quit | grep -q .; then
  echo "second-subtree copy failure changed the formal target or left staging behind" >&2
  exit 1
fi
"$SCRIPT" --expected-repositories 1 copy "$partial_retry_source" "$partial_retry_target" >/dev/null
"$SCRIPT" --expected-repositories 1 verify "$partial_retry_source" "$partial_retry_target" >/dev/null

mismatch_source="$TMP/mismatch-source"
mismatch_target="$TMP/mismatch-target"
mkdir -p "$mismatch_source/meshx/ags-repos/example.git" "$mismatch_source/meshx/automation-blobs" "$mismatch_target"
git init --bare -q "$mismatch_source/meshx/ags-repos/example.git"
printf 'inventory\n' > "$mismatch_source/meshx/automation-blobs/blob"
if "$SCRIPT" --expected-repositories 2 copy "$mismatch_source" "$mismatch_target" >/dev/null 2>&1; then
  echo "expected repository count mismatch" >&2
  exit 1
fi
if find "$mismatch_target" -mindepth 1 -print -quit | grep -q .; then
  echo "expected mismatch changed the target before validation" >&2
  exit 1
fi
"$SCRIPT" --expected-repositories 1 copy "$mismatch_source" "$mismatch_target" >/dev/null
"$SCRIPT" --expected-repositories 1 verify "$mismatch_source" "$mismatch_target" >/dev/null

echo "Unified runtime volume migration tests passed."
