#!/usr/bin/env bash
# lifecycle-delete-and-count: delete tenant → A's placement gone, peer intact,
# and db_pool.tenant_count matches remaining non-deleting occupancy (refill
# may replace the slot, so the counter need not strictly decrease).
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
# shellcheck source=../lib.sh
source "$SCRIPT_DIR/lib.sh"

DELETE_SETTLE_S="${DELETE_SETTLE_S:-60}"

require_base
require_cmds curl jq

print_env_banner "case: lifecycle-delete-and-count"

step "provision" "tenants A and B"
if ! A_LINE="$(provision_tenant)"; then fail "provision A"; summary; exit 1; fi
A_TENANT="${A_LINE%%$'\t'*}"; A_KEY="${A_LINE#*$'\t'}"
if ! B_LINE="$(provision_tenant)"; then fail "provision B"; summary; exit 1; fi
B_TENANT="${B_LINE%%$'\t'*}"; B_KEY="${B_LINE#*$'\t'}"
ok "A=$A_TENANT B=$B_TENANT"

A_DB=""
if meta_available; then
  A_DB="$(meta_db_id "$A_TENANT")"
  info "A db_id=$A_DB tenant_count=$(meta_tenant_count "$A_DB") occupancy=$(meta_pool_occupancy "$A_DB")"
else
  skip_check "meta unavailable for count baseline"
fi

step "delete" "tenant A"
line="$(http_json DELETE /v1/tenant "$A_KEY" '{}')"
code="${line%%$'\t'*}"
if [ "$code" = "202" ] || [ "$code" = "200" ]; then
  ok "DELETE /v1/tenant A http=$code"
else
  fail "DELETE A http=$code ${line#*$'\t'}"
fi

line="$(http_json GET /v1/status "$A_KEY")"
code="${line%%$'\t'*}"
if [ "$code" = "401" ] || [ "$code" = "403" ]; then
  ok "A key revoked http=$code"
else
  fail "A key still usable http=$code"
fi

line="$(http_json GET /v1/status "$B_KEY")"
code="${line%%$'\t'*}"; body="${line#*$'\t'}"
check_eq "B still active HTTP" "$code" "200"
check_eq "B status active" "$(json_field "$body" status)" "active"

if meta_available && [ -n "$A_DB" ]; then
  deadline=$(($(date +%s) + DELETE_SETTLE_S))
  last_status="missing"
  while :; do
    last_status="$(meta_placement_status "$A_TENANT")"
    if [ -z "$last_status" ]; then
      ok "A placement removed"
      break
    fi
    info "A placement status=$last_status"
    if [ "$(date +%s)" -ge "$deadline" ]; then
      fail "A placement still present after ${DELETE_SETTLE_S}s (status=$last_status)"
      break
    fi
    sleep "$POLL_INTERVAL_S"
  done

  COUNT_OCC="$(meta_pool_count_and_occupancy "$A_DB")"
  COUNT_AFTER="$(printf '%s' "$COUNT_OCC" | awk '{print $1}')"
  OCCUPANCY="$(printf '%s' "$COUNT_OCC" | awk '{print $2}')"
  info "after delete: tenant_count=$COUNT_AFTER occupancy=$OCCUPANCY"
  if [ -n "$COUNT_AFTER" ] && [ -n "$OCCUPANCY" ] && [ "$COUNT_AFTER" -eq "$OCCUPANCY" ]; then
    ok "tenant_count matches occupancy ($COUNT_AFTER)"
  else
    fail "tenant_count=$COUNT_AFTER occupancy=$OCCUPANCY (want equal remaining non-deleting placements)"
  fi
fi

delete_tenant "$B_KEY"
summary
exit $?
