#!/usr/bin/env bash
set -euo pipefail

project_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
output="${1:-${project_root}/third_party/freedos-1.4/guest/freedos-riri-1.4.img}"
work="$(mktemp -d)"
trap 'rm -rf -- "$work"' EXIT

fd14_url="https://download.freedos.org/1.4/FD14-FloppyEdition.zip"
kernel_url="https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/repositories/1.4/base/kernel/20250409.9/kernel.zip"
freecom_url="https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/repositories/1.4/base/freecom.zip"
jemm_url="https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/repositories/1.4/base/jemm/20250611.2/jemm.zip"
ctmouse_url="https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/repositories/1.4/base/ctmouse.zip"
fd14_sha256="45b1fa7c52dd996c3bfa5e352ffcd410781b952a6ad629f15a4c9ec4bbaefc5a"
kernel_sha256="43ed55fec6e795bb24e658302c7fae9eec9eb8dfeaba15734317b3f8302706d6"
freecom_sha256="3a7cfa03cce242031926cd67b69e1fd030d1c27127885d927629945f3137b6f0"
jemm_sha256="81810918838a8ae01ef58460351d73d1d6b5e8dfc53129d3924f330420b02a85"
ctmouse_sha256="fd47069fb3d9559604dcaef34ca4f3705a7f2f2cff3e4b205e361b79f10a8200"
kernel_binary_sha256="f34a7483c575fcf2709d9a7d0bc3db81c6211c279530f9e1bf78576b9233924d"
freecom_binary_sha256="077808379e896476f7f69d62e6c8989d8fc23e8ef58d1c8492db1ac106784107"
jemm_binary_sha256="4b3046802518739652e0d90b92bbe240ac58870c572e3db9f6bbb94cc7d10ec2"
ctmouse_binary_sha256="822cf550c9e19a22785722d2306aa08ede10ff20bfe931d5a81a15f77c5f363e"
fixed_epoch="1743590400"
mformat_bin="${MFORMAT_BIN:-mformat}"
mcopy_bin="${MCOPY_BIN:-mcopy}"
source_dir="${FREEDOS_SOURCE_DIR:-}"

for command in curl python3 sha256sum touch; do
  command -v "$command" >/dev/null || {
    echo "Required command is missing: $command" >&2
    exit 1
  }
done
for command in "$mformat_bin" "$mcopy_bin"; do
  command -v "$command" >/dev/null || {
    echo "Required mtools command is missing: $command" >&2
    exit 1
  }
done

if [[ -n "$source_dir" ]]; then
  cp "$source_dir/FD14-FloppyEdition.zip" "$work/FD14-FloppyEdition.zip"
  cp "$source_dir/kernel.zip" "$work/kernel.zip"
  cp "$source_dir/freecom.zip" "$work/freecom.zip"
  cp "$source_dir/jemm.zip" "$work/jemm.zip"
  cp "$source_dir/ctmouse.zip" "$work/ctmouse.zip"
else
  curl -fsSL "$fd14_url" -o "$work/FD14-FloppyEdition.zip"
  curl -fsSL "$kernel_url" -o "$work/kernel.zip"
  curl -fsSL "$freecom_url" -o "$work/freecom.zip"
  curl -fsSL "$jemm_url" -o "$work/jemm.zip"
  curl -fsSL "$ctmouse_url" -o "$work/ctmouse.zip"
fi
printf '%s  %s\n' "$fd14_sha256" "$work/FD14-FloppyEdition.zip" | sha256sum -c -
printf '%s  %s\n' "$kernel_sha256" "$work/kernel.zip" | sha256sum -c -
printf '%s  %s\n' "$freecom_sha256" "$work/freecom.zip" | sha256sum -c -
printf '%s  %s\n' "$jemm_sha256" "$work/jemm.zip" | sha256sum -c -
printf '%s  %s\n' "$ctmouse_sha256" "$work/ctmouse.zip" | sha256sum -c -

python3 -c 'import sys, zipfile; zipfile.ZipFile(sys.argv[1]).extract(sys.argv[2], sys.argv[3])' \
  "$work/FD14-FloppyEdition.zip" '144m/x86BOOT.img' "$work"
python3 -c 'import sys, zipfile; zipfile.ZipFile(sys.argv[1]).extract(sys.argv[2], sys.argv[3])' \
  "$work/kernel.zip" 'BIN/KERNL86.SYS' "$work"
python3 -c 'import sys, zipfile; zipfile.ZipFile(sys.argv[1]).extract(sys.argv[2], sys.argv[3])' \
  "$work/freecom.zip" 'BIN/COMMAND.COM' "$work"
python3 -c 'import sys, zipfile; zipfile.ZipFile(sys.argv[1]).extract(sys.argv[2], sys.argv[3])' \
  "$work/jemm.zip" 'BIN/JEMMEX.EXE' "$work"
python3 -c 'import sys, zipfile; zipfile.ZipFile(sys.argv[1]).extract(sys.argv[2], sys.argv[3])' \
  "$work/ctmouse.zip" 'BIN/CTMOUSE.EXE' "$work"

cp "$work/BIN/KERNL86.SYS" "$work/KERNEL.SYS"
cp "$work/BIN/COMMAND.COM" "$work/COMMAND.COM"
cp "$work/BIN/JEMMEX.EXE" "$work/JEMMEX.EXE"
cp "$work/BIN/CTMOUSE.EXE" "$work/CTMOUSE.EXE"
cp "$project_root/third_party/freedos-1.4/guest/FDCONFIG.SYS" "$work/FDCONFIG.SYS"
cp "$project_root/third_party/freedos-1.4/guest/FDAUTO.BAT" "$work/FDAUTO.BAT"
printf '%s  %s\n' "$kernel_binary_sha256" "$work/KERNEL.SYS" | sha256sum -c -
printf '%s  %s\n' "$freecom_binary_sha256" "$work/COMMAND.COM" | sha256sum -c -
printf '%s  %s\n' "$jemm_binary_sha256" "$work/JEMMEX.EXE" | sha256sum -c -
printf '%s  %s\n' "$ctmouse_binary_sha256" "$work/CTMOUSE.EXE" | sha256sum -c -
touch -d "@$fixed_epoch" \
  "$work/KERNEL.SYS" "$work/COMMAND.COM" "$work/JEMMEX.EXE" "$work/CTMOUSE.EXE" \
  "$work/FDCONFIG.SYS" "$work/FDAUTO.BAT"

python3 -c 'import sys; open(sys.argv[2], "wb").write(open(sys.argv[1], "rb").read(512))' \
  "$work/144m/x86BOOT.img" "$work/boot-sector.bin"
mkdir -p "$(dirname "$output")"
python3 -c 'import sys; f=open(sys.argv[1], "wb"); f.truncate(1440 * 1024); f.close()' "$output"
"$mformat_bin" -i "$output" -f 1440 -B "$work/boot-sector.bin" -N 0x52495249 ::
"$mcopy_bin" -i "$output" -m "$work/KERNEL.SYS" ::KERNEL.SYS
"$mcopy_bin" -i "$output" -m "$work/COMMAND.COM" ::COMMAND.COM
"$mcopy_bin" -i "$output" -m "$work/JEMMEX.EXE" ::JEMMEX.EXE
"$mcopy_bin" -i "$output" -m "$work/CTMOUSE.EXE" ::CTMOUSE.EXE
"$mcopy_bin" -i "$output" -mt "$work/FDCONFIG.SYS" ::FDCONFIG.SYS
"$mcopy_bin" -i "$output" -mt "$work/FDAUTO.BAT" ::FDAUTO.BAT

sha256sum "$output"
