#!/bin/sh

set -e

die() {
   echo "$@" >&2
   exit 1
}

cleanup() {
   if [ -d "${TMP_DIR}" ]; then
      rm -rf "${TMP_DIR}"
   fi
}

build() {
bcm_chip=$1
for src in release-${bcm_chip}/*.zip; do
   src=$(basename "${src}")
   img=$(echo "${src}" | sed 's/\.zip/.img/')
   images_dir="images-${bcm_chip}"
   TMP_DIR=$(mktemp -d)
   (
      cp "release-${bcm_chip}/${src}" "${TMP_DIR}"
      mkdir "${TMP_DIR}/files"
      cd "${TMP_DIR}/files"
      unzip "../${src}"
      cd "${TMP_DIR}"
      dd if=/dev/zero bs=1M count=258 of=temp.img
      /sbin/sfdisk temp.img <<EOF
label: dos
label-id: 0x0a7b5ac5
device: temp.img
unit: sectors

./test.img1 : start=        2048, size=       524288, type=c
EOF
      file temp.img
      kpartx -lv temp.img | head -n1 | awk '{print $1}'
      LOOP="/dev/mapper/$(kpartx -lv temp.img | head -n1 | awk '{print $1}')"
      kpartx -av temp.img
      /sbin/mkfs.fat -F 32 -s 1 "${LOOP}"
      mkdir fs
      mount "${LOOP}" fs
      cp -v files/* fs
      sync
      sleep 5
      umount fs
      # Delay before calling kpartx otherwise it's sometimes possible to get orphaned loopback devices
      sleep 5
      kpartx -dv temp.img
   )
   mkdir -p "${images_dir}"
   chown "${SUDO_UID}:${SUDO_GID}" "${images_dir}"
   mv "${TMP_DIR}/temp.img" "${images_dir}/${img}"
   file "${images_dir}/${img}"
   cd "${images_dir}"
   zip "${src}" "${img}"
   cd ..
   rm "${images_dir}/${img}"
   chown "${SUDO_UID}:${SUDO_GID}" "${images_dir}/${src}"
done
echo "Wrote images for rpi-imager to $(pwd)/${images_dir}"
}

trap cleanup EXIT
[ "$(id -u)" = "0" ] || die "$(basename $0) must be run as root"
[ -n "${SUDO_UID}" ] || die "SUDO_UID not defined"
[ -n "${SUDO_GID}" ] || die "SUDO_GID not defined"

bcm_chip="${1}"
if [ "${bcm_chip}" = 2711 ] || [ "${bcm_chip}" = 2712 ]; then
	build "${bcm_chip}"
else
	die "Usage: $(basename $0) 2711|2712"
fi
