ARG MOUSE_ROOTFS_STAGE=rootfs-builder
ARG TARGETARCH
ARG TARGETPLATFORM
ARG MOUSE_ARCH=${TARGETARCH}
ARG MOUSE_TARGET_CONTAINER_PLATFORM=${TARGETPLATFORM}

FROM alpine@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b AS toolchain

ARG MOUSE_ARCH
ENV MOUSE_ARCH=${MOUSE_ARCH}
ENV MOUSE_BUILD_DIR=/work/mouse-src/build

RUN apk add --no-cache \
        bc=1.08.2-r1 \
        build-base=0.5-r4 \
        clang22=22.1.3-r2 \
        cmake=4.2.3-r0 \
        curl=8.21.0-r0 \
        diffutils=3.12-r0 \
        elfutils-dev=0.195-r0 \
        file=5.47-r2 \
        findutils=4.10.0-r1 \
        gawk=5.3.2-r2 \
        lld22=22.1.3-r0 \
        linux-headers=7.0.0-r1 \
        llvm=22-r0 \
        patch=2.8-r0 \
        perl=5.42.2-r0 \
        python3=3.14.5-r0 \
        rustup=1.29.0-r0 \
        rsync=3.4.3-r1 \
        openssl-dev=3.5.7-r0 \
        xz=5.8.3-r0

RUN apk add --no-cache flex=2.6.4-r8

ENV RUSTUP_HOME=/opt/rustup
ENV CARGO_HOME=/opt/cargo
ENV PATH=/opt/cargo/bin:/usr/lib/llvm22/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

RUN case "$MOUSE_ARCH" in \
        x86_64|amd64) rust_target=x86_64-unknown-linux-musl ;; \
        aarch64|arm64) rust_target=aarch64-unknown-linux-musl ;; \
        *) printf '%s\n' "unsupported MOUSE architecture: $MOUSE_ARCH" >&2; exit 2 ;; \
    esac \
    && rustup-init -y \
        --profile minimal \
        --default-toolchain 1.94.0 \
        --target "$rust_target" \
    && chmod -R a+rX /opt/rustup /opt/cargo

WORKDIR /work/mouse-src
ARG MOUSE_BUILD_JOBS=8
ENV MOUSE_BUILD_JOBS=${MOUSE_BUILD_JOBS}

FROM scratch AS toolchain-sources
COPY mouse-sources/toolchain/ /opt/mouse-sources/

FROM scratch AS kernel-sources
COPY mouse-sources/kernel/ /opt/mouse-sources/

FROM scratch AS firmware-sources
COPY mouse-sources/firmware/ /opt/mouse-firmware-sources/

FROM scratch AS device-firmware-sources
COPY mouse-sources/device-firmware/ /opt/mouse-sources/

FROM scratch AS wireless-sources
COPY mouse-sources/wireless/ /opt/mouse-sources/

FROM scratch AS autotools-sources
COPY mouse-sources/autotools/ /opt/mouse-sources/

FROM scratch AS facilities-sources
COPY mouse-sources/facilities/ /opt/mouse-sources/

FROM scratch AS storage-sources
COPY mouse-sources/storage/ /opt/mouse-sources/

FROM scratch AS software-sources
COPY mouse-sources/software/ /opt/mouse-sources/

FROM --platform=${MOUSE_TARGET_CONTAINER_PLATFORM} alpine@sha256:28bd5fe8b56d1bd048e5babf5b10710ebe0bae67db86916198a6eec434943f8b AS mouse-ports-seed-tools

RUN apk add --no-cache \
        bmake \
		bison \
        build-base \
		bash \
        cargo \
        curl \
        git \
		gperf \
		gettext \
		libxslt \
        linux-headers \
        meson \
        ninja \
		patch \
		pkgconf \
		perl \
		python3 \
        rust \
        tzdata

FROM toolchain AS kernel-builder

RUN apk add --no-cache bison=3.8.2-r3

COPY --from=kernel-sources /opt/mouse-sources/ /opt/mouse-sources/
COPY mouse-src/base/kernel/ /work/mouse-src/base/kernel/
COPY mouse-src/scripts/mouse-arch.sh /work/mouse-src/scripts/mouse-arch.sh
COPY mouse-src/scripts/build-kernel.sh /work/mouse-src/scripts/build-kernel.sh

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    /work/mouse-src/scripts/build-kernel.sh

FROM kernel-builder AS kernel-test-builder

COPY mouse-src/tests/fixtures/kernel-module/ /work/mouse-src/tests/fixtures/kernel-module/
COPY mouse-src/scripts/build-kernel-test-module.sh /work/mouse-src/scripts/build-kernel-test-module.sh

RUN /work/mouse-src/scripts/build-kernel-test-module.sh

FROM kernel-builder AS kernel-ready

RUN install -m 0444 /dev/null /kernel-ready

FROM toolchain AS static-base-bootstrap

RUN apk add --no-cache byacc=20260126-r0

COPY --from=kernel-ready /kernel-ready /tmp/kernel-ready

COPY --from=toolchain-sources /opt/mouse-sources/ /opt/mouse-sources/
COPY --from=kernel-sources /opt/mouse-sources/ /opt/mouse-sources/
COPY --from=software-sources /opt/mouse-sources/ /opt/mouse-sources/
COPY mouse-src/base/support/cross-compiler-driver /work/mouse-src/base/support/cross-compiler-driver
COPY mouse-src/base/support/rust-eh-personality.c /work/mouse-src/base/support/rust-eh-personality.c
COPY mouse-src/scripts/mouse-arch.sh /work/mouse-src/scripts/mouse-arch.sh
COPY mouse-src/scripts/configure-cross-toolchain.sh /work/mouse-src/scripts/configure-cross-toolchain.sh
COPY mouse-src/scripts/static-base/common.sh /work/mouse-src/scripts/static-base/common.sh
COPY mouse-src/scripts/static-base/bootstrap.sh /work/mouse-src/scripts/static-base/bootstrap.sh

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/bootstrap.sh

FROM static-base-bootstrap AS static-base-libraries

COPY mouse-src/scripts/static-base/libraries-and-accounts.sh /work/mouse-src/scripts/static-base/libraries-and-accounts.sh

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/libraries-and-accounts.sh

FROM static-base-libraries AS static-base-toolchain

COPY mouse-src/scripts/static-base/native-toolchain.sh /work/mouse-src/scripts/static-base/native-toolchain.sh

RUN MOUSE_NATIVE_TOOLCHAIN_PHASE=llvm \
    MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/native-toolchain.sh

RUN MOUSE_NATIVE_TOOLCHAIN_PHASE=package-tools \
    MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/native-toolchain.sh

COPY mouse-src/scripts/static-base/dynamic-runtime.sh /work/mouse-src/scripts/static-base/dynamic-runtime.sh

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/dynamic-runtime.sh

FROM toolchain AS autotools-builder

ARG MOUSE_BUILD_JOBS=8

COPY --from=static-base-toolchain /work/mouse-src/build/static/sysroot /work/mouse-src/build/static/sysroot
COPY --from=static-base-toolchain /work/mouse-src/build/static/cross-tools /work/mouse-src/build/static/cross-tools
COPY --from=static-base-toolchain /work/mouse-src/build/static/rust-eh-personality.o /work/mouse-src/build/static/rust-eh-personality.o
COPY --from=autotools-sources /opt/mouse-sources/ /opt/mouse-sources/
COPY mouse-src/base/patches/m4-1.4.21-aarch64.patch /work/mouse-src/base/patches/m4-1.4.21-aarch64.patch
COPY mouse-src/scripts/mouse-arch.sh /usr/libexec/mouse-arch.sh
COPY mouse-src/scripts/build-world-autotools.sh /usr/libexec/mouse-build-world-autotools

RUN MOUSE_BUILD_JOBS="$MOUSE_BUILD_JOBS" \
    /usr/libexec/mouse-build-world-autotools

FROM static-base-toolchain AS static-base-system

RUN apk add --no-cache bash=5.3.9-r1

COPY --from=autotools-builder /opt/mouse-autotools/ /work/mouse-src/build/static/rootfs/
COPY mouse-src/base/patches/chimerautils-native-cdefs.patch /work/mouse-src/base/patches/chimerautils-native-cdefs.patch
COPY mouse-src/base/patches/chimerautils-scanflike.patch /work/mouse-src/base/patches/chimerautils-scanflike.patch
COPY mouse-src/base/patches/tcsh-gethost-native.patch /work/mouse-src/base/patches/tcsh-gethost-native.patch
COPY mouse-src/scripts/static-base/system-services.sh /work/mouse-src/scripts/static-base/system-services.sh

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/system-services.sh

FROM static-base-system AS static-base-wireless

COPY --from=kernel-builder /usr/bin/bison /usr/bin/bison
COPY --from=kernel-builder /usr/share/bison /usr/share/bison

COPY --from=wireless-sources /opt/mouse-sources/ /opt/mouse-sources/
COPY mouse-src/base/patches/wpa-supplicant-2.11-openssl-4.patch /work/mouse-src/base/patches/wpa-supplicant-2.11-openssl-4.patch
COPY mouse-src/scripts/static-base/wireless.sh /work/mouse-src/scripts/static-base/wireless.sh

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/wireless.sh

FROM static-base-wireless AS static-base-facilities

COPY --from=facilities-sources /opt/mouse-sources/ /opt/mouse-sources/
COPY mouse-src/base/patches/nftables-posix-configure.patch /work/mouse-src/base/patches/nftables-posix-configure.patch
COPY mouse-src/scripts/static-base/facilities.sh /work/mouse-src/scripts/static-base/facilities.sh

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/facilities.sh

FROM static-base-facilities AS static-base-storage

COPY --from=storage-sources /opt/mouse-sources/ /opt/mouse-sources/
COPY mouse-src/scripts/static-base/storage.sh /work/mouse-src/scripts/static-base/storage.sh

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/storage.sh

FROM static-base-storage AS static-base-builder

COPY mouse-src/scripts/static-base/finish.sh /work/mouse-src/scripts/static-base/finish.sh

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    sh /work/mouse-src/scripts/static-base/finish.sh

FROM mouse-ports-seed-tools AS mouse-ports-seed-builder

COPY mouse-ports/ /usr/local/src/mouse-ports/
COPY mouse-src/scripts/build-mouse-ports-seed.sh /usr/libexec/mouse-build-ports-seed

RUN /usr/libexec/mouse-build-ports-seed

FROM toolchain AS btrfs-image-builder

RUN apk add --no-cache \
        coreutils=9.11-r0 \
        mtools=4.0.49-r0 \
        pkgconf=2.5.1-r0 \
        sfdisk=2.42.1-r0 \
        util-linux-dev=2.42.1-r0 \
        zlib-dev=1.3.2-r0 \
        zstd-dev=1.5.7-r2

COPY --from=storage-sources /opt/mouse-sources/btrfs-progs-v7.1.tar.xz /opt/
COPY --from=storage-sources /opt/mouse-sources/limine-binary-12.5.2.tar.xz /opt/mouse-sources/limine-binary-12.5.2.tar.xz
COPY mouse-src/scripts/build-btrfs-image-tool.sh /usr/libexec/mouse-build-btrfs-image-tool

RUN MOUSE_BUILD_JOBS="$MOUSE_BUILD_JOBS" \
    /usr/libexec/mouse-build-btrfs-image-tool

FROM toolchain AS device-firmware-builder

RUN apk add --no-cache coreutils=9.11-r0

COPY --from=device-firmware-sources /opt/mouse-sources/linux-firmware-20260622.tar.xz /opt/mouse-sources/

RUN tar -xf /opt/mouse-sources/linux-firmware-20260622.tar.xz -C /work \
    && make -s -C /work/linux-firmware-20260622 \
        DESTDIR=/opt/mouse-device-firmware \
        install-xz

FROM static-base-builder AS image-commands-builder

COPY mouse-src/base/support/mouse-bootenv /work/mouse-src/base/support/mouse-bootenv
COPY mouse-src/base/support/mouse-auth.c /work/mouse-src/base/support/mouse-auth.c
COPY mouse-src/base/support/mouse-package /work/mouse-src/base/support/mouse-package
COPY mouse-src/scripts/audit-static-base.sh /work/mouse-src/scripts/audit-static-base.sh
COPY mouse-src/scripts/build-image-commands.sh /work/mouse-src/scripts/build-image-commands.sh

RUN /work/mouse-src/scripts/build-image-commands.sh \
    && /work/mouse-src/scripts/audit-static-base.sh /work/mouse-src/build/static/rootfs

FROM image-commands-builder AS test-fixtures-builder

COPY mouse-src/tests/fixtures/mouse-echo/mouse-echo.c /work/mouse-src/tests/fixtures/mouse-echo/mouse-echo.c

RUN . /work/mouse-src/scripts/mouse-arch.sh \
    && /work/mouse-src/build/static/cross-tools/bin/$MOUSE_CROSS_TARGET-cc \
        -O2 -Wall -Wextra -Werror \
        /work/mouse-src/tests/fixtures/mouse-echo/mouse-echo.c \
        -o /opt/mouse-echo

FROM image-commands-builder AS cheesed-builder

COPY mouse-cargo/ /opt/cargo/
COPY mouse-src/base/cheesed/ /work/mouse-src/base/cheesed/

RUN . /work/mouse-src/scripts/mouse-arch.sh \
    && CARGO_NET_OFFLINE=true CHEESED_TARGET="$MOUSE_RUST_TARGET" \
        /work/mouse-src/base/cheesed/scripts/build-static.sh \
    && install -m 0755 \
        /work/mouse-src/base/cheesed/target/$MOUSE_RUST_TARGET/release/cheesed \
        /opt/cheesed

FROM btrfs-image-builder AS rootfs-common

COPY --from=cheesed-builder /work/mouse-src/build/static/rootfs /work/mouse-src/build/static/rootfs
COPY --from=cheesed-builder /opt/cheesed /opt/cheesed
COPY --from=kernel-builder /work/mouse-src/build/vmlinuz-virt /work/mouse-src/build/vmlinuz-virt
COPY --from=mouse-ports-seed-builder /opt/mouse-ports-seed /opt/mouse-ports-seed
COPY mouse-src/base/rootfs/ /work/mouse-src/base/rootfs/
COPY mouse-ports-revision /work/mouse-ports-revision
COPY mouse-src/base/patches/rc.subr-cgroup.patch /work/mouse-src/base/patches/rc.subr-cgroup.patch
COPY mouse-src/scripts/audit-static-base.sh /work/mouse-src/scripts/audit-static-base.sh
COPY mouse-src/scripts/mouse-arch.sh /work/mouse-src/scripts/mouse-arch.sh
COPY mouse-src/scripts/build-image.sh /work/mouse-src/scripts/build-image.sh
COPY mouse-src/scripts/build-boot-disk.sh /work/mouse-src/scripts/build-boot-disk.sh
COPY mouse-src/base/limine.conf /work/mouse-src/base/limine.conf

FROM rootfs-common AS rootfs-builder

COPY --from=kernel-builder /work/mouse-src/build/kernel/modules /opt/mouse-kernel-modules
COPY --from=device-firmware-builder /opt/mouse-device-firmware /opt/mouse-device-firmware

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    MOUSE_CHEESED_BINARY=/opt/cheesed \
    MOUSE_BTRFS_IMAGE_TOOL=/opt/mkfs.btrfs \
    MOUSE_PORTS_SEED=/opt/mouse-ports-seed \
    MOUSE_KERNEL_MODULES=/opt/mouse-kernel-modules \
    MOUSE_DEVICE_FIRMWARE=/opt/mouse-device-firmware \
    /work/mouse-src/scripts/build-image.sh

FROM rootfs-common AS rootfs-test-builder

COPY --from=kernel-test-builder /work/mouse-src/build/kernel/test-modules /opt/mouse-kernel-modules
COPY --from=device-firmware-builder /opt/mouse-device-firmware /opt/mouse-device-firmware
COPY --from=test-fixtures-builder /opt/mouse-echo /opt/mouse-echo
COPY mouse-src/tests/fixtures/ /work/mouse-src/tests/fixtures/

RUN MOUSE_SOURCE_DIR=/opt/mouse-sources \
    MOUSE_CHEESED_BINARY=/opt/cheesed \
    MOUSE_BTRFS_IMAGE_TOOL=/opt/mkfs.btrfs \
    MOUSE_PORTS_SEED=/opt/mouse-ports-seed \
    MOUSE_KERNEL_MODULES=/opt/mouse-kernel-modules \
    MOUSE_DEVICE_FIRMWARE=/opt/mouse-device-firmware \
    MOUSE_MOUSE_ECHO_BINARY=/opt/mouse-echo \
    MOUSE_INCLUDE_TEST_FIXTURES=1 \
    /work/mouse-src/scripts/build-image.sh

FROM ${MOUSE_ROOTFS_STAGE} AS selected-rootfs

FROM selected-rootfs AS compressed-rootfs

RUN gzip -1 /work/mouse-src/build/mouse-disk.img \
    && gzip -t /work/mouse-src/build/mouse-disk.img.gz

FROM toolchain AS artifact-packer

COPY --from=compressed-rootfs /work/mouse-src/build/mouse-disk.img.gz /
COPY --from=firmware-sources /opt/mouse-firmware-sources/ /opt/mouse-sources/
COPY mouse-src/scripts/extract-build-firmware.sh /usr/libexec/mouse-extract-build-firmware

RUN /usr/libexec/mouse-extract-build-firmware

FROM scratch AS artifacts

COPY --from=kernel-builder /work/mouse-src/build/vmlinuz-virt /
COPY --from=artifact-packer /mouse-disk.img.gz /
COPY --from=artifact-packer /uefi-code.fd /
