#!/usr/bin/env bash

set -euo pipefail

CREATE_LOCAL_GCROOT=false

while [[ "$#" -gt 0 ]]; do
	case "$1" in
	--help)
		echo "Use --create-local-gcroot to create local GC root"
		exit 0
		;;
	--create-local-gcroot)
		CREATE_LOCAL_GCROOT=true
		shift
		;;
	*)
		echo "Unknown option: $1"
		exit 1
		;;
	esac
done

first_server="${SERVERS%% *}"
previous_manifest=$(
	envsubst <<EOF | ssh -T "root@$first_server.dmz"
        if [[ -f "$GCROOTDIR/$NAME.yml" ]]; then
                cat "$GCROOTDIR/$NAME.yml"
        fi
EOF
)

set +e
if [ -z "$previous_manifest" ]; then
	echo No previous manifest found!
else
	$DYFF between <(echo "$previous_manifest") "$MANIFEST" \
		--exclude-regexp metadata.labels.kubenix/hash \
		--exclude-regexp labels.kubenix/hash \
		--set-exit-code
fi
set -e

read -r -p "Continue? " _

echo Uploading closure...
for server in $SERVERS; do
	echo Uploading closure to "$server"...
	nix copy --to "ssh://root@$server.dmz" "$MANIFEST"
done

echo Applying Kubernetes manifest...
export KUBECTL_APPLYSET=true
vals eval -fail-on-missing-key-in-map <"$MANIFEST" |
	kubectl apply -f - \
		--prune \
		--applyset applyset-"$NAME" \
		--namespace "$NAMESPACE"

echo Creating GC roots
for server in $SERVERS; do
	ssh "root@$server.dmz" "mkdir -p $GCROOTDIR && ln -sf $MANIFEST $GCROOTDIR/${NAME}.yml"
done

if $CREATE_LOCAL_GCROOT; then
	mkdir -p ./.manifests
	ln -sf "$MANIFEST" "./.manifests/${NAME}.yml"
fi