#!/bin/bash
#
# Builds and deploys Zotero with full and incremental updates
#
set -euo pipefail

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
. "$ROOT_DIR/config.sh"

UPDATES_JSON_URL="https://www.zotero.org/download/standalone/updates.json"

function usage {
	cat >&2 <<DONE
Usage: $0 -x XPI_FILE -c CHANNEL -p PLATFORMS
 -x XPI_FILE         XPI file to build from
 -c CHANNEL          Release channel ('release', 'beta', 'dev')
 -p PLATFORMS        Platforms to build (m=Mac, w=Windows, l=Linux)
 -i INCREMENTALS     Number of incremental builds to create
DONE
	exit 1
}


XPI=""
CHANNEL=""
PLATFORMS=""
while getopts "x:c:p:i:" opt; do
	case $opt in
		x)
			XPI="$OPTARG"
			if [ ! -f "$XPI" ]; then
				echo "$XPI not found"
				exit 1
			fi
			;;
		c)
			CHANNEL="$OPTARG"
			;;
		p)
			PLATFORMS="$OPTARG"
			;;
		i)
			NUM_INCREMENTALS="$OPTARG"
			;;
		*)
			usage
			;;
	esac
	shift $((OPTIND-1)); OPTIND=1
done

if [[ -z "$XPI" ]] || [[ -z "$CHANNEL" ]] || [[ -z "$PLATFORMS" ]]; then
	usage
fi

"$SCRIPT_DIR"/check_requirements

VERSION="`unzip -p \"$XPI\" install.rdf | perl -ne 'print and last if s/.*<em:version>(.*)<\/em:version>.*/\1/;'`"
if [ -z "$VERSION" ]; then
	echo "Error getting version from XPI"
	exit 1
fi

# Build Zotero
"$ROOT_DIR/build.sh" -f $XPI -p $PLATFORMS -c $CHANNEL

BUILD_ID=`cat "$DIST_DIR/build_id"`
if [ -z "$BUILD_ID" ]; then
	echo "Error getting build id"
	exit 1
fi

TEMP_DIR=`mktemp -d`
# Clean up on exit
function cleanup {
	rm -rf "$TEMP_DIR"
}
trap cleanup EXIT

# Build full update
"$ROOT_DIR/update-packaging/build_autoupdate.sh" -f -c "$CHANNEL" -p $PLATFORMS -l $VERSION

# Build incremental updates for each platform
for i in `seq 0 1 $((${#PLATFORMS}-1))`
do
	case ${PLATFORMS:i:1} in
		m)
			platform=mac
			platform_name=Mac
			;;
		w)
			platform=win
			platform_name=Windows
			;;
		l)
			platform=linux
			platform_name=Linux
			;;
		*)
			echo "$0: Invalid platform option ${PLATFORMS:i:1}"
			usage
			;;
	esac
	
	echo
	echo "Getting $platform_name incrementals"
	INCREMENTALS="`\"$SCRIPT_DIR/manage_incrementals\" -c $CHANNEL -p ${PLATFORMS:i:1} -n $NUM_INCREMENTALS`"
	echo "$INCREMENTALS"
	echo
	
	for from in $INCREMENTALS; do
		echo "Building incremental update for $platform_name from $from to $VERSION"
		"$ROOT_DIR/update-packaging/build_autoupdate.sh" -i "$from" -c "$CHANNEL" -p ${PLATFORMS:i:1} -l $VERSION
		echo
	done
done

# Upload builds to S3
"$SCRIPT_DIR/upload_builds" -s "$CHANNEL" $VERSION

# Upload file lists for each platform, using a subdirectory for non-release channels
if [ $CHANNEL == "release" ]; then
	VERSIONS_DEPLOY_PATH="$DEPLOY_PATH"
else
	VERSIONS_DEPLOY_PATH="$DEPLOY_PATH/$CHANNEL"
fi
mkdir "$TEMP_DIR/version_info"
chmod g+ws "$TEMP_DIR/version_info"
cp "$DIST_DIR"/files-* "$TEMP_DIR/version_info"
chmod g+w "$TEMP_DIR"/version_info/files-*
rsync -rv "$TEMP_DIR/version_info/" $DEPLOY_HOST:"$VERSIONS_DEPLOY_PATH/$VERSION/"

# Download updates.json, update it, and reupload it
curl -s $UPDATES_JSON_URL > "$TEMP_DIR/updates.json"
"$ROOT_DIR/update-packaging/add_version_info" -f "$TEMP_DIR/updates.json" -p $PLATFORMS -c $CHANNEL -v $VERSION -b $BUILD_ID
scp "$TEMP_DIR/updates.json" $DEPLOY_HOST:"$DEPLOY_PATH/updates.json"

# Add version to incremental lists
echo
for i in `seq 0 1 $((${#PLATFORMS}-1))`
do
	"$SCRIPT_DIR/manage_incrementals" -c $CHANNEL -p ${PLATFORMS:i:1} -a $VERSION
done

$DEPLOY_CMD

rm -rf "$STAGE_DIR"/*
