#!/usr/bin/env bash

set -e

say() {
	[ -n "$*" ] && echo "$PGM: $*" >&2 || return
}
log() {
	DEBUG=${DEBUG:-no}
	[ ! "${DEBUG:-}" = "yes" ] && return
	say "$*"
}

PGM=$(basename "$0")
TMP=$(mktemp) || exit $?
trap "rm -rf $TMP $TMP.*" EXIT

dry_run=
if [ "${DRY_RUN:-}" = "yes" ]; then
	dry_run="say [DRY_RUN]"
	$dry_run enabled
fi

BASEDIR=$(cd $(dirname $0)/.. && pwd)
log BASEDIR $BASEDIR
SHAREDIR=$(cd $BASEDIR/share 2>/dev/null ||
	cd /usr/share/opensim-cli/share 2>/dev/null && pwd) ||
	exit 2
log SHAREDIR $SHAREDIR
log Images $SHAREDIR/podman/images

if ! cut -d"#" -f 1 $SHAREDIR/podman/images | grep "." >$TMP.images; then
	log empty images list $SHAREDIR/podman/images
	exit 1
fi

if [ -z "$1" ]; then
	echo "usage: $PGM <container-id>"
	echo
	cat $TMP.images | sed "s/^/  /"
	exit
fi
image_id=localhost/opensim-$1
log image_id $image_id
shift

args=(
	-d
	-i
)
name=$1
if [ -n "${1:-}" ]; then
	log setting name to $1
	args+=("--name $1")
	args+=("--hostname $1")

	say getting ports for $*
	args+=($(opensim ports --publish $*))
else
	args+=("-P")
fi

log setting mount points
mount_points=(
	# /etc/opensim
	# /var/lib/opensim
	# /var/log/opensim
)

remote=${CONTAINER_CONNECTION:+ssh ${CONTAINER_CONNECTION}}
$remote opensim --layout --format=env >$TMP.layout
. $TMP.layout

[ -z "${OPENSIM_SYSTEM_UID:-}" ] && say "[ERROR] missing  OPENSIM_SYSTEM_UID" && exit 1
[ -z "${OPENSIM_SYSTEM_GID:-}" ] && say "[ERROR] missing  OPENSIM_SYSTEM_GID" && exit 1
[ -z "${CURRENT_UID:-}" ] && say "[ERROR] missing  CURRENT_UID" && exit 1
[ -z "${CURRENT_GID:-}" ] && say "[ERROR] missing  CURRENT_GID" && exit 1

rootless=$(podman info --format '{{.Host.Security.Rootless}}')
# rootless=false
# say "[DEBUG] forcing rootless=false"

log rootless mode $rootless
log host user $CURRENT_USER $CURRENT_UID:$CURRENT_GID
log system user $OPENSIM_SYSTEM_USER $OPENSIM_SYSTEM_UID:$OPENSIM_SYSTEM_GID

for mount_point in ${mount_points[@]}; do
	echo mount_point $mount_point
	src=$($remote realpath $mount_point)
	args+=("--volume ${src}:${mount_point}")
	# args+=("--mount=type=bind,source=$src,destination=$mount_point")
	# args+=("--mount type=bind,src=$src,dst=$mount_point,bind-propagation=shared")
done

# args+=(--user=$OPENSIM_SYSTEM_UID:$OPENSIM_SYSTEM_GID)

if [[ "$rootless" == "true" ]]; then
	say "Rootless true, map user namespace"
	args+=(--userns=keep-id:uid=$OPENSIM_SYSTEM_UID,gid=$OPENSIM_SYSTEM_GID)
	# args+=(--userns=keep-id:uid=$CURRENT_UID,gid=$CURRENT_GID)
	# args+=(--userns=keep-id)
	# args+=(--userns=auto)
	# args+=(--userns=host)
	# args+=(--userns=private)
	# args+=(--userns=ns:$name-ns)
	# elif [[ "$OPENSIM_SYSTEM_UID" != "$CURRENT_UID" ]]; then
	# 	say "Rootless false, set mapping $OPENSIM_SYSTEM_UID to $CURRENT_UID"
	# args+=(
	# 	--uidmap 0:0:65536
	# 	--gidmap 0:0:65536
	# 	--uidmap +$OPENSIM_SYSTEM_UID:$CURRENT_UID:1
	# 	--uidmap +$CURRENT_UID:65536:1
	# 	--gidmap +$OPENSIM_SYSTEM_GID:$CURRENT_GID:1
	# 	--gidmap +$CURRENT_GID:65536:1
	# )
	# args+=(
	# 	--uidmap 0:0:65536
	# 	--gidmap 0:0:65536
	# 	--uidmap +$OPENSIM_SYSTEM_UID:$CURRENT_UID:1
	# 	--uidmap +$CURRENT_UID:65536:1
	# 	--gidmap +$OPENSIM_SYSTEM_GID:$CURRENT_GID:1
	# 	--gidmap +$CURRENT_GID:65536:1
	# 	# --uidmap +$CURRENT_UID:$OPENSIM_SYSTEM_UID:1
	# 	# --uidmap +$OPENSIM_SYSTEM_UID:65536:1
	# 	# --gidmap +$CURRENT_GID:$OPENSIM_SYSTEM_GID:1
	# 	# --gidmap +$OPENSIM_SYSTEM_GID:65536:1
	# )
else
	say "Rootless false, map user namespace"
	args+=(--userns=host)
fi

env | egrep "^(APT_SOURCE|OPENSIM_DB|DEFAULT_)" >$TMP.env
echo "CONTAINER_HOST=$(hostname -f)" >>$TMP.env
echo "CONTAINER_NAME=$(hostname -s)" >>$TMP.env
args+=("--env-file $TMP.env")

if [ "$YES" = yes ]; then
	start=y
else
	read -p "start container (Y/n)? " start
	start=${start:-y}
fi
if [ "$start" = "y" ]; then
	container_id=$($dry_run podman run ${args[@]} $image_id)
	$dry_run podman container inspect $container_id | grep '"Name":' | head -1 | sed 's/"//g; s/,$//; s/^ *//'
	echo "Id: $container_id"
fi
