#!/bin/bash

set -euo pipefail

TESTNAME="all"
EXIT_WAIT_TIMEOUT=30

show_help() {
	echo "Usage: $0 [OPTIONS]"
	echo "OPTIONS:"
	echo "  --help                                         Display this message"
	echo "  --test <all/with_tidb/upgrade/replication/cdc> Set the name of test case to stop"
}

while [[ $# -gt 0 ]]; do
	case "$1" in
	--test)
		TESTNAME="$2"
		shift
		;;
	--help)
		show_help
		exit 0
		;;
	*)
		show_help
		exit 1
		;;
	esac
	shift
done

stop() {
	if ! docker stop "$1"; then
		echo "docker stop failed for $1; waiting for the delayed exit event" >&2
		if timeout "${EXIT_WAIT_TIMEOUT}s" docker wait "$1" >/dev/null; then
			:
		else
			wait_status=$?
			if [ "$wait_status" -eq 124 ]; then
				echo "container $1 did not exit within ${EXIT_WAIT_TIMEOUT}s" >&2
			else
				echo "docker wait failed for $1 with status $wait_status" >&2
			fi
			return 1
		fi
	fi

	docker rm "$1"
}

CONTAINERS=$(docker ps -aq --filter name=\^random-"$TESTNAME"-)

declare -a STOP_PIDS=()
for container in $CONTAINERS; do
	stop "$container" &
	STOP_PIDS+=("$!")
done

STATUS=0
for pid in "${STOP_PIDS[@]}"; do
	if ! wait "$pid"; then
		STATUS=1
	fi
done

exit "$STATUS"
