#!/usr/bin/env bash
# One typed readiness pass across the owner-facing Overdeck services.
set -uo pipefail

DEPLOY="${OVERDECK_DEPLOY_DIR:-$HOME/.local/share/overdeck/deploy}"
TOKEN_FILE="${OVERDECK_READINESS_TOKEN_FILE:-$HOME/.config/overdeck/token}"
COLLECTOR_URL="${OVERDECK_READINESS_COLLECTOR_URL:-http://127.0.0.1:31338/health}"
CONTROLLER_URL="${OVERDECK_READINESS_CONTROLLER_URL:-http://127.0.0.1:8787/health}"
BOTMASTER_URL="${OVERDECK_READINESS_BOTMASTER_URL:-http://127.0.0.1:31340/api/bots?limit=1}"
WEB_WATCHDOG="${OVERDECK_READINESS_WEB_WATCHDOG:-$DEPLOY/packaging/web-watchdog.sh}"
CURL_TIMEOUT="${OVERDECK_READINESS_CURL_TIMEOUT:-5}"

work=$(mktemp -d "${TMPDIR:-/tmp}/overdeck-readiness.XXXXXX") || exit 2
trap 'rm -rf "$work"' EXIT
failures=()
ready=()

typed_json() {
  local name=$1 url=$2 kind=$3 auth=$4 body="$work/$1.body" error="$work/$1.error" code rc=0
  local -a args=(--silent --show-error --output "$body" --write-out '%{http_code}'
    --connect-timeout "$CURL_TIMEOUT" --max-time "$CURL_TIMEOUT" --max-filesize 1048576)
  if [[ "$auth" == yes ]]; then
    if [[ -z "${readiness_token:-}" ]]; then
      failures+=("$name=token-unavailable")
      return 1
    fi
    args+=(--header "Authorization: Bearer ${readiness_token}")
  fi
  code=$(curl "${args[@]}" "$url" 2>"$error") || rc=$?
  if (( rc != 0 )); then
    failures+=("$name=transport(rc=$rc)")
    return 1
  fi
  if [[ "$code" != 200 ]]; then
    failures+=("$name=http-$code")
    return 1
  fi
  if ! python3 - "$kind" "$body" <<'PY'
import json
import sys
kind, path = sys.argv[1:]
try:
    with open(path, "rb") as stream:
        value = json.load(stream)
except Exception:
    raise SystemExit(1)
if kind == "ok-object":
    good = isinstance(value, dict) and value.get("ok") is True
elif kind == "array":
    good = isinstance(value, list)
else:
    good = False
raise SystemExit(0 if good else 1)
PY
  then
    failures+=("$name=wrong-json-type")
    return 1
  fi
  ready+=("$name=ready")
}

readiness_token=""
if [[ -r "$TOKEN_FILE" ]]; then
  readiness_token=$(<"$TOKEN_FILE")
fi

typed_json collector "$COLLECTOR_URL" ok-object yes || true
typed_json controller "$CONTROLLER_URL" ok-object yes || true
typed_json botmaster "$BOTMASTER_URL" array no || true
web_output=$(OVERDECK_WEB_URL="${OVERDECK_READINESS_WEB_URL:-http://127.0.0.1:31337}" \
  OVERDECK_WEB_PAGES_DIR="${OVERDECK_READINESS_WEB_PAGES_DIR:-$DEPLOY/apps/web/src/pages}" \
  bash "$WEB_WATCHDOG" sweep 2>&1)
web_rc=$?
if (( web_rc == 0 )); then
  ready+=(web=ready)
else
  web_output=$(printf '%s' "$web_output" | tail -c 160 | tr '\n' ' ')
  failures+=("web=failed(rc=$web_rc${web_output:+,$web_output})")
fi

if (( ${#failures[@]} == 0 )); then
  printf 'readiness: %s\n' "${ready[*]}"
  exit 0
fi
printf 'readiness: %s; waiting: %s\n' "${ready[*]:-none}" "${failures[*]}" >&2
exit 1
