#!/system/bin/sh

[ -n "$VENDOR_REC_DIR" ] || VENDOR_REC_DIR="/system/vendor/recovery"
[ -n "$RECOVERY_DEV" ] || RECOVERY_DEV="/dev/block/platform/ff0f0000.rksdmmc/by-name/recovery"
[ -n "$CURRENT_VER_FILE" ] || CURRENT_VER_FILE="/drd-data/recovery/version"
[ -n "$AVAIL_VER_FILE" ] || AVAIL_VER_FILE="$VENDOR_REC_DIR/version"
[ -n "$RECOVERY_IMG_FILE" ] || RECOVERY_IMG_FILE="$VENDOR_REC_DIR/recovery.img"
[ -n "$RECOVERY_CHEKSUM_FILE" ] || RECOVERY_CHEKSUM_FILE="$VENDOR_REC_DIR/recovery.img.sha256sum"
[ -n "$SHOULD_UPDATE" ] || SHOULD_UPDATE=0

if [ ! -e "$AVAIL_VER_FILE" ] ; then
	echo "no available version of recovery"
	exit 0
fi

if [ ! -e "$RECOVERY_IMG_FILE" ] ; then
	echo "no available recovery.img"
	exit 0
fi

if [ ! -e "$RECOVERY_CHEKSUM_FILE" ] ; then
	echo "missing recovery.img.sha256sum checksum"
	exit 1
fi

if [ ! -b "$RECOVERY_DEV" ] ; then
	echo "$RECOVERY_DEV is not a block device"
	exit 3
fi

if [ -e "$CURRENT_VER_FILE" ] ; then
	CURRENT_VERSION="$(head -1 "$CURRENT_VER_FILE")"
	AVAIL_VER="$(head -1 "$AVAIL_VER_FILE")"
	LATEST_VER="$(echo -e "$CURRENT_VERSION\n$AVAIL_VER" | busybox sort -t . -k 1,1n -k 2,2n -k 3,3n | busybox tail -1)"
	if [ "$CURRENT_VERSION" != "$LATEST_VER" ]  ; then
		SHOULD_UPDATE=1
	fi
else
	SHOULD_UPDATE=1
fi
	
if [ "$SHOULD_UPDATE" -eq 0 ] ; then
	echo "no new version available"
	exit 0
fi

UPDATE_CHECKSUM="$(cat "$RECOVERY_CHEKSUM_FILE" | cut -d ' ' -f 1)"
if [ "$UPDATE_CHECKSUM" != "$(sha256sum "$RECOVERY_IMG_FILE" | cut -d ' ' -f 1)" ] ; then
	echo "$RECOVERY_IMG_FILE checksum do not match expected signature"
	exit 2
fi

RECOVERY_SIZE="$(stat -c "%s" "$RECOVERY_IMG_FILE")"

CURRENT_CHECKSUM="$(busybox head -c $RECOVERY_SIZE "$RECOVERY_DEV" | sha256sum | cut -d ' ' -f 1)"
if [ "$CURRENT_CHECKSUM" = "$UPDATE_CHECKSUM" ] ; then
	echo "installed version is already up-to-date; skipping"
	mkdir -p "$(dirname "$CURRENT_VER_FILE")"
	cp "$AVAIL_VER_FILE" "$CURRENT_VER_FILE"
	exit 0
fi

echo "updating $RECOVERY_DEV using $RECOVERY_IMG_FILE (version $CURRENT_VER_FILE) running:"
echo dd if="$RECOVERY_IMG_FILE" of="$RECOVERY_DEV"
dd if="$RECOVERY_IMG_FILE" of="$RECOVERY_DEV"
ret=$?
if [ $ret -eq 0 ] ; then
	echo "update done"
	mkdir -p "$(dirname "$CURRENT_VER_FILE")"
	cp "$AVAIL_VER_FILE" "$CURRENT_VER_FILE"
else
	echo "update FAILED (ret: $ret)"
fi


exit $ret
