#!/usr/bin/env bash
# bb-status must report sandbox image tags without contacting real buildboxes.
set -u

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
STATUS="$SCRIPT_DIR/../bin/bb-status"
mkdir -p "${XDG_CACHE_HOME:-$HOME/.cache}/overdeck/tests"
ROOT="$(mktemp -d "${XDG_CACHE_HOME:-$HOME/.cache}/overdeck/tests/bb-status.XXXXXX")"
trap 'rm -rf "$ROOT"' EXIT
PASS=0
FAIL=0

ok() { printf 'PASS %s\n' "$1"; PASS=$((PASS + 1)); }
bad() { printf 'FAIL %s\n' "$1" >&2; FAIL=$((FAIL + 1)); }

make_shims() {
  local dir="$1"
  mkdir -p "$dir/bin"
  cat >"$dir/bin/node" <<'EOF'
#!/usr/bin/env bash
case "$2 ${3-} ${4-} ${5-}" in
  'hosts --order build '|'hosts --all  ')
    printf 'box-a,box-b\n' ;;
  'access box-a --path tailscale_ip') printf 'user@box-a 22 -\n' ;;
  'access box-b --path tailscale_ip') printf 'user@box-b 22 -\n' ;;
esac
EOF
  cat >"$dir/bin/ssh" <<'EOF'
#!/usr/bin/env bash
case "$*" in
  *'agent-image-tag'*)
    case "$*" in
      *box-a*)
        [ "${SSH_A_MODE:-tag}" = unreachable ] && exit 255
        [ "${SSH_A_MODE:-tag}" = missing ] && exit 1
        printf '%s\n' "${SSH_A_TAG:-image:v1}" ;;
      *box-b*)
        [ "${SSH_B_MODE:-tag}" = unreachable ] && exit 255
        [ "${SSH_B_MODE:-tag}" = missing ] && exit 1
        printf '%s\n' "${SSH_B_TAG:-image:v1}" ;;
    esac ;;
  *) : ;;
esac
EOF
  cat >"$dir/bin/gh" <<'EOF'
#!/usr/bin/env bash
exit 0
EOF
  cat >"$dir/bin/systemctl" <<'EOF'
#!/usr/bin/env bash
printf 'inactive\n'
EOF
  chmod +x "$dir/bin/"*
}

run_case() {
  local name="$1"; shift
  local dir="$ROOT/$name"
  make_shims "$dir"
  RUN_OUT="$(env PATH="$dir/bin:$PATH" BB_STATUS_NODE_BIN="$dir/bin/node" "$@" bash "$STATUS" 2>&1)"
  RUN_RC=$?
}

assert_output() {
  local needle="$1"
  [[ "$RUN_OUT" == *"$needle"* ]]
}

case_converged() {
  run_case converged
  [ "$RUN_RC" = 0 ] &&
    assert_output 'images: converged (image:v1)' &&
    assert_output 'box-a image: image:v1' &&
    assert_output 'box-b image: image:v1'
}

case_skewed() {
  run_case skewed SSH_B_TAG=image:v2
  [ "$RUN_RC" = 0 ] &&
    assert_output 'images: SKEWED' &&
    assert_output 'box-a image: image:v1' &&
    assert_output 'box-b image: image:v2'
}

case_unreachable_is_unknown() {
  run_case unreachable SSH_B_MODE=unreachable
  [ "$RUN_RC" = 0 ] &&
    assert_output 'images: SKEWED' &&
    assert_output 'box-b image: unknown'
}

case_missing_tag_is_unknown() {
  run_case missing-tag SSH_A_MODE=missing
  [ "$RUN_RC" = 0 ] &&
    assert_output 'images: SKEWED' &&
    assert_output 'box-a image: unknown'
}

case_default_node_bypasses_path_shim() {
  local dir="$ROOT/default-node"
  make_shims "$dir"
  cat >"$dir/bin/node" <<'EOF'
#!/usr/bin/env bash
echo 'PATH node must not be used' >&2
exit 91
EOF
  chmod +x "$dir/bin/node"
  cat >"$dir/registry.json" <<'EOF'
{
  "schema_version": 1,
  "hosts": [
    {
      "name": "box-a",
      "ssh_alias": "box-a",
      "state": "reachable",
      "machine_id": null,
      "roles": ["builder"],
      "access": {
        "lan": {"host":"192.0.2.10","port":22,"user":"user","identity_file":null},
        "tailscale_ip": {"host":"100.64.0.10","port":22,"user":"user","identity_file":null},
        "tailscale_ssh": {"host":"box-a.example.ts.net","port":22,"user":"user","identity_file":null}
      },
      "rustdesk": null,
      "notes": "fixture"
    }
  ],
  "orders": {"build":["box-a"]}
}
EOF
  RUN_OUT="$(env PATH="$dir/bin:$PATH" BUILDBOX_HOSTS_CONFIG="$dir/registry.json" BB_REPO=invalid/invalid bash "$STATUS" 2>&1)"
  RUN_RC=$?
  [ "$RUN_RC" = 0 ] &&
    [[ "$RUN_OUT" != *'PATH node must not be used'* ]] &&
    [[ "$RUN_OUT" != *'remote-only dispatch failed'* ]] &&
    assert_output '== box-a offload jobs (rb-*) =='
}

for case_name in converged skewed unreachable_is_unknown missing_tag_is_unknown default_node_bypasses_path_shim; do
  if "case_$case_name"; then ok "$case_name"; else bad "$case_name"; fi
done

printf '%s passed, %s failed\n' "$PASS" "$FAIL"
[ "$FAIL" = 0 ]
