# shellcheck shell=bash
cite about-plugin
about-plugin 'Helpers to more easily work with Docker'

function docker-remove-most-recent-container() {
	about 'attempt to remove the most recent container from docker ps -a'
	group 'docker'
	docker ps -ql | xargs docker rm
}

function docker-remove-most-recent-image() {
	about 'attempt to remove the most recent image from docker images'
	group 'docker'
	docker images -q | head -1 | xargs docker rmi
}

function docker-remove-stale-assets() {
	about 'attempt to remove exited containers and dangling images'
	group 'docker'
	docker ps --filter status=exited -q | xargs docker rm --volumes
	docker images --filter dangling=true -q | xargs docker rmi
}

function docker-enter() {
	about 'enter the specified docker container using bash'
	group 'docker'
	param '1: Name of the container to enter'
	example 'docker-enter oracle-xe'

	docker exec -it "$@" /bin/bash
}

function docker-remove-images() {
	about 'attempt to remove images with supplied tags or all if no tags are supplied'
	group 'docker'
	local line
	if [ -z "$1" ]; then
		# shellcheck disable=SC2046
		docker rmi $(docker images -q)
	else
		DOCKER_IMAGES=""
		for IMAGE_ID in "$@"; do DOCKER_IMAGES="$DOCKER_IMAGES\|$IMAGE_ID"; done
		# Find the image IDs for the supplied tags
		ID_ARRAY=()
		while IFS='' read -r line; do ID_ARRAY+=("$line"); done < <(docker images | grep "${DOCKER_IMAGES:2}" | awk '{print $3}')
		# Strip out duplicate IDs before attempting to remove the image(s)
		# shellcheck disable=SC2046
		docker rmi $(echo "${ID_ARRAY[@]}" | tr ' ' '\n' | sort -u)
	fi
}

function docker-image-dependencies() {
	about 'attempt to create a Graphiz image of the supplied image ID dependencies'
	group 'docker'
	if hash dot 2> /dev/null; then
		OUT=$(mktemp -t docker-viz-XXXX.png)
		docker images -viz | dot -Tpng > "$OUT"
		case $OSTYPE in
			linux*)
				xdg-open "$OUT"
				;;
			darwin*)
				open "$OUT"
				;;
		esac
	else
		echo "Can't show dependencies; Graphiz is not installed" >&2
	fi
}

function docker-runtime-environment() {
	about 'attempt to list the environmental variables of the supplied image ID'
	group 'docker'
	docker run "$@" env
}

function docker-archive-content() {
	about 'show the content of the provided Docker image archive'
	group 'docker'
	param '1: image archive name'
	example 'docker-archive-content images.tar.gz'

	if [ -n "$1" ]; then
		tar -xzOf "$1" manifest.json | jq '[.[] | .RepoTags] | add'
	fi
}
