#!/usr/bin/env bash
# deploy-miner-rig.sh — drop the pearl-miner on a rented GPU box and start it.
# Use case: just rented a Clore/vast.ai box, SSH in, run this, get mining.
#
# Required env vars (or pass via flags):
#   POOL=host:port          (default: 45.198.0.231:9200)
#   WALLET=prl1...          your Pearl wallet (block-reward destination)
#   WORKER=name             worker name (default: hostname)
#   BINARY_URL=https://...  where to fetch pearl-miner binary
#
# Usage:
#   ssh root@<rig>:<port>
#   WALLET=prl1... bash deploy-miner-rig.sh
#
# Or one-shot from local:
#   ssh root@<rig> "WALLET=prl1... bash -s" < deploy-miner-rig.sh

set -euo pipefail

POOL="${POOL:-45.198.0.231:9200}"
WORKER="${WORKER:-$(hostname)}"
BATCH="${BATCH:-16384}"
POOL_URL="${POOL_URL:-http://${POOL%:*}:9201}"
BINARY_URL="${BINARY_URL:-$POOL_URL/files/pearl-miner}"

# Sanity: confirm a GPU is present
COMPUTE_CAP=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader 2>/dev/null \
              | head -1 | tr -d '.' | tr -d ' ')
if [ -z "$COMPUTE_CAP" ]; then
    echo "ERROR: nvidia-smi failed, no GPU detected"
    exit 1
fi

if [ -z "${WALLET:-}" ]; then
    echo "ERROR: WALLET not set. Set the env var or pass like:"
    echo "  WALLET=prl1... bash $0"
    exit 1
fi

echo "============================================"
echo "  Pearl Miner — Rig Deploy"
echo "============================================"
echo "Pool     : $POOL"
echo "Wallet   : $WALLET"
echo "Worker   : $WORKER"
echo "GPU arch : sm_$COMPUTE_CAP (binary: native cubin for sm_75/80/86/89, PTX-JIT for newer)"
echo ""

# fetch binary if missing or older than 1h
NEED_FETCH=1
if [ -x /root/pearl-miner ]; then
    AGE=$(( $(date +%s) - $(stat -c %Y /root/pearl-miner) ))
    if [ $AGE -lt 3600 ]; then NEED_FETCH=0; fi
fi

if [ $NEED_FETCH -eq 1 ]; then
    echo "[1/4] fetching binary from $BINARY_URL"
    curl -fsSL "$BINARY_URL" -o /root/pearl-miner
    chmod +x /root/pearl-miner
fi

# GPU count — start one instance per device
GPU_COUNT=$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | wc -l)
if [ "$GPU_COUNT" -lt 1 ]; then
    echo "ERROR: no NVIDIA GPUs detected (nvidia-smi failed)"
    exit 1
fi
echo "[2/4] detected $GPU_COUNT GPU(s)"

# kill any previous instances
echo "[3/4] killing any previous pearl-miner processes"
pkill -9 -f "[p]earl-miner" 2>/dev/null || true
sleep 1

# launch one miner per GPU
echo "[4/4] launching $GPU_COUNT miner instance(s)"
for ((i=0; i<GPU_COUNT; i++)); do
    LOG=/root/pearl-miner-gpu$i.log
    nohup /root/pearl-miner \
        --pool "$POOL" \
        --wallet "$WALLET" \
        --worker "${WORKER}-gpu$i" \
        --device $i \
        --no-autotune --batch $BATCH \
        > "$LOG" 2>&1 </dev/null & disown
    echo "  gpu$i  →  $LOG"
done

sleep 6
echo ""
echo "=== status (first lines from each miner) ==="
for ((i=0; i<GPU_COUNT; i++)); do
    echo "--- gpu$i ---"
    head -6 /root/pearl-miner-gpu$i.log
done
echo ""
echo "Watch live with:    tail -F /root/pearl-miner-gpu*.log"
echo "Pool dashboard:     http://${POOL%:*}:9201/"
echo "Wallet lookup:      paste $WALLET in the pool's 'My Wallet' search box"
