#!/usr/bin/env bash

set -e
rm -rf "$DEST"

if ! command -v dockerd &> /dev/null; then
	echo >&2 'error: binary-daemon or dynbinary-daemon must be run before run'
	false
fi

DOCKER_COMMAND="$(command -v dockerd)"

DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs}
DOCKER_USERLANDPROXY=${DOCKER_USERLANDPROXY:-true}

# example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G"
storage_params=""
if [ -n "$DOCKER_STORAGE_OPTS" ]; then
	IFS=','
	for i in ${DOCKER_STORAGE_OPTS}; do
		storage_params="--storage-opt $i $storage_params"
	done
	unset IFS
fi

listen_port=2375
if [ -n "$DOCKER_PORT" ]; then
	listen_port="${DOCKER_PORT##*:}"
fi

if [ -n "$DELVE_PORT" ]; then
	delve_listen_port="${DELVE_PORT##*:}"
fi

extra_params="$DOCKERD_ARGS"
if [ "$DOCKER_REMAP_ROOT" ]; then
	extra_params="$extra_params --userns-remap $DOCKER_REMAP_ROOT"
fi

if [ -n "$DOCKER_EXPERIMENTAL" ]; then
	extra_params="$extra_params --experimental"
fi

socket=/var/run/docker.sock
if [ -n "$DOCKER_ROOTLESS" ]; then
	user="unprivilegeduser"
	uid=$(id -u $user)
	# shellcheck disable=SC2174
	mkdir -p -m 700 "/tmp/docker-${uid}"
	chown $user "/tmp/docker-${uid}"
	socket=/tmp/docker-${uid}/docker.sock
fi

# shellcheck disable=SC2206
args=(
	--debug
	--host="tcp://0.0.0.0:${listen_port}"
	--host="unix://${socket}"
	--storage-driver="${DOCKER_GRAPHDRIVER}"
	--userland-proxy="${DOCKER_USERLANDPROXY}"
	--tls=false
	$storage_params
	$extra_params
)

dockerd=("$DOCKER_COMMAND")

if [ -n "$DELVE_PORT" ]; then
	dockerd=(
		dlv
		--listen="0.0.0.0:$delve_listen_port"
		--headless=true
		--log
		--api-version=2
		--only-same-user=false
		--check-go-version=false
		--accept-multiclient
		exec "${dockerd[@]}" --
	)
fi

if [ -n "$DOCKER_ROOTLESS" ]; then
	dockerd=(
		sudo -u "$user"
		-E DOCKERD="${dockerd[*]}"
		-E XDG_RUNTIME_DIR="/tmp/docker-${uid}"
		-E XDG_CONFIG_HOME="/home/${user}/.config"
		-E HOME="/home/${user}"
		--
		dockerd-rootless.sh
	)
fi

set -x
# shellcheck disable=SC2086
exec "${dockerd[@]}" "${args[@]}"
