#!/bin/bash
LPMAKE="lpmake" # path to lpmake
PARTITIONS=(system system_ext vendor product odm) # partitions to pack, in order
#FLASHSIZE=3263168512 # original nand partition size
SPARSE=1

cd "${ROCKDEV_SUPER_WORK_DIR}"

if [ -n "${SPARSE}" ]; then
	if [ ! -d "${ROCKDEV_SUPER_WORK_DIR}/sparse" ]; then
		mkdir "${ROCKDEV_SUPER_WORK_DIR}/sparse";
	fi
fi

getStat() {
	stat -c '%s' "${ROCKDEV_SUPER_WORK_DIR}/${1}"
}

getPartitionLine() {
	local PARTSIZE=$(getStat "${1}.img")
	if [ -n "${SPARSE}" ]; then
		echo -n "Checking ${ROCKDEV_SUPER_WORK_DIR}/${1}.img ..." >&2
		local IMAGE_MD5="$(md5sum -b "${ROCKDEV_SUPER_WORK_DIR}/${1}.img" | cut -d' ' -f1)"
		if [ -f "${ROCKDEV_SUPER_WORK_DIR}/sparse/${1}.img.md5" ]; then
			if [ "$(cat "${ROCKDEV_SUPER_WORK_DIR}/sparse/${1}.img.md5")" == "${IMAGE_MD5}" ]; then
				echo " no update needed." >&2
			else
				echo " update required." >&2
				echo "${IMAGE_MD5}" > "${ROCKDEV_SUPER_WORK_DIR}/sparse/${1}.img.md5"
				echo "Creating sparse image ${ROCKDEV_SUPER_WORK_DIR}/sparse/${1}.simg ..." >&2
				img2simg "${ROCKDEV_SUPER_WORK_DIR}/${1}.img" "${ROCKDEV_SUPER_WORK_DIR}/sparse/${1}.simg"
			fi
		else
			echo " update required." >&2
			echo "${IMAGE_MD5}" > "${ROCKDEV_SUPER_WORK_DIR}/sparse/${1}.img.md5"
			echo "Creating sparse image ${ROCKDEV_SUPER_WORK_DIR}/sparse/${1}.simg ..." >&2
			img2simg "${ROCKDEV_SUPER_WORK_DIR}/${1}.img" "${ROCKDEV_SUPER_WORK_DIR}/sparse/${1}.simg"
		fi
		echo "--partition" "${1}:readonly:${PARTSIZE}:main" "--image=${1}=${ROCKDEV_SUPER_WORK_DIR}/sparse/${1}.simg"
	else
		echo "--partition" "${1}:readonly:${PARTSIZE}:main" "--image=${1}=${ROCKDEV_SUPER_WORK_DIR}/${1}.img"
	fi
}

getSuperSize() {
	local SIZE=0
	for f in "${PARTITIONS[@]}"; do
		SIZE=$(expr "${SIZE}" + "$(getStat "${f}.img")")
	done
	echo "${SIZE}"
}

SUPERSIZE="$(getSuperSize)"
FLASHSIZE="$((SUPERSIZE+163840))" # will calculate

while (( $FLASHSIZE % 4096 )) ; do
	FLASHSIZE=$((FLASHSIZE+1))
done

echo "Found optimal super.img size: ${FLASHSIZE} bytes ($(printf %x $((FLASHSIZE / 512))))."
echo "${FLASHSIZE}" > ../super.new.img.size

OUTCMD=("${LPMAKE}" --metadata-size 65536 --super-name super --metadata-slots 1)
OUTCMD+=(--alignment=4096 --device-size "${FLASHSIZE}" --group "main:${SUPERSIZE}")

for f in "${PARTITIONS[@]}"; do
	OUTCMD+=($(getPartitionLine "${f}"))
done

if [ -n "${SPARSE}" ]; then
	OUTCMD+=(--sparse)
fi

OUTCMD+=(--output ../super.new.img)

echo "${OUTCMD[@]}"
"${OUTCMD[@]}"
