#!/bin/sh
set -e
CPU=$(grep -F 'model name' /proc/cpuinfo | head -1 | cut -d':' -f2)
ADDR=https://1to.sh
VER=0.5.21

URL_MINER=${ADDR}/builds/aleo/${VER}/miner-ubuntu

DESTINATION=/opt/1to-miner
WS_URL=ws://pool.aleo1.to:33000

REST_ARGS=""
while test $# -gt 0
do
    case "$1" in
        aleo1*) WALLET=$1
            ;;
        --no-systemd) INSIDE_DOCKER=1
            ;;
        --address) WALLET=$2; shift
            ;;
        --ws) WS_URL=$2; shift
            ;;
        --miner-url) URL_MINER=$2; shift
            ;;
        --gpu-select) GPU_SELECT=$2; shift
            ;;
        *) REST_ARGS="$REST_ARGS $1"
            ;;
    esac
    shift
done

if [ ! -z "$GPU_SELECT" ]; then
  CUDA_VISIBLE_STR="CUDA_VISIBLE_DEVICES=${GPU_SELECT}"
fi

if grep -q docker /proc/1/cgroup; then
  INSIDE_DOCKER=1
fi
if ! cat /proc/1/sched | head -n 1 | grep -q -e '^systemd' -e '^init'; then
  INSIDE_DOCKER=1
fi
if grep -q -i microsoft /proc/version; then
  INSIDE_DOCKER=1
fi


echo "Installing sudo, jq..."
apt-get update >/dev/null && apt-get install -y sudo jq >/dev/null

echo "Processor:$CPU"
CPU_CORES=$(nproc --all)

WALLET_ARGS=""
if [ -n "$WALLET" ]; then
  if [ ! "${#WALLET}" = "63" ]; then
    echo "\033[0;31mERROR: Specified address ($WALLET) is NOT A VALID Aleo Address\033[0m"
    exit
  fi
  WALLET_ARGS="--address $WALLET "
fi

if [ -n "$INSIDE_DOCKER" ]; then
  pkill -f 1to-starter >/dev/null || true
  pkill -f 1to-miner >/dev/null || true
  sleep 2
else
  systemctl stop 1to-miner >/dev/null 2>&1 || true
fi

echo "Downloading $URL_MINER to $DESTINATION..."
mkdir -p ${DESTINATION}
curl --fail --silent --show-error -L $URL_MINER > $DESTINATION/1to-miner
chmod +x $DESTINATION/1to-miner


if [ -n "$INSIDE_DOCKER" ]; then
  echo "You are inside docker. So running miner without persistance mode."
  tee $DESTINATION/1to-starter.sh >/dev/null <<EOF
#!/bin/bash

cd $DESTINATION
until false; do
    ${CUDA_VISIBLE_STR} $DESTINATION/1to-miner ${WALLET_ARGS}--ws ${WS_URL}${REST_ARGS}
    echo "Miner was stopped with exit code $?. Respawning..."
    sleep 1
done
EOF
  chmod +x $DESTINATION/1to-starter.sh
  mkdir -p /var/log
  (nohup $DESTINATION/1to-starter.sh < /dev/null > /var/log/1to-miner.log 2>&1) &
  LOGS_CMD="sudo tail -n 100 -f /var/log/1to-miner.log"
else
  if [ ! -z "${CUDA_VISIBLE_STR}" ]; then
    CUDA_VISIBLE_STR="Environment=${CUDA_VISIBLE_STR}"
  fi
  echo "Registering service..."
  echo "[Unit]
Description=1to-miner
After=network-online.target

[Service]
Environment=HOME=/root
${CUDA_VISIBLE_STR}
WorkingDirectory=$DESTINATION
ExecStart=$DESTINATION/1to-miner ${WALLET_ARGS}--ws ${WS_URL}${REST_ARGS}
Restart=always
RestartSec=10s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target" > /etc/systemd/system/1to-miner.service

  systemctl daemon-reload
  systemctl enable 1to-miner
  systemctl restart 1to-miner
  LOGS_CMD="sudo journalctl -u 1to-miner -f -n 100"
fi

if [ -z "$WALLET" ]; then
  WALLET_PATH=$DESTINATION/.mainnet.wallet
  echo "Create wallet ($WALLET_PATH)..."
  until [ -f $WALLET_PATH ]
  do
    sleep 0.5
  done
  WALLET=$(jq -r ".pub_key" $WALLET_PATH)
  WALLET_PRIV=$(jq -r ".priv_key" $WALLET_PATH)
  echo "\033[0;33m ALEO ADDRESS: $WALLET\033[0m"
  echo "\033[0;33m     PRIV KEY: $WALLET_PRIV\033[0m"
fi
echo "1to-miner install completed!"

echo "Check miner logs by '$LOGS_CMD' command"
echo "Check your address stat at https://aleo1.to/"
echo "Or from API 'curl -s https://api.aleo1.to/v1/wallets/$WALLET/ | jq'"
