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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SEARCH_DIR="$SCRIPT_DIR"
CONFIG_PATH=""

while true; do
  CANDIDATE="$SEARCH_DIR/.clawdbot/credentials/portainer/config.json"
  if [[ -f "$CANDIDATE" ]]; then
    CONFIG_PATH="$CANDIDATE"
    break
  fi
  PARENT="$(dirname "$SEARCH_DIR")"
  if [[ "$PARENT" == "$SEARCH_DIR" ]]; then
    break
  fi
  SEARCH_DIR="$PARENT"
done

if [[ -z "$CONFIG_PATH" && -f "$HOME/.clawdbot/credentials/portainer/config.json" ]]; then
  CONFIG_PATH="$HOME/.clawdbot/credentials/portainer/config.json"
fi

err() {
  echo "Error: $*" >&2
  exit 1
}

require_cmd() {
  command -v "$1" >/dev/null 2>&1 || err "Required command not found: $1"
}

usage() {
  cat >&2 <<'EOF'
Usage: stop-stack.sh "<stack-name>"

Stops a Portainer stack by name (resolves ID automatically).
Requires config at:
  workspace .clawdbot/credentials/portainer/config.json or ~/.clawdbot/credentials/portainer/config.json
EOF
  exit 2
}

[[ $# -eq 1 ]] || usage
STACK_NAME="$1"

require_cmd curl
require_cmd jq

[[ -f "$CONFIG_PATH" ]] || err "Missing config file: $CONFIG_PATH"

BASE_URL="$(jq -r '.base_url // empty' "$CONFIG_PATH")"
API_KEY="$(jq -r '.api_key // empty' "$CONFIG_PATH")"

[[ -n "$BASE_URL" ]] || err "config.base_url is missing"
[[ -n "$API_KEY" ]] || err "config.api_key is missing"

BASE_URL="${BASE_URL%/}"

# Resolve stack ID from name
STACK_ID="$(bash "$SCRIPT_DIR/get-stack-id.sh" "$STACK_NAME")"
[[ -n "$STACK_ID" ]] || err "Failed to resolve stack ID for: $STACK_NAME"

# Get endpoint ID for the stack
STACK_INFO="$(curl -sS -w $'\n%{http_code}' \
  -H "X-API-Key: $API_KEY" \
  "$BASE_URL/api/stacks/$STACK_ID")"

http_code="$(printf '%s' "$STACK_INFO" | tail -n1)"
body="$(printf '%s' "$STACK_INFO" | sed '$d')"

if [[ "$http_code" -lt 200 || "$http_code" -ge 300 ]]; then
  msg="$(printf '%s' "$body" | jq -r '.message // empty' 2>/dev/null || true)"
  [[ -n "$msg" ]] || msg="$body"
  err "Failed to fetch stack info (HTTP $http_code): $msg"
fi

ENDPOINT_ID="$(printf '%s' "$body" | jq -r '.EndpointId')"
[[ -n "$ENDPOINT_ID" && "$ENDPOINT_ID" != "null" ]] || err "Could not determine endpoint ID for stack"

# Stop the stack
response="$(curl -sS -w $'\n%{http_code}' -X POST \
  -H "X-API-Key: $API_KEY" \
  "$BASE_URL/api/stacks/$STACK_ID/stop?endpointId=$ENDPOINT_ID")"

http_code="$(printf '%s' "$response" | tail -n1)"
body="$(printf '%s' "$response" | sed '$d')"

if [[ "$http_code" -lt 200 || "$http_code" -ge 300 ]]; then
  msg="$(printf '%s' "$body" | jq -r '.message // empty' 2>/dev/null || true)"
  [[ -n "$msg" ]] || msg="$body"
  err "Failed to stop stack (HTTP $http_code): $msg"
fi

echo "Stack '$STACK_NAME' (ID: $STACK_ID) stopped successfully"
