#!/usr/bin/env bash
source "$(dirname -- "${BASH_SOURCE[0]}")/lib.sh"
[[ $# == 0 || ( $# == 1 && $1 == --rebuild ) ]] || die 'Usage: tools/build-kernel [--rebuild]'
cd "$FDS_ROOT"
use_xbps
check_void_pin
tools/prepare-void
mkdir -p out/logs out/packages out/manifests
package=fds-kernel-6.12.87_1.aarch64.xbps
inputs=$(mktemp "$FDS_ROOT/out/kernel-inputs.XXXXXX")
trap 'rm -f "$inputs"' EXIT
sha256sum VOID_PACKAGES_COMMIT config/xbps-src.conf tools/build-kernel \
    image/kernel/dasung.config packages/fds-kernel/template packages/fds-kernel/files/fds.config >"$inputs"
if [[ $# == 0 && -s out/kernel/build-inputs.sha256 && -s out/kernel/payload.sha256 ]] && \
    cmp -s "$inputs" out/kernel/build-inputs.sha256 && \
    sha256sum -c out/kernel/artifacts.sha256 >/dev/null 2>&1 && \
    (cd out/kernel && sha256sum -c payload.sha256 >/dev/null 2>&1); then
    XBPS_ARCH=aarch64 xbps-rindex -fa "out/packages/$package"
    printf 'PASS: reusing verified Pi kernel build with unchanged recorded inputs\n'
    exit 0
fi
(
    cd "$FDS_VOID"
    if [[ ${1:-} == --rebuild ]]; then
        xbps_src -f -a aarch64 pkg fds-kernel
    else
        xbps_src -a aarch64 pkg fds-kernel
    fi
) 2>&1 | tee out/logs/xbps-fds-kernel.log
cp "$FDS_VOID/hostdir/binpkgs/$package" out/packages/
XBPS_ARCH=aarch64 xbps-rindex -fa "out/packages/$package"
work=$(mktemp -d "$FDS_ROOT/out/kernel-build.XXXXXX")
tar -xf "out/packages/$package" -C "$work"
[[ -s $work/boot/kernel_2712.img && -s $work/boot/bcm2712-rpi-5-b.dtb ]] || die 'Missing Pi 5 kernel/DTB'
# Reject stale packages missing any boot-critical or display-protection setting.
while IFS= read -r setting; do
    case "$setting" in
        CONFIG_*=*)
            grep -Fqx "$setting" "$work/boot/config-fds" || die "Kernel requirement missing: $setting (rebuild with tools/build-kernel --rebuild)"
            ;;
        '# CONFIG_'*' is not set')
            # Kconfig may omit disabled symbols whose dependencies are absent.
            symbol=${setting#\# }
            symbol=${symbol% is not set}
            ! grep -Eq "^${symbol}=[ym]$" "$work/boot/config-fds" || die "Kernel requirement violated: $setting (rebuild with tools/build-kernel --rebuild)"
            ;;
    esac
done < <(cat packages/fds-kernel/files/fds.config image/kernel/dasung.config)
sha256sum "out/packages/$package" "$work/boot/kernel_2712.img" "$work/boot/bcm2712-rpi-5-b.dtb" >"$work/artifacts.sha256"
cp "$work/artifacts.sha256" out/manifests/kernel-artifacts.sha256
cp "$inputs" "$work/build-inputs.sha256"
(cd "$work" && find boot usr -type f -print0 | sort -z | xargs -0 sha256sum >payload.sha256)
ln -sfn "${work##*/}" out/kernel
printf 'PASS: pinned Pi 5 kernel, modules, DTBs and boot configuration built\n'
printf 'SKIP: physical Pi boot and display behavior require hardware\n'
