#!/bin/bash
# DRIVE WIPE - ALL DRIVES, NO EXCEPTIONS
set -uo pipefail

# Colors
R=$'\033[1;31m'; G=$'\033[1;32m'; Y=$'\033[1;33m'; C=$'\033[1;36m'
DIM=$'\033[0;37m'; RST=$'\033[0m'; BOLD=$'\033[1m'
BGG=$'\033[42m'; BGR=$'\033[41m'; BLK=$'\033[0;30m'

# Box drawing
W=88
rep() { local i o=''; for((i=0;i<$2;i++)); do o+="$1"; done; printf '%s' "$o"; }
_TL() { printf '\xe2\x95\x94'; }
_EQ() { printf '\xe2\x95\x90'; }
_TR() { printf '\xe2\x95\x97'; }
_ML() { printf '\xe2\x95\xa0'; }
_MR() { printf '\xe2\x95\xa3'; }
_VB() { printf '\xe2\x95\x91'; }
_BL() { printf '\xe2\x95\x9a'; }
_BR() { printf '\xe2\x95\x9d'; }
_HD() { printf '\xe2\x94\x80'; }
hline() { rep "$(_EQ)" $W; }

box_open() {
    local title="$1" color="${2:-$R}"
    local tlen=${#title} lpad rpad
    lpad=$(( (W - tlen - 2) / 2 ))
    rpad=$(( W - tlen - 2 - lpad ))
    printf '\n'
    printf "%b%s%s%s%b\n" "$color" "$(_TL)" "$(hline)" "$(_TR)" "$RST"
    printf "%b%s%s%b%b%b %s %b%b%s%s%b\n" \
        "$color" "$(_VB)" "$(rep ' ' $lpad)" "$RST" \
        "$BOLD" "$Y" "$title" "$RST" \
        "$color" "$(rep ' ' $rpad)" "$(_VB)" "$RST"
    printf "%b%s%s%s%b\n" "$color" "$(_ML)" "$(hline)" "$(_MR)" "$RST"
}

box_close() {
    printf "%b%s%s%s%b\n" "${1:-$R}" "$(_BL)" "$(hline)" "$(_BR)" "$RST"
}

bline() {
    local text="$1" bc="${2:-$R}"
    local vis pad
    vis=$(printf '%s' "$text" | sed -E 's/\x1b\[[0-9;:]*[mGKHFJA-Za-z]//g')
    pad=$(( W - ${#vis} ))
    [ $pad -lt 0 ] && pad=0
    printf "%b%s%b%s%s%b%s%b\n" "$bc" "$(_VB)" "$RST" \
        "$text" "$(rep ' ' $pad)" "$bc" "$(_VB)" "$RST"
}

bdiv() {
    bline "$(printf "  %b%s%b" "$DIM" "$(rep "$(_HD)" $((W-2)))" "$RST")"
}

log()  { bline "$(printf "  %b%s%b" "$DIM"  "$1" "$RST")"; }
ok()   { bline "$(printf "  %b%b? %s%b"    "$BOLD" "$G"   "$1" "$RST")"; }
fail() { bline "$(printf "  %b%b? %s%b"    "$BOLD" "$R"   "$1" "$RST")"; }

WIPED=0
FAILED=0

# Wipe drive - first 100MB + last 100MB
wipe_drive() {
    local dev="$1" label="$2"
    local sectors errors=0
    
    if [ ! -b "$dev" ]; then
        fail "$label: not a block device"
        FAILED=$(( FAILED + 1 ))
        return 1
    fi
    
    sectors=$(blockdev --getsz "$dev" 2>/dev/null)
    if [ -z "$sectors" ] || [ "$sectors" -eq 0 ] 2>/dev/null; then
        fail "$label: cannot read size"
        FAILED=$(( FAILED + 1 ))
        return 1
    fi
    
    local wipe_sectors=204800
    
    log "$label: wiping first 100MB..."
    if ! dd if=/dev/zero of="$dev" bs=512 count=$wipe_sectors conv=fsync 2>/dev/null; then
        errors=$(( errors + 1 ))
    fi
    
    log "$label: wiping last 100MB..."
    local seek_at=$(( sectors - wipe_sectors ))
    [ "$seek_at" -lt 0 ] && seek_at=0
    if ! dd if=/dev/zero of="$dev" bs=512 seek=$seek_at count=$wipe_sectors conv=fsync 2>/dev/null; then
        errors=$(( errors + 1 ))
    fi
    
    if [ "$errors" -eq 0 ]; then
        ok "$label: wiped"
        WIPED=$(( WIPED + 1 ))
        return 0
    else
        fail "$label: wipe failed"
        FAILED=$(( FAILED + 1 ))
        return 1
    fi
}

# =============================================================================
#  MAIN
# =============================================================================

box_open "DRIVE WIPE - ALL DRIVES" "$R"
bline "$(printf "  %b%bWARNING: This will destroy ALL data on ALL drives.%b" "$BOLD" "$R" "$RST")"
bline "$(printf "  %b%bThis cannot be undone.%b" "$BOLD" "$R" "$RST")"
bdiv

# Stop all software RAID
log "Stopping all mdadm arrays..."
mdadm --stop --scan 2>/dev/null
sleep 1

# Zero all md superblocks
log "Clearing mdadm superblocks..."
for dev in /dev/sd[a-z] /dev/nvme[0-9]n[0-9]; do
    [ -b "$dev" ] && mdadm --zero-superblock "$dev" 2>/dev/null
done
sleep 1

# Clear RAID controller (if storcli available)
if command -v storcli >/dev/null 2>&1; then
    log "Clearing RAID controller..."
    storcli /call /vall delete force >/dev/null 2>&1
    storcli /call /eall /sall set jbod >/dev/null 2>&1
    storcli /call /fall delete >/dev/null 2>&1
    sleep 1
fi

# Rescan
log "Rescanning block devices..."
for host in /sys/class/scsi_host/host*/scan; do
    [ -w "$host" ] && echo "- - -" > "$host" 2>/dev/null
done
udevadm trigger --subsystem-match=block 2>/dev/null
udevadm settle --timeout=10 2>/dev/null
sleep 2

bdiv
bline "$(printf "  %b%bWIPING ALL BLOCK DEVICES%b" "$BOLD" "$R" "$RST")"
bdiv

# Get ALL block devices
declare -a ALL_DRIVES=()
while IFS= read -r line; do
    name=$(echo "$line" | awk '{print $1}')
    type=$(echo "$line" | awk '{print $2}')
    if [ "$type" = "disk" ]; then
        ALL_DRIVES+=("/dev/$name")
    fi
done < <(lsblk -dno NAME,TYPE 2>/dev/null)

if [ "${#ALL_DRIVES[@]}" -eq 0 ]; then
    fail "No block devices found"
    box_close "$R"
    exit 1
fi

log "Found ${#ALL_DRIVES[@]} drive(s) - wiping all..."
echo ""

# Wipe every drive
for dev in "${ALL_DRIVES[@]}"; do
    model=$(smartctl -a "$dev" 2>/dev/null | grep -E "Device Model|Model Number" | head -1 | cut -d: -f2 | xargs)
    [ -z "$model" ] && model="(unknown)"
    label="$(basename "$dev") ($model)"
    wipe_drive "$dev" "$label"
done

bdiv
log "Clearing all metadata..."

# Aggressive mdadm cleanup
mdadm --stop --scan 2>/dev/null
sleep 1

# Zero superblocks on all physical drives (this is correct)
for dev in /dev/sd[a-z] /dev/nvme[0-9]n[0-9]; do
    [ -b "$dev" ] && mdadm --zero-superblock "$dev" 2>/dev/null
done
sleep 1

# Stop any lingering md arrays
for md_dev in /dev/md*; do
    [ -e "$md_dev" ] && mdadm --manage --stop "$md_dev" 2>/dev/null
done
sleep 1

# Force-delete md arrays from kernel
for md_dev in /dev/md*; do
    if [ -e "$md_dev" ]; then
        mdadm --manage --fail "$md_dev" 2>/dev/null
        mdadm --manage --stop "$md_dev" --force 2>/dev/null
    fi
done
sleep 1

# Remove from sysfs directly - tell kernel md array is gone
for md_path in /sys/block/md*; do
    [ -d "$md_path" ] || continue
    # Write to array_state to stop the array at kernel level
    echo "clear" > "${md_path}/md/array_state" 2>/dev/null || true
done
sleep 1

# Remove device files
rm -f /dev/md* /dev/md/* 2>/dev/null

# Remove config files
rm -f /etc/mdadm/mdadm.conf /etc/mdadm.conf 2>/dev/null

# Wipe all signatures (destroys remaining metadata)
log "Wiping all filesystem/raid signatures..."
for dev in /dev/sd[a-z] /dev/nvme[0-9]n[0-9]; do
    [ -b "$dev" ] && wipefs -a -f "$dev" 2>/dev/null
done
sleep 1

# Force kernel to completely forget md subsystem
echo 0 > /proc/sys/dev/raid/speed_limit_max 2>/dev/null
mdadm --stop --scan 2>/dev/null

# Reload udev (forces re-scan)
udevadm control --reload-rules 2>/dev/null
udevadm control --reload 2>/dev/null
sleep 1
udevadm trigger --action=remove 2>/dev/null
sleep 1
udevadm trigger --action=add 2>/dev/null
sleep 2

ok "All metadata and signatures cleared"

# Verify
bdiv
log "Verifying wipe completion..."
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT 2>/dev/null | while IFS= read -r line; do
    [ -z "$line" ] && continue
    if echo "$line" | grep -q "^NAME"; then
        bline "$(printf "  %b%s%b" "$BOLD" "$line" "$RST")"
    elif echo "$line" | grep -qE "^(sd|nvme|md)"; then
        bline "$(printf "  %b%s%b" "$C" "$line" "$RST")"
    fi
done

bdiv
bline "$(printf "  %b%b%b COMPLETE %b  %d wiped, %d failed" "$BGG" "$BLK" "$BOLD" "$RST" "$WIPED" "$FAILED")"

box_close "$R"

if [ "$FAILED" -gt 0 ]; then
    exit 1
else
    exit 0
fi