#! /bin/sh

set -e

# Input environment variables:
# URL
# USERNAME
# PASSWORD

check()
{
	var="$1"

	test -n "$(printenv $var)" ||
		(printf "Please define environment variable $var\n" >&2; exit 1)
}

usage()
{
	printf "%s [-d <directory>] <artifact> [...]\n" "$0" >&2
}

login()
{
	curl -X POST \
		-f \
		-c "$cookiejar" \
		--data-urlencode "username@$username" \
		--data-urlencode "password@$password" \
		"$URL/login"
}

getdir()
{
	dir="/"

	while getopts "d:" arg
	do
		case $arg in
		d)
			dir="$OPTARG";;
		*)
			usage
			return 1
			;;
		esac
	done
}

upload()
{
	getdir $@
	shift $((OPTIND - 1))
	f="$1"
	ldir="/${dir:+$dir/}"

	curl -X POST \
		-f \
		-H 'Expect:' \
		-b "$cookiejar" \
		-F dir="$ldir" \
		-F "file=@$f;filename=$(basename -- "$f")" \
		"$URL/upload"
}

upload_all()
{
	getdir $@
	shift $((OPTIND - 1))

	for f in $*
	do
		if ! upload -d "$dir" "$f"
		then
			printf "Failed to upload %s\n" "$f"
			exit 1
		elif ! share -d "$dir" "$f"
		then
			printf "Failed to share %s\n" "$f"
			exit 1
		fi
	done
}

share()
{
	getdir $@
	shift $((OPTIND - 1))
	f="$1"
	resp="$(mktemp)"
	name="/${dir:+$dir/}$f"

	curl -s -X POST \
		-f \
		-b "$cookiejar" \
		--data-urlencode "name=$name" \
		"$URL/share" > "$resp"

	pub=$(grep -Poe '/public/[a-f0-9]+' "$resp")
	printf "%s: %s%s\n" "$f" "$URL" "$pub"
}

cleanup()
{
	rm -f "$cookiejar" "$password" "$username"
}

check URL
check USERNAME
check PASSWORD

test $# -ge 1 || (usage; exit 1)
cookiejar="$(mktemp)"
username="$(mktemp)"
password="$(mktemp)"
trap cleanup INT QUIT TERM EXIT
printenv USERNAME | tr -d '\n' > "$username"
printenv PASSWORD | tr -d '\n' > "$password"
login || (printf "Failed to log in\n"; exit 1)
upload_all $@ || (printf "Failed to upload files\n"; exit 1)
