#!/bin/bash
# Tear down E2E test artifacts:
# - Persistent test networks (from `e2e-run --keep`)
# - Interactive sessions (from `e2e-up`)
# - Orphaned test runs
#
# Usage:
#   ./bin/e2e-down           # tear down everything e2e-related
#   ./bin/e2e-down --keep    # stop containers but keep volumes
#   ./bin/e2e-down --all     # also stop module containers that compete for resources

set -e
SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$SCRIPT_DIR"

KEEP_VOLUMES=false
STOP_ALL=false
for arg in "$@"; do
  case "$arg" in
    --keep) KEEP_VOLUMES=true ;;
    --all) STOP_ALL=true ;;
  esac
done

# 1. Tear down any persistent test networks (look for marker files in common test dirs)
for dir in "$(pwd)" "$(pwd)/../../e2e" "$(pwd)/../../../e2e"; do
  MARKER="$dir/.e2e-persistent.json"
  if [ -f "$MARKER" ]; then
    PROJECT=$(bun -e "console.log(JSON.parse(require('fs').readFileSync('$MARKER', 'utf-8')).projectName)" 2>/dev/null || echo "")
    if [ -n "$PROJECT" ]; then
      echo "Tearing down persistent network: $PROJECT"
      docker compose -f docker-compose.test.yml -p "$PROJECT" down --volumes --remove-orphans 2>/dev/null || true
    fi
    rm -f "$MARKER"
  fi
done

# Also check E2E_TEST_DIR if set
if [ -n "$E2E_TEST_DIR" ] && [ -f "$E2E_TEST_DIR/.e2e-persistent.json" ]; then
  PROJECT=$(bun -e "console.log(JSON.parse(require('fs').readFileSync('$E2E_TEST_DIR/.e2e-persistent.json', 'utf-8')).projectName)" 2>/dev/null || echo "")
  if [ -n "$PROJECT" ]; then
    echo "Tearing down persistent network: $PROJECT"
    docker compose -f docker-compose.test.yml -p "$PROJECT" down --volumes --remove-orphans 2>/dev/null || true
  fi
  rm -f "$E2E_TEST_DIR/.e2e-persistent.json"
fi

# 2. Stop the interactive session (if running)
echo "Stopping interactive session..."
docker compose -p "celilo-e2e-interactive" down --remove-orphans 2>/dev/null || true

# 3. Kill ALL containers matching celilo-e2e-* (orphaned test runs)
CONTAINERS=$(docker ps -a --filter "name=celilo-e2e" --format "{{.ID}}" 2>/dev/null)
if [ -n "$CONTAINERS" ]; then
  COUNT=$(echo "$CONTAINERS" | wc -l | tr -d ' ')
  echo "Removing $COUNT orphaned e2e containers..."
  echo "$CONTAINERS" | xargs docker rm -f 2>/dev/null || true
fi

# 4. Stop module containers that compete for resources (--all flag)
if [ "$STOP_ALL" = true ]; then
  MODULE_PATTERNS="authentik- caddy- build-your-own-internet-"
  for pattern in $MODULE_PATTERNS; do
    MODULE_CONTAINERS=$(docker ps -a --filter "name=$pattern" --format "{{.ID}}" 2>/dev/null)
    if [ -n "$MODULE_CONTAINERS" ]; then
      COUNT=$(echo "$MODULE_CONTAINERS" | wc -l | tr -d ' ')
      echo "Stopping $COUNT containers matching '$pattern*'..."
      echo "$MODULE_CONTAINERS" | xargs docker rm -f 2>/dev/null || true
    fi
  done
fi

# 5. Remove all celilo-e2e networks
NETWORKS=$(docker network ls --filter "name=celilo-e2e" --format "{{.ID}}" 2>/dev/null)
if [ -n "$NETWORKS" ]; then
  echo "Removing e2e networks..."
  echo "$NETWORKS" | xargs docker network rm 2>/dev/null || true
fi

# 6. Remove volumes (unless --keep)
if [ "$KEEP_VOLUMES" = false ]; then
  VOLUMES=$(docker volume ls --filter "name=celilo-e2e" --format "{{.Name}}" 2>/dev/null)
  if [ -n "$VOLUMES" ]; then
    echo "Removing e2e volumes..."
    echo "$VOLUMES" | xargs docker volume rm 2>/dev/null || true
  fi
fi

# 7. Clean up generated compose files
rm -f docker-compose.test.yml

echo "E2E environment cleaned."
