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

if [ -z "${1:-}" ] || [ -z "${2:-}" ]; then
  echo "Usage: $0 <env> <providerId>"
  echo "  env: localhost | sandbox | staging"
  exit 1
fi

ENV="$1"
PROVIDER_ID="$2"

case "$ENV" in
  localhost) BASE_URL="http://localhost:8314" ;;
  sandbox)   BASE_URL="https://gateway.sandbox.netfoundry.io" ;;
  staging)   BASE_URL="https://gateway.staging.netfoundry.io" ;;
  *)
    echo "Unknown env '$ENV'. Must be one of: localhost, sandbox, staging" >&2
    exit 1
    ;;
esac

if [ -z "${TOKEN:-}" ]; then
  echo "TOKEN environment variable is not set. Export a valid JWT as TOKEN before running this script." >&2
  exit 1
fi

echo "Target: $ENV ($BASE_URL)"

api() {
  local method="$1" path="$2"
  shift 2
  curl -sf -X "$method" "$BASE_URL$path" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    -H "Accept: application/hal+json" \
    "$@"
}

# Extract id<TAB>name pairs from a paged HAL response
extract_id_names() {
  jq -r '._embedded // {} | to_entries[0].value // [] | .[] | "\(.id)\t\(.name // "")"'
}

# List id<TAB>name pairs from a paged endpoint. Logs a warning and returns empty
# on failure so teardown continues when upstream dependencies (e.g. Ziti) are down.
list_ids() {
  local path="$1" label="$2"
  local body
  if ! body=$(api GET "$path" 2>/dev/null); then
    echo "    WARN: failed to list $label; skipping" >&2
    return 0
  fi
  echo "$body" | extract_id_names
}

# --- Fetch provider (tolerate missing or unreachable) ---
if PROVIDER_BODY=$(api GET "/providers/$PROVIDER_ID" 2>/dev/null); then
  PROVIDER_NAME=$(echo "$PROVIDER_BODY" | jq -r '.name // ""')
else
  PROVIDER_NAME=""
  echo "WARN: could not fetch provider $PROVIDER_ID; continuing with cleanup anyway" >&2
fi
echo "Provider '$PROVIDER_NAME': $PROVIDER_ID"

# --- Delete connections ---
echo "  Deleting connections..."
CONNECTIONS=$(list_ids "/providers/$PROVIDER_ID/connections?size=1000" "connections")
while IFS=$'\t' read -r id name; do
  [ -z "$id" ] && continue
  api DELETE "/providers/$PROVIDER_ID/connections/$id" >/dev/null 2>&1 \
    && echo "    Deleted connection '$name' ($id)" \
    || echo "    WARN: failed to delete connection '$name' ($id)" >&2
done <<< "$CONNECTIONS"

# --- Find connectors for this provider ---
CONNECTORS=$(list_ids "/connectors?providerId=$PROVIDER_ID&size=1000" "connectors")

# --- Delete applications (nested under connectors) ---
echo "  Deleting applications..."
while IFS=$'\t' read -r CONNECTOR_ID CONNECTOR_NAME; do
  [ -z "$CONNECTOR_ID" ] && continue
  APPS=$(list_ids "/connectors/$CONNECTOR_ID/applications?size=1000" "applications for connector $CONNECTOR_ID")
  while IFS=$'\t' read -r id name; do
    [ -z "$id" ] && continue
    api DELETE "/connectors/$CONNECTOR_ID/applications/$id" >/dev/null 2>&1 \
      && echo "    Deleted application '$name' ($id) (connector '$CONNECTOR_NAME')" \
      || echo "    WARN: failed to delete application '$name' ($id)" >&2
  done <<< "$APPS"
done <<< "$CONNECTORS"

# --- Delete connectors ---
echo "  Deleting connectors..."
while IFS=$'\t' read -r id name; do
  [ -z "$id" ] && continue
  api DELETE "/connectors/$id" >/dev/null 2>&1 \
    && echo "    Deleted connector '$name' ($id)" \
    || echo "    WARN: failed to delete connector '$name' ($id)" >&2
done <<< "$CONNECTORS"

# --- Delete locations ---
echo "  Deleting locations..."
LOCATIONS=$(list_ids "/locations?providerId=$PROVIDER_ID&size=1000" "locations")
while IFS=$'\t' read -r id name; do
  [ -z "$id" ] && continue
  api DELETE "/locations/$id" >/dev/null 2>&1 \
    && echo "    Deleted location '$name' ($id)" \
    || echo "    WARN: failed to delete location '$name' ($id)" >&2
done <<< "$LOCATIONS"

# --- Delete connector models ---
echo "  Deleting connector models..."
CONNECTOR_MODELS=$(list_ids "/connector-models?providerId=$PROVIDER_ID&size=1000" "connector models")
while IFS=$'\t' read -r id name; do
  [ -z "$id" ] && continue
  api DELETE "/connector-models/$id" >/dev/null 2>&1 \
    && echo "    Deleted connector model '$name' ($id)" \
    || echo "    WARN: failed to delete connector model '$name' ($id)" >&2
done <<< "$CONNECTOR_MODELS"

# --- Delete customers (with per-customer branding) ---
echo "  Deleting customers..."
CUSTOMERS=$(list_ids "/customers?providerId=$PROVIDER_ID&size=1000" "customers")
while IFS=$'\t' read -r id name; do
  [ -z "$id" ] && continue
  if api DELETE "/customers/$id/branding" >/dev/null 2>&1; then
    echo "    Deleted branding for customer '$name' ($id)"
  fi
  api DELETE "/customers/$id" >/dev/null 2>&1 \
    && echo "    Deleted customer '$name' ($id)" \
    || echo "    WARN: failed to delete customer '$name' ($id)" >&2
done <<< "$CUSTOMERS"

# --- Delete provider resources ---
echo "  Deleting resources..."
RESOURCES=$(list_ids "/providers/$PROVIDER_ID/resources?size=1000" "resources")
while IFS=$'\t' read -r id name; do
  [ -z "$id" ] && continue
  api DELETE "/providers/$PROVIDER_ID/resources/$id" >/dev/null 2>&1 \
    && echo "    Deleted resource '$name' ($id)" \
    || echo "    WARN: failed to delete resource '$name' ($id)" >&2
done <<< "$RESOURCES"

# --- Delete provider branding ---
echo "  Deleting provider branding..."
if api DELETE "/providers/$PROVIDER_ID/branding" >/dev/null 2>&1; then
  echo "    Deleted branding for provider '$PROVIDER_NAME' ($PROVIDER_ID)"
fi

# --- Delete provider ---
echo "  Deleting provider..."
api DELETE "/providers/$PROVIDER_ID" >/dev/null 2>&1 \
  && echo "    Deleted provider '$PROVIDER_NAME' ($PROVIDER_ID)" \
  || echo "    WARN: failed to delete provider '$PROVIDER_NAME' ($PROVIDER_ID)" >&2

echo ""
echo "Teardown complete for provider $PROVIDER_ID."
