test -z "$DISPLAY" && test "$XDG_VTNR" -lt 1 || return 0

export PATH="$PATH:$HOME/.local/bin/server"
export PROJECTS="$HOME/projects"
test -d "$MUSIC" || export MUSIC="/srv/funkwhale/data/music/janek"

## STACKSPIN
export STACKSPIN="${STACKSPIN:-$PROJECTS/stackspin}"
_stackspin_cluster_cache=/var/tmp/stackspin-cluster

# Stackspin CLI Wrapper:
# Initialize once with "stack select example.org",
# then it loads the last selected cluster on startup.
# Presumes a mapping like the following in your ssh config:
# Host example.org
#    Hostname [IP]
# This is a function so it can change directory.
stack() {
	local pod_suffix='-\(0\|[0-f]\+\)'
	if test $# -lt 1; then
		builtin cd "$STACKSPIN"
		echo "Usage: $0 <COMMAND> [args...]"
		echo "Stackspin commands: select, sso, user, push"
		echo "Kubepod commands: pod, exec, app, shell, ls, logs, upload"
		echo "App commands: occ, vikunja"
		return 1
	fi
	local command="$1"
	shift
	case "$command" in
	# stackspin administration
	(select)
		export _cluster_name="$1"
		export _cluster_ip="$(ssh -G "$_cluster_name" | grep --max-count 1 "^hostname " | cut -d " " -f2-)"
		export CLUSTER_DIR="$STACKSPIN/clusters/$_cluster_name"
		export KUBECONFIG="$CLUSTER_DIR/kube_config_cluster.yml"
		# Uncomment the line below to always use the main stackspin repo, even when running in a fork.
		#export GITLAB_CI="true"
		echo Selected "$_cluster_name" with IP "$_cluster_ip"
		echo "$_cluster_name" >"$_stackspin_cluster_cache"
		#test "$PWD" = "$HOME" && builtin cd "$STACKSPIN"
		;;
	(sso) builtin cd "$STACKSPIN"
		"$0" exec dashboard --container backend -- flask "$@";;
	(users)
		if test $# -gt 0
		then for arg
			do "$0" user show $arg
			done
		else "$0" users $("$0" user list | sed 's|.*<\(.*\)>.*|\1|')
		fi;;
	(user|app)
		if test "$1" = "init"
		then mail="$2"
			shift 2
			"$0" user create "$mail"
			"$0" user update "$mail" name "$*"
			echo "Initialized user '$*' with email '$mail'"
		else "$0" sso cli "$command" "$@"
		fi;;
	(push)
		git commit -a "$@"
		git push &&
		flux reconcile source git -n flux-system "$(basename $(git rev-parse --show-toplevel))"
		flux reconcile kustomization -n flux-system "$(basename $(git rev-parse --show-toplevel))";;
	# KUBE
	# app clis
	(occ) "$0" exec nc-nextcloud -c nextcloud -it -- su www-data -s /bin/bash -c "php $command $*";;
	(vikunja) local pod=${2:-vikunja}
		case "$1" in
		(dump|export) cd "$PROJECTS/vikunja"
			"$0" exec "$pod" -c api -- sh -c 'rm -f *.zip && ./vikunja dump >/dev/null && ls --color -lAhF >&2 && cat *.zip' >"$pod-dump_$(date +%F).zip"
			;;
		(restore) "$0" upload "$pod" "$3" -c api
			"$0" exec "$pod" -c api -it -- ./vikunja restore "$3"
			;;
		(psql) kubectl exec -it -n $("$0" pod "$pod-postgresql") -- sh -c "PGPASSWORD=$(kubectl get secret --namespace stackspout $pod-postgresql -o jsonpath='{.data.postgresql-password}' | base64 --decode) psql -h localhost -U vikunja -p 5432 vikunja";;
		(*) echo "Unknown Subcommand";;
		esac
		;;
	# high-level
	(shell)
		container=$1
		shift
		test "$1" = "-c" && pod=$2 && shift 2
		"$0" exec "$container" -c "$pod" -it -- /bin/sh "$@";;
	(ls)
		if test $# -gt 1 && ! [[ "$2" =~ ".*/.*" ]]
		then "$0" exec "$1" "$2" "$3" -it -- ls -lAhF --group-directories-first "${@:4}"
		else for container in $("$0" kube get "$1" pod -o "jsonpath={.spec.containers[*].name}")
			do highlight "Listing content of $container" &&
				"$0" ls "$1" -c "$container" "${@:2}"
			done
		fi;;
	(upload)
		kubectl cp "$2" -n $("$0" pod "$1$pod_suffix"):$2 "${@:3}"
		"$0" ls "$1" "${@:3}";;
	(exec) "$0" kube exec "$@";;
	(logs) "$0" kube logs "$@" | $(command which lnav || { which bat >/dev/null && echo "bat --number -l toml" } || echo 'less -RF');;
	# low-level
	(kube)
		test $# -gt 1 || { echo "Please provide a command and pod name" >&2 && return 1; }
		local pods=$("$0" pod "$2$pod_suffix") || { echo "No pod found for $2" >&2 && return 1; }
		local subcommand=$1
		shift 2
		local commands=()
		for arg
		do case "$arg" in (-*) break;; (*) commands+="$arg"; shift;; esac
		done
		for namespacedpod in $pods; do
			test "$subcommand" = get ||
				highlight "Running $subcommand on $namespacedpod" >&2
			kubectl "$subcommand" "$commands[@]" -n $(echo $namespacedpod) "$@"
		done;;
	(pod)
		test $# -gt 0 && local podname=$1 && shift
		kubectl get pods --all-namespaces --field-selector="status.phase=Running" -o=custom-columns=S:.metadata.namespace,N:.metadata.name --no-headers "$@" | grep --color=never -- "$podname";;
	# stackspin bare
	(*) if which "$0-$command" >/dev/null 2>&1
		then "$0-$command" "$@"
			return $?
		fi
		builtin cd "$STACKSPIN"
		# Since the install command can also be given bare to install stackspin itself
		if test "$command" = "install"; then
			if test $# -gt 0
			then "./install/install-$1.sh" || ./install/install-app.sh "$@"
			else
				/usr/bin/python3 -m pip install --upgrade pip
				/usr/bin/python3 -m pip install -r requirements.txt
				python3 -m stackspin "$_cluster_name" "$command"
			fi
		else python3 -m stackspin "$_cluster_name" "$command" "$@"
		fi;;
	esac
}
cat "$_stackspin_cluster_cache" 2>/dev/null |
	while read cluster; do stack select "$cluster"; done

test "$PWD" = "$HOME" && cde "$PROJECTS/ampache-docker"

test -f "$HOME/.rvm/scripts/rvm" &&
	source "$HOME/.rvm/scripts/rvm" && # Load RVM into a shell session *as a function*
	rvm use 3.0
