#!/usr/bin/env bash
# hwbench.sh — Hardware identification + benchmark → MicroBin
# Usage: curl -Ss sh.janet.ovh/hwbench.sh | sudo bash -s [dysk, np. sda lub nvme0n1]

DISK="${1:-sda}"
MICROBIN_URL="https://pasta.janet.ovh/upload"
TOTAL_STEPS=12

SEP="========================================================"
sep()  { echo "$SEP"; }
hdr()  { echo ""; sep; echo "  $1"; sep; }

log() {
    local STEP="$1"
    local DESC="$2"
    printf "\r\033[K  [%2s/%s] %-55s" "$STEP" "$TOTAL_STEPS" "$DESC" >&2
}
log_done() { printf " \033[32m✓\033[0m\n" >&2; }
log_skip() { printf " \033[33m–\033[0m\n" >&2; }

echo "" >&2
echo "▌    ▌       ▌     ▌ " >&2
echo "▛▌▌▌▌▛▌█▌▛▌▛▘▛▌  ▛▘▛▌" >&2
echo "▌▌▚▚▘▙▌▙▖▌▌▙▖▌▌▗ ▄▌▌▌" >&2
echo "" >&2

{
    echo "$SEP"
    echo "  HARDWARE REPORT — $(date '+%Y-%m-%d %H:%M:%S')"
    echo "  Host: $(hostname) | Kernel: $(uname -r)"
    echo "$SEP"

    # ── 1. inxi ───────────────────────────────────────────────
    log 1 "SYSTEM  inxi -Fxz ..."
    hdr "1. SYSTEM — inxi -Fxz"
    if command -v inxi &>/dev/null; then
        inxi -Fxz -c 0
        log_done
    else
        echo "[!] inxi niedostępny"
        log_skip
    fi

    # ── 2. lscpu ──────────────────────────────────────────────
    log 2 "CPU     lscpu ..."
    hdr "2. CPU — lscpu"
    lscpu
    log_done

    # ── 3. lspci ──────────────────────────────────────────────
    log 3 "PCI     lspci -k ..."
    hdr "3. PCI — lspci -k"
    if command -v lspci &>/dev/null; then
        lspci -k 2>/dev/null
        log_done
    else
        echo "[!] lspci niedostępny"
        log_skip
    fi

    # ── 4. dmidecode ──────────────────────────────────────────
    log 4 "RAM     dmidecode ..."
    hdr "4. RAM — dmidecode"
    if command -v dmidecode &>/dev/null; then
        dmidecode -t memory 2>/dev/null \
            | grep -E "Memory Device$|Size:|Type:|Speed:|Manufacturer:|Part Number:|Locator:" \
            | grep -v "No Module"
        log_done
    else
        echo "[!] dmidecode niedostępny (wymagany root?)"
        log_skip
    fi

    # ── 5. SMART ──────────────────────────────────────────────
    log 5 "DYSK    smartctl — wykrywanie dysków ..."
    hdr "5. SMART — wszystkie dyski (bez USB)"
    if command -v smartctl &>/dev/null; then
        # Wykryj wszystkie dyski blokowe, pomiń USB
        while IFS= read -r line; do
            DEV=$(echo "$line" | awk '{print $1}')
            TRAN=$(echo "$line" | awk '{print $2}')
            # Pomiń USB (pendrive'y, Live ISO)
            if [[ "$TRAN" == "usb" ]]; then
                echo "  /dev/$DEV  [pominięto — USB]"
                continue
            fi
            echo ""
            echo "  --- /dev/$DEV  (transport: ${TRAN:-?}) ---"
            smartctl -H -A -i /dev/"$DEV" 2>&1 \
                | grep -E \
                "Model|Serial|Firmware|Capacity|Rotation|SMART overall|Temperature|Power_On|Reallocated|Pending|Uncorrectable|Media_Wearout|Wear_Leveling|Available_Reservd|SSD Life|NVMe Log|Critical Warning|Data Units|Power Cycles|Unsafe Shutdowns|Error Information"
        done < <(lsblk -d -o NAME,TRAN 2>/dev/null | tail -n +2)
        log_done
    else
        echo "[!] smartctl niedostępny (zainstaluj smartmontools)"
        log_skip
    fi

    # ── 6. 7z multi ───────────────────────────────────────────
    log 6 "CPU     7z bench multi-thread  (może trwać ~30s) ..."
    hdr "6. CPU BENCHMARK — 7z (multi-thread)"
    if command -v 7z &>/dev/null; then
        7z b 2>&1 | grep -E "Dict|Speed|CPU|MIPS|^[0-9]"
        log_done
    else
        echo "[!] 7z niedostępny"
        log_skip
    fi

    # ── 7. 7z single ──────────────────────────────────────────
    log 7 "CPU     7z bench single-thread  (może trwać ~30s) ..."
    hdr "7. CPU BENCHMARK — 7z (single-thread)"
    if command -v 7z &>/dev/null; then
        7z b 4 -mmt1 2>&1 | grep -E "Dict|Speed|CPU|MIPS|^[0-9]"
        log_done
    else
        echo "[!] 7z niedostępny"
        log_skip
    fi

    # ── 8. openssl ────────────────────────────────────────────
    log 8 "CPU     openssl speed ..."
    hdr "8. CPU BENCHMARK — openssl"
    if command -v openssl &>/dev/null; then
        openssl speed sha256 aes-256-cbc 2>&1 | grep -E "^type|^sha|^aes"
        log_done
    else
        echo "[!] openssl niedostępny"
        log_skip
    fi

    # ── 9. hdparm ─────────────────────────────────────────────
    log 9 "DYSK    hdparm /dev/$DISK  (cached + buffered) ..."
    hdr "9. DYSK — hdparm /dev/$DISK (cached + buffered)"
    if command -v hdparm &>/dev/null && [ -b "/dev/$DISK" ]; then
        hdparm -tT "/dev/$DISK" 2>&1
        log_done
    else
        echo "[!] hdparm niedostępny lub /dev/$DISK nie istnieje"
        log_skip
    fi

    # ── 10. dd zapis ──────────────────────────────────────────
    log 10 "DYSK    dd zapis 1 GB  (direct I/O → /tmp) ..."
    hdr "10. DYSK — dd zapis sekwencyjny (1 GB, direct I/O)"
    DD_FILE="/tmp/hwbench_ddtest"
    sync
    DD_WRITE=$(dd if=/dev/zero of="$DD_FILE" bs=1M count=1024 oflag=direct 2>&1 | tail -1)
    echo "Zapis:  $DD_WRITE"
    log_done

    # ── 11. dd odczyt ─────────────────────────────────────────
    log 11 "DYSK    dd odczyt 1 GB ..."
    hdr "11. DYSK — dd odczyt sekwencyjny (1 GB)"
    sync
    echo 3 > /proc/sys/vm/drop_caches 2>/dev/null
    DD_READ=$(dd if="$DD_FILE" of=/dev/null bs=1M 2>&1 | tail -1)
    echo "Odczyt: $DD_READ"
    rm -f "$DD_FILE"
    log_done

    # ── 12. RAM ───────────────────────────────────────────────
    log 12 "RAM     dd przepustowość pamięci ..."
    hdr "12. RAM — dd (przepustowość pamięci)"
    RAM_RESULT=$(dd if=/dev/zero of=/dev/null bs=1M count=4096 2>&1 | tail -1)
    echo "RAM memcpy proxy: $RAM_RESULT"
    log_done

    echo ""
    sep
    echo "  KONIEC RAPORTU — $(date '+%Y-%m-%d %H:%M:%S')"
    sep

} | {
    REPORT_FILE=$(mktemp)
    cat > "$REPORT_FILE"

    echo "" >&2
    echo "" >&2
    echo "  ✓ Zbieranie danych zakończone." >&2
    echo "" >&2

    cat "$REPORT_FILE"

    echo ""
    echo "--- Uploading Report ---"
    echo "--> Sending report to: $MICROBIN_URL"

    PASTE_LINK=$(curl -s -L \
        -F "content=@${REPORT_FILE}" \
        -o /dev/null \
        -w '%{url_effective}' \
        "$MICROBIN_URL")

    rm "$REPORT_FILE"

    if [[ "$PASTE_LINK" == *"https"* ]]; then
        echo ""
        echo "OK! Report uploaded."
        echo "========================================================"
        echo "--> Your link: $PASTE_LINK"
        echo "========================================================"
    else
        echo "BLAD! Nie udalo sie wyslac raportu."
        echo "Odpowiedz serwera: $PASTE_LINK"
    fi
}
