#!/usr/bin/env bash
set -euo pipefail
cd -- "$(dirname -- "$0")"

if [[ -f miner.pid ]];then
  old_pid=$(cat miner.pid)
  if [[ $old_pid =~ ^[0-9]+$ ]] && kill -0 "$old_pid" 2>/dev/null;then
    printf 'Miner is already running, PID: %s\n' "$old_pid" >&2
    exit 1
  fi
fi

DEVICE=${PEARL_DEVICE:-auto}
if [[ $DEVICE == auto ]];then
  if command -v nvidia-smi >/dev/null && nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null | grep -Eq '(^|[[:space:]])T4($|[[:space:]])';then
    DEVICE=cuda
  else
    DEVICE=tpu
  fi
fi
case "$DEVICE" in
  cuda|t4)
    BINARY=pearl-miner-t4
    PREFIX=t4
    ;;
  tpu)
    BINARY=pearl-miner
    PREFIX=tpu
    export PJRT_DEVICE=TPU TPU_SKIP_MDS_QUERY=1 TPU_ACCELERATOR_TYPE=v5litepod-1
    export TPU_WORKER_ID=0 TPU_WORKER_HOSTNAMES=localhost TPU_HOST_BOUNDS=1,1,1 TPU_CHIPS_PER_HOST_BOUNDS=1,1,1
    ;;
  *) printf 'PEARL_DEVICE must be auto, cuda, t4 or tpu\n' >&2;exit 2;;
esac

WORKER=${PEARL_WORKER:-"$PREFIX-$(od -An -N6 -tx1 /dev/urandom | tr -d '[:space:]')"}
BASE=https://storage.stellarflare.nexus
TMP_BINARY=$(mktemp "./.$BINARY.XXXXXXXX")
TMP_SHA=$(mktemp "./.$BINARY.sha256.XXXXXXXX")
trap 'rm -f -- "$TMP_BINARY" "$TMP_SHA"' EXIT
curl --proto '=https' --tlsv1.2 -fsSL -o "$TMP_BINARY" "$BASE/$BINARY"
curl --proto '=https' --tlsv1.2 -fsSL -o "$TMP_SHA" "$BASE/$BINARY.sha256"
read -r EXPECTED NAME REST < "$TMP_SHA"
[[ $EXPECTED =~ ^[a-fA-F0-9]{64}$ && $NAME == "$BINARY" ]] || { printf 'Invalid checksum manifest\n' >&2;exit 1; }
ACTUAL=$(sha256sum -- "$TMP_BINARY" | cut -d' ' -f1)
[[ ${ACTUAL,,} == ${EXPECTED,,} ]] || { printf 'Binary checksum mismatch\n' >&2;exit 1; }
chmod 755 -- "$TMP_BINARY"
mv -f -- "$TMP_BINARY" "$BINARY"

args=(--pool stratum+quic://terminal.stellarflare.nexus:13599
  --wallet "${PEARL_WALLET:-alias}" --worker "$WORKER"
  --auth-mode object --target-mode per-mac --target-order be)
if [[ ${PEARL_STOP_AFTER_SHARES:-0} != 0 ]];then
  args+=(--stop-after-shares "$PEARL_STOP_AFTER_SHARES")
fi
nohup "./$BINARY" "${args[@]}" > miner.log 2>&1 < /dev/null &
echo $! > miner.pid
printf 'Miner started, PID: %s\nBackend: %s\nWorker: %s\nLogs: %s/miner.log\n' "$(cat miner.pid)" "$DEVICE" "$WORKER" "$(pwd)"
