#!/usr/bin/env bash
# Shared shell helpers for builder lifecycle scripts.

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/state-paths.sh"

builder_require_file() {
  local path="$1"
  if [ ! -f "$path" ]; then
    echo "Missing required file: $path" >&2
    return 1
  fi
}

builder_json_first_nonempty() {
  local path="$1"
  shift
  python3 - <<'PY' "$path" "$@"
import json, sys
from pathlib import Path
path = Path(sys.argv[1])
keys = sys.argv[2:]
if not path.exists():
    print("")
    raise SystemExit(0)
payload = json.loads(path.read_text()) if path.read_text().strip() else {}
if not isinstance(payload, dict):
    print("")
    raise SystemExit(0)
for key in keys:
    value = payload.get(key)
    if value not in (None, ""):
        print(value)
        raise SystemExit(0)
print("")
PY
}

builder_json_get() {
  local path="$1"
  local key="$2"
  python3 - <<'PY' "$path" "$key"
import json, sys
from pathlib import Path
path = Path(sys.argv[1])
key = sys.argv[2]
if not path.exists():
    raise SystemExit(1)
payload = json.loads(path.read_text())
value = payload[key]
if isinstance(value, (dict, list)):
    print(json.dumps(value))
else:
    print(value)
PY
}

builder_current_host() {
  builder_json_first_nonempty "$TOTALLY_SPIES_BUILDER_HOST_STATE_FILE" server_host server_ip
}

builder_current_server_number() {
  builder_json_first_nonempty "$TOTALLY_SPIES_BUILDER_HOST_STATE_FILE" server_number
}

builder_format_ssh_target() {
  local user="$1"
  local host="$2"
  printf '%s@%s\n' "$user" "$host"
}

builder_format_scp_target() {
  local user="$1"
  local host="$2"
  local remote_path="$3"
  if [[ "$host" == *:* ]]; then
    printf '%s@[%s]:%s\n' "$user" "$host" "$remote_path"
  else
    printf '%s@%s:%s\n' "$user" "$host" "$remote_path"
  fi
}

builder_fill_ssh_opts() {
  local host="$1"
  local ssh_key="${SSH_KEY:-$HOME/.ssh/id_ed25519}"
  BUILDER_SSH_OPTS=(
    -F /dev/null
    -i "$ssh_key"
    -o BatchMode=yes
    -o ConnectTimeout="${SSH_CONNECT_TIMEOUT:-10}"
    -o StrictHostKeyChecking=no
    -o UserKnownHostsFile=/dev/null
    -o LogLevel=ERROR
  )
  if [[ "$host" == *:* ]]; then
    BUILDER_SSH_OPTS=(-6 "${BUILDER_SSH_OPTS[@]}")
  fi
}

builder_fill_scp_opts() {
  local host="$1"
  local ssh_key="${SSH_KEY:-$HOME/.ssh/id_ed25519}"
  BUILDER_SCP_OPTS=(
    -F /dev/null
    -i "$ssh_key"
    -o BatchMode=yes
    -o ConnectTimeout="${SSH_CONNECT_TIMEOUT:-10}"
    -o StrictHostKeyChecking=no
    -o UserKnownHostsFile=/dev/null
    -o LogLevel=ERROR
  )
  if [[ "$host" == *:* ]]; then
    BUILDER_SCP_OPTS=(-6 "${BUILDER_SCP_OPTS[@]}")
  fi
}

builder_ssh() {
  local user="$1"
  local host="$2"
  shift 2
  builder_fill_ssh_opts "$host"
  ssh "${BUILDER_SSH_OPTS[@]}" "$(builder_format_ssh_target "$user" "$host")" "$@"
}

builder_scp_to() {
  local local_path="$1"
  local user="$2"
  local host="$3"
  local remote_path="$4"
  builder_fill_scp_opts "$host"
  scp "${BUILDER_SCP_OPTS[@]}" "$local_path" "$(builder_format_scp_target "$user" "$host" "$remote_path")"
}

builder_wait_for_ssh() {
  local host="$1"
  local user="${2:-root}"
  local attempts="${3:-40}"
  local delay="${4:-5}"
  local i
  for i in $(seq 1 "$attempts"); do
    if builder_ssh "$user" "$host" true >/dev/null 2>&1; then
      return 0
    fi
    sleep "$delay"
  done
  return 1
}
