#!/usr/bin/env bash
# resolve-slot-ports.sh — bash-compat wrapper over resolve-slot-ports.mjs
#
# The orchestrator's pool JSON is authoritative when a slot repo matches; otherwise
# fall back to the local-extension-N formula (6660+N / 9010+N).
#
# Usage:
#   . resolve-slot-ports.sh
#   resolve_extension_runtime_ports /path/to/metamask-extension-N
#     -> prints CDP_PORT=... WATCHER_PORT=... SLOT_ID=... lines

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
_RESOLVE_PORTS_MJS="$SCRIPT_DIR/resolve-slot-ports.mjs"

_resolve_ports_cli() {
  node "$_RESOLVE_PORTS_MJS" "$1" "${2:-.}"
}

resolve_slot_ports_by_repo() {
  _resolve_ports_cli resolve_slot_ports_by_repo "$1"
}

# Back-compat alias for the previous function name (one release).
resolve_farmslot_ports_by_repo() {
  resolve_slot_ports_by_repo "$1"
}

infer_extension_slot_suffix() {
  local repo="$1" base
  base="$(basename "$repo")"
  if [[ "$base" =~ -([0-9]+)$ ]]; then
    printf '%s' "${BASH_REMATCH[1]}"
    return 0
  fi
  return 1
}

resolve_default_extension_ports() {
  _resolve_ports_cli resolve_default_extension_ports "$1"
}

resolve_extension_runtime_ports() {
  _resolve_ports_cli resolve_extension_runtime_ports "${1:-.}"
}

resolve_extension_slot_ports() {
  _resolve_ports_cli resolve_extension_slot_ports "${1:-.}"
}

# Apply the checkout-scoped extension port ladder (context → pool → formula).
apply_extension_slot_ports() {
  local repo="${1:-.}" line key val resolved="" ctx_file="" runtime_rel="${RECIPE_RUNTIME_DIR:-temp/recipe/runtime}"
  repo="$(cd "$repo" && pwd)"
  ctx_file="$repo/$runtime_rel/agentic-runtime.json"
  if [ -z "${RECIPE_RUNTIME_CONTEXT:-}" ] && [ -f "$ctx_file" ]; then
    RECIPE_RUNTIME_CONTEXT="$ctx_file"
  fi
  export RECIPE_RUNTIME_CONTEXT
  # Context/pool are authoritative checkout identity. Formula ports are only
  # fallback values and must not replace explicitly supplied env ports.
  resolved="$(_resolve_ports_cli resolve_extension_identity_ports "$repo" 2>/dev/null)" || resolved=""
  while IFS= read -r line; do
    [ -n "$line" ] || continue
    key="${line%%=*}"
    val="${line#*=}"
    case "$key" in
      CDP_PORT) CDP_PORT="$val" ;;
      WATCHER_PORT) WATCHER_PORT="$val" ;;
      SLOT_ID) RECIPE_SLOT_ID="$val" ;;
    esac
  done <<< "$resolved"
  resolved="$(_resolve_ports_cli resolve_default_extension_ports "$repo" 2>/dev/null)" || return 0
  while IFS= read -r line; do
    [ -n "$line" ] || continue
    key="${line%%=*}"
    val="${line#*=}"
    case "$key" in
      CDP_PORT) [ -n "${CDP_PORT:-}" ] || CDP_PORT="$val" ;;
      WATCHER_PORT) [ -n "${WATCHER_PORT:-}" ] || WATCHER_PORT="$val" ;;
      SLOT_ID) [ -n "${RECIPE_SLOT_ID:-}" ] || RECIPE_SLOT_ID="$val" ;;
    esac
  done <<< "$resolved"
}

apply_resolved_extension_ports() {
  apply_extension_slot_ports "$@"
}

resolve_mobile_slot_defaults() {
  _resolve_ports_cli resolve_mobile_slot_defaults "$1"
}

resolve_mobile_runtime_context() {
  _resolve_ports_cli resolve_mobile_runtime_context "$1"
}

resolve_mobile_runtime_ports() {
  _resolve_ports_cli resolve_mobile_runtime_ports "${1:-.}"
}

apply_resolved_mobile_ports() {
  local repo="${1:-.}" line key val from_pool=false resolved=""
  if resolved="$(_resolve_ports_cli resolve_slot_ports_by_repo "$repo" 2>/dev/null)"; then
    from_pool=true
  elif resolved="$(_resolve_ports_cli resolve_mobile_slot_defaults "$repo" 2>/dev/null)"; then
    from_pool=false
  else
    return 0
  fi
  while IFS= read -r line; do
    [ -n "$line" ] || continue
    key="${line%%=*}"
    val="${line#*=}"
    case "$key" in
      WATCHER_PORT)
        if [ "$from_pool" = true ] || [ -z "${WATCHER_PORT:-}" ]; then WATCHER_PORT="$val"; fi
        ;;
      IOS_SIMULATOR)
        if [ "$from_pool" = true ] || [ -z "${IOS_SIMULATOR:-}" ]; then IOS_SIMULATOR="$val"; fi
        ;;
      SIM_UDID)
        if [ "$from_pool" = true ] || [ -z "${SIM_UDID:-}" ]; then SIM_UDID="$val"; fi
        ;;
      SLOT_ID)
        if [ "$from_pool" = true ] || [ -z "${RECIPE_SLOT_ID:-}" ]; then RECIPE_SLOT_ID="$val"; fi
        ;;
    esac
  done <<< "$resolved"
}
