#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

ROOT_DIR="$(dirname "$(readlink -f "$0")")"
OUT_DIR="${1:-$(pwd)}"

TMP_DIR="$(mktemp --directory)"
TMP_DIR_PFS="$(mktemp --directory)"
TMP_DIR_MOUNT="$(mktemp --directory)"

TOOLS=(git make sudo qemu-aarch64-static xz)

GIT_REPO=https://github.com/void-linux/void-mklive.git
GIT_REV=f71eb4bb81004b50884011ef5e0d00f99bc2892a
GIT_DIR="$ROOT_DIR/.void-mklive"

cleanup() {
    cleanup_mounts
    sudo rm -r "$TMP_DIR" "$TMP_DIR_PFS" "$TMP_DIR_MOUNT"
}

cleanup_mounts() {
    sudo losetup -D
    sudo umount --recursive "$TMP_DIR_MOUNT" || true
}

check_tools() {
    for tool in ${TOOLS[@]}; do 
        if ! command -v "$tool" &> /dev/null
        then
            echo "$tool could not be found"
            exit 1
        fi
    done
}

init_void_mklive() {
    if [ ! -d "$GIT_DIR" ]; then
        git clone "$GIT_REPO" "$GIT_DIR"
        cd "$GIT_DIR" && git checkout "$GIT_REV"
    fi

    cd "$GIT_DIR"

    if [ "$(git rev-parse HEAD)" != "$GIT_REV" ]; then
        git fetch
        git checkout "$GIT_REV"
    fi

    make
    sed -i 's/ROOTFS_TARBALL#void-/ROOTFS_TARBALL#*void-/g' "$GIT_DIR/mkimage.sh"
}

build_img() {
    local rootfs_file="$TMP_DIR/rootfs.tar.xz"
    local platformfs_file="$TMP_DIR/void-pinebookpro-PLATFORMFS.tar.xz"
    local img="$TMP_DIR/void-pbp.img"

    cd "$GIT_DIR"

    sudo ./mkrootfs.sh -o "$rootfs_file" aarch64
    sudo ./mkplatformfs.sh -p "dracut lvm2 cryptsetup" -o "$platformfs_file" pinebookpro "$rootfs_file"
    sudo ./mkimage.sh -B 256MiB  -o "$img" "$platformfs_file"

    sudo xz --decompress --stdout "$img.xz" > "$img"
    local loop_dev="$(sudo losetup --show -f -P "$img")"

    sudo mount "$loop_dev"p2 "$TMP_DIR_MOUNT"
    sudo mount "$loop_dev"p1 "$TMP_DIR_MOUNT"/boot
    
    sudo cp "$ROOT_DIR/bootstrap" "$TMP_DIR_MOUNT/usr/bin/bootstrap" 
    sudo chmod +x "$TMP_DIR_MOUNT/bin/bootstrap" 

    sudo cp "$(which qemu-aarch64-static)" "$TMP_DIR_MOUNT/usr/bin/"
    
    sudo chroot "$TMP_DIR_MOUNT" qemu-aarch64-static /bin/bash <<"EOT"
ln -s /etc/sv/dhcpcd /etc/runit/runsvdir/default/
EOT

    sudo rm "$TMP_DIR_MOUNT/usr/bin/qemu-aarch64-static"
    cleanup_mounts

    mkdir -p "$OUT_DIR"
    xz --threads=0 --compress --stdout "$img" > "$OUT_DIR/$(basename $img.xz)"
    
    echo "built pinebookpro image: $OUT_DIR/$(basename $img.xz)"
}

trap cleanup 0 SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM

check_tools
init_void_mklive
build_img