#!/usr/bin/env bash

for i in mksquashfs cpio gzip sed grep xorriso tar file; do
	if [ ! -x "$(command -v ${i})" ]; then
		case ${i} in
			mksquashfs) a="squashfs-tools";;
			readelf) a="binutils";;
			*) a="${i}"
		esac
		echo "Please install ${a} package to run this tool"
		exit 1
	fi
done

exec > >(tee -i /tmp/mlb.log) 2>&1
cd "$(dirname $(readlink -f ${0}))" || exit 1
cp -f config .config

mapfile -t list < <(ls -A /boot | egrep "bzImage|kernel|vmlinuz" 2>/dev/null | egrep -v "init|*.old")
if [ ${#list[@]} -gt 1 ]; then
	n=0
	echo -e "Please choose your kernel to proceed:\nChoose number from ${n} to ${#list[@]}\n-----\n"
	for a in "${list[@]}"; do
		echo "[${n}] - ${a}"
		((n++))
	done
	echo "-----"
	read kernel
	kernel="/boot/${list[${kernel}]}"
	unset list n
else
	kernel="/boot/${list[0]}"
fi
set -x
time (
	echo "KERNEL=\"${kernel}\"" >>.config
	echo "LMK=\"/lib/modules/$(file -bL ${kernel} | grep -o 'version .*' | cut -d' ' -f2)\"" >>.config
	unset kernel
	top="$(pwd)"
	. .config
	workTmpDir="$(mktemp -d /tmp/Mlb_WorkDir_XXXXXXX)"
	DATA="${workTmpDir}/isoImage"
	INITRD="$(initrd/create)"
	ret="${?}"
	tmpRoot="${workTmpDir}/tmpRoot"
	trap "rm -rf ${workTmpDir} /tmp/MlbInitRd{,.img}&&exit 1" 2 6 15
	mkdir -p ${DATA}/changes ${DATA}/${DISTRO}/modules
	rsync --force -aAP $(for i in $(awk '{print $2}' /proc/mounts) /tmp; do echo "--exclude=${i}/*"; done) / ${tmpRoot}
	chmod +x -R inc2sys
	cp -rf inc2sys/* ${tmpRoot}
	mknod ${tmpRoot}/dev/console c 5 1
	mknod ${tmpRoot}/dev/null c 1 3
	mknod ${tmpRoot}/dev/ram0 b 1 0
	mknod ${tmpRoot}/dev/tty1 c 4 1
	mknod ${tmpRoot}/dev/tty2 c 4 2
	mknod ${tmpRoot}/dev/tty3 c 4 3
	mknod ${tmpRoot}/dev/tty4 c 4 4
	for i in zstd xz lzma bzip2 gzip; do
		mksquashfs ${tmpRoot} ${DATA}/${DISTRO}/system.sfs -comp ${i} -noappend -limit 50
		[ -e ${DATA}/${DISTRO}/system.sfs ]&&break
	done
	mv -f ${INITRD} ${DATA}/initrd.img
	cp -rf bootfiles/* ${DATA}
	for i in ${DATA}/syslinux.cfg ${DATA}/boot/grub/grub.cfg; do
		sed -i -r "s/__DISTRO__/${DISTRO}/" ${i}
	done
	cp -f ${KERNEL} ${DATA}/vmlinuz
	cd ${DATA}
	utc="$(date +%s)"
	v="$(git -C ${top} rev-parse HEAD 2>/dev/null)"&&v="${v}:GIT"||v="INFINITY:LOCAL"
	cat <<eot >.MlbMeta
# Built using Minimal-Linux-Booter technology.
MLB_VERSION="${v}"
MLB_NAME="${DISTRO}"
MLB_UTC="${utc}"
eot
	[[ ${ret} = 2 ]]&&echo "MLB_ELF_STATIC_INITRD=\"1\"" >>.MlbMeta||echo "MLB_ELF_STATIC_INITRD=\"0\"" >>.MlbMeta
	xorriso -as mkisofs -o /${DISTRO}-${utc}.iso -iso-level 3 -J -R -D -A ${DISTRO} -V ${DISTRO} -no-emul-boot -boot-info-table -boot-load-size 2 -b boot/grub/i386-pc/eltorito.img -c boot/grub/grub.cat -eltorito-alt-boot -e /efi.img -no-emul-boot .
	isohybrid --version >/dev/null 2>&1&&isohybrid -u /${DISTRO}-${utc}.iso
	cd ${top}
	rm -rf ${workTmpDir}
)
