#!/bin/sh

set -e

[ "$(id -u)" -ne 0 ] && echo "Need root. Try: curl ... | sudo bash" && exit 1

ARCH=$(uname -m)

case "$ARCH" in
    x86_64)  V_ARCH=x86_64;  A_ARCH=x86_64;  A_NAME=$ARCH;   B_ARCH=x86_64; B_OK=1 ;;
    aarch64) V_ARCH=aarch64; A_ARCH=aarch64; A_NAME=$ARCH;   B_ARCH=;       B_OK= ;;
    i686|i386) V_ARCH=i686;  A_ARCH=x86;     A_NAME=$ARCH;   B_ARCH=i686;   B_OK=1 ;;
    armv7l)  V_ARCH=armv7l;  A_ARCH=armv7;   A_NAME=$ARCH;   B_ARCH=;       B_OK= ;;
    armv6l)  V_ARCH=armv6l;  A_ARCH=armhf;   A_NAME=$ARCH;   B_ARCH=;       B_OK= ;;
    *) echo "Unsupported arch: $ARCH"; exit 1 ;;
esac

M_ARCH=$ARCH
[ "$M_ARCH" = "i686" ] && M_ARCH=i386

TARGET=$(mktemp -d)

cleanup() {
    umount "$TARGET/proc" 2>/dev/null || true
    umount "$TARGET/sys"  2>/dev/null || true
    umount "$TARGET/dev"  2>/dev/null || true
    [ -n "$TARGET" ] && rm -rf "$TARGET"
}
trap cleanup EXIT INT TERM

VOID_VER=20250202
ALPINE_VER=3.21.7

NL='
'
DISTROS=""
add_distro() {
    DISTROS="${DISTROS}$1|$2${NL}"
}

add_distro "Void Linux (musl)  - $V_ARCH" \
    "https://repo-default.voidlinux.org/live/current/void-$V_ARCH-musl-ROOTFS-$VOID_VER.tar.xz"
add_distro "Void Linux (glibc) - $V_ARCH" \
    "https://repo-default.voidlinux.org/live/current/void-$V_ARCH-ROOTFS-$VOID_VER.tar.xz"
add_distro "Alpine Linux       - $A_NAME" \
    "https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/$A_ARCH/alpine-minirootfs-$ALPINE_VER-$A_ARCH.tar.gz"

[ -n "$B_OK" ] && add_distro "Busybox (minimal)  - $B_ARCH" \
    "https://busybox.net/downloads/binaries/1.35.0-${B_ARCH}-linux-musl/busybox"
add_distro "Mbox (mini box)   - $M_ARCH" \
    "http://porkof48.ru:4000/repo/mbox-$M_ARCH-static"

if [ -n "$1" ]; then
    choice="$1"
else
    echo "System arch: $ARCH"
    echo "Choose a chroot environment:"
    i=1
    printf "%s" "$DISTROS" | while IFS='|' read -r name url; do
        [ -z "$name" ] && continue
        printf "  %d) %s\n" "$i" "$name"
        i=$((i + 1))
    done
    total=$(printf "%s" "$DISTROS" | grep -c '|')
    printf "Select [1-%d]: " "$total"
    read choice < /dev/tty
    [ "$choice" = "q" ] && exit 0
fi

line=$(printf "%s" "$DISTROS" | sed -n "${choice}p")
[ -z "$line" ] && echo "Invalid choice" && exit 1

name=$(echo "$line" | cut -d'|' -f1)
url=$(echo "$line" | cut -d'|' -f2)

echo "Downloading $name..."
wget -q --show-progress "$url" -O /tmp/chroot_dl || { echo "Download failed"; exit 1; }

if echo "$url" | grep -qE 'busybox|mbox'; then
    BIN=busybox
    echo "$url" | grep -q mbox && BIN=mbox
    mkdir -p "$TARGET/bin" "$TARGET/dev" "$TARGET/proc" "$TARGET/sys" "$TARGET/tmp" "$TARGET/etc"
    cp /tmp/chroot_dl "$TARGET/bin/$BIN"
    chmod +x "$TARGET/bin/$BIN"
    if [ "$BIN" = "mbox" ]; then
        chown root:root "$TARGET/bin/mbox"
        chmod 4755 "$TARGET/bin/mbox"
        "$TARGET/bin/mbox" --install "$TARGET/bin/" || true
        chroot "$TARGET" "/bin/pwinit" || true
    else
        for applet in sh ls cp mv rm cat echo mkdir rmdir ln chmod chown ps mount umount vi grep sed cut wget; do
            ln -sf busybox "$TARGET/bin/$applet"
        done
    fi
    rm /tmp/chroot_dl
else
    echo "Extracting..."
    tar xf /tmp/chroot_dl -C "$TARGET" || { echo "Extract failed"; exit 1; }
    rm /tmp/chroot_dl
fi

[ ! -x "$TARGET/bin/sh" ] && [ ! -x "$TARGET/bin/busybox" ] && [ ! -x "$TARGET/bin/mbox" ] && \
    echo "No /bin/sh found in chroot" && exit 1

cp /etc/resolv.conf "$TARGET/etc/" 2>/dev/null || true
mount --bind /proc "$TARGET/proc" 2>/dev/null || true
mount --bind /sys  "$TARGET/sys"  2>/dev/null || true
mount --bind /dev  "$TARGET/dev"  2>/dev/null || true

echo "Entering chroot: $name ($TARGET). Type 'exit' to leave."
chroot "$TARGET" /bin/sh -l < /dev/tty
