#!/bin/sh
# bee-initramfs-wipe — interactive disk wipe running entirely in the initramfs.
# Triggered by bee.wipe=all on the kernel cmdline (via local-premount hook).
# Works before squashfs is mounted, so it runs even when live boot fails.

RED='\033[1;31m'
YEL='\033[1;33m'
GRN='\033[1;32m'
CYN='\033[1;36m'
NC='\033[0m'

p()  { printf '%b\n' "$*"; }
pp() { printf '%b'   "$*"; }

banner() {
    p ""
    p "${RED}╔══════════════════════════════════════════════════════════╗${NC}"
    p "${RED}║            BEE DRIVE WIPE — initramfs stage              ║${NC}"
    p "${RED}╚══════════════════════════════════════════════════════════╝${NC}"
    p ""
}

# ── find boot device ─────────────────────────────────────────────────────────
boot_dev() {
    local label token
    for token in $(cat /proc/cmdline 2>/dev/null); do
        case "$token" in
            live-media-label=*) label="${token#*=}" ;;
        esac
    done
    [ -z "$label" ] && return

    local dev
    dev=$(blkid -L "$label" 2>/dev/null) || return
    # strip partition suffix: /dev/sdb1 → /dev/sdb, /dev/nvme0n1p1 → /dev/nvme0n1
    echo "$dev" | sed 's/p\?[0-9]\+$//'
}

# ── enumerate candidate disks ─────────────────────────────────────────────────
list_disks() {
    local boot
    boot=$(boot_dev)

    lsblk -d -n -o NAME,TYPE,SIZE,MODEL 2>/dev/null | while read -r name type size model; do
        [ "$type" = "disk" ] || continue
        [ "$size" = "0B"  ] && continue
        local dev="/dev/$name"
        [ "$dev" = "$boot" ] && continue
        printf '%s\t%s\t%s\n' "$dev" "$size" "${model:-}"
    done
}

# ── wipe one disk ─────────────────────────────────────────────────────────────
wipe_one() {
    local dev="$1"
    p ""
    p "=== ${YEL}${dev}${NC} ==="

    if echo "$dev" | grep -q '^/dev/nvme'; then
        if nvme format --ses=1 "$dev" 2>&1; then
            p "  ${GRN}nvme format OK${NC}"
            blockdev --flushbufs "$dev" 2>/dev/null || true
            return
        fi
        p "  nvme format failed — falling back to blkdiscard"
    fi

    if blkdiscard -f "$dev" 2>&1; then
        p "  ${GRN}blkdiscard OK${NC}"
        blockdev --flushbufs "$dev" 2>/dev/null || true
        return
    fi

    p "  blkdiscard not supported — zeroing partition tables (HDD fallback)"
    local size_bytes mb32 skip
    size_bytes=$(blockdev --getsize64 "$dev" 2>/dev/null || echo 0)
    mb32=$(( 32 * 1024 * 1024 ))

    dd if=/dev/zero of="$dev" bs=4M count=8 conv=fsync status=progress 2>&1 || true

    if [ "$size_bytes" -gt $(( mb32 * 2 )) ]; then
        skip=$(( (size_bytes - mb32) / (4 * 1024 * 1024) ))
        dd if=/dev/zero of="$dev" bs=4M count=8 seek="$skip" conv=fsync status=progress 2>&1 || true
    fi

    blockdev --flushbufs "$dev" 2>/dev/null || true
    p "  ${GRN}done (partition tables zeroed)${NC}"
}

# ── main ──────────────────────────────────────────────────────────────────────
banner

BOOT=$(boot_dev)
[ -n "$BOOT" ] && p "Boot device (excluded): ${CYN}${BOOT}${NC}\n"

# build indexed list
i=0
DEVS=""
IFS='
'
for line in $(list_disks); do
    i=$(( i + 1 ))
    dev=$(echo "$line" | cut -f1)
    size=$(echo "$line" | cut -f2)
    model=$(echo "$line" | cut -f3)
    DEVS="${DEVS}${i}:${dev}:${size}:${model}
"
    printf "  ${CYN}[%d]${NC}  %-16s %8s  %s\n" "$i" "$dev" "$size" "$model"
done
IFS='
'

if [ "$i" -eq 0 ]; then
    p "\nNo physical disks found (boot device excluded)."
    p "Dropping to shell — type 'exit' to continue boot."
    exec /bin/sh
fi

p ""
pp "Enter numbers to wipe (space-separated), ${YEL}all${NC} for all, ${YEL}q${NC} to abort: "
read -r SELECTION

case "$SELECTION" in
    q|Q|'') p "\nAborted."; exec /bin/sh ;;
esac

# resolve selection → list of devs
SELECTED=""
if [ "$SELECTION" = "all" ] || [ "$SELECTION" = "ALL" ]; then
    SELECTED=$(echo "$DEVS" | grep -v '^$' | cut -d: -f2 | tr '\n' ' ')
else
    for num in $SELECTION; do
        match=$(echo "$DEVS" | grep "^${num}:" | cut -d: -f2)
        if [ -z "$match" ]; then
            p "${RED}Unknown index: ${num}${NC}"; exec /bin/sh
        fi
        SELECTED="${SELECTED}${match} "
    done
fi

SELECTED=$(echo "$SELECTED" | tr -s ' ' | sed 's/ $//')

p ""
p "Selected for wipe: ${YEL}${SELECTED}${NC}"
p "${RED}WARNING: This is IRREVERSIBLE. All data on the selected disks will be lost.${NC}"
p ""
pp "Type  YES  to confirm, anything else to abort: "
read -r CONFIRM

if [ "$CONFIRM" != "YES" ]; then
    p "\nAborted — no disks were touched."
    exec /bin/sh
fi

p "\nStarting wipe..."
for dev in $SELECTED; do
    wipe_one "$dev"
done

sync
p ""
p "${GRN}=== All selected disks wiped and flushed. ===${NC}"
p ""
pp "Press Enter to reboot..."
read -r _
reboot
