#!/bin/bash

set -e

# This script shows the steps to download and deploy an archive of the current UTXO Set
# It will:
#   1. Download the UTXO Set from UTXO_DOWNLOAD_LINK, if UTXO_DOWNLOAD_LINK is empty, use NBITCOIN_NETWORK to find a default
#   2. Check the tarball against trusted hashes
#   3. Create the container's folders for blocks and chainstate, or empty them if they exists
#   4. Unzip the tarball
# This will download the utxo set and untar it in bitcoin's folder
# Usage: ./load-utxo-set.sh
# This will use the tar to load the utxo in bitcoin's folder
# Usage: ./load-utxo-set.sh utxo-snapshot-bitcoin-mainnet-699714.tar

if ! [ "$0" = "$BASH_SOURCE" ]; then
    echo "This script must not be sourced" 
    exit 1
fi

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root after running \"sudo su -\"" 
   exit 1
fi

if ! [[ "$NBITCOIN_NETWORK" ]]; then
    echo "NBITCOIN_NETWORK should be set to mainnet, testnet or regtest" 
    exit 1
fi

if ! [[ "$BTCPAYGEN_ADDITIONAL_FRAGMENTS" == *"opt-save-storage"* ]]; then
  echo "Pruning must be enabled, please update BTCPAYGEN_ADDITIONAL_FRAGMENTS by running:"
  echo ""
  echo 'BTCPAYGEN_ADDITIONAL_FRAGMENTS="$BTCPAYGEN_ADDITIONAL_FRAGMENTS;opt-save-storage-s"'
  echo '. btcpay-setup.sh -i'
  exit 1
fi

TAR_FILE="$1"

if ! [[ "$UTXO_DOWNLOAD_LINK" ]]; then
    [[ $NBITCOIN_NETWORK == "mainnet" ]] && UTXO_DOWNLOAD_LINK="https://snapshots.btcpay.tech/utxo-snapshot-bitcoin-mainnet-867690.tar"
    [[ $NBITCOIN_NETWORK == "testnet" ]] && UTXO_DOWNLOAD_LINK="https://eu2.contabostorage.com/1f50a74c9dc14888a8664415dad3d020:utxosets/utxo-snapshot-bitcoin-testnet-1445586.tar"
fi

if ! [[ "$UTXO_DOWNLOAD_LINK" ]] && ! [[ "$TAR_FILE" ]]; then
    echo "No default UTXO_DOWNLOAD_LINK for $NBITCOIN_NETWORK" 
    exit 1
fi

BITCOIN_DATA_DIR="$(docker volume inspect generated_bitcoin_datadir -f "{{.Mountpoint}}" 2>/dev/null)" || \
BITCOIN_DATA_DIR="/var/lib/docker/volumes/generated_bitcoin_datadir/_data"

[ ! -d "$BITCOIN_DATA_DIR" ] && mkdir -p "$BITCOIN_DATA_DIR"

if [[ "$TAR_FILE" ]]; then
  TAR_NAME="$(basename $TAR_FILE)"
else
  TAR_NAME="$(basename $UTXO_DOWNLOAD_LINK)"
  TAR_FILE="$BITCOIN_DATA_DIR/$TAR_NAME"
fi

TAR_DIR="$(dirname "$TAR_FILE")"
cp "utxo-sets" "$TAR_DIR/utxo-sets"
cd "$TAR_DIR"
IS_DOWNLOADED=false
if [ ! -f "$TAR_FILE" ]; then
  echo "Downloading $UTXO_DOWNLOAD_LINK to $TAR_FILE"
  wget "$UTXO_DOWNLOAD_LINK" -c -O $TAR_FILE.partial -q --show-progress && mv $TAR_FILE.partial $TAR_FILE
  IS_DOWNLOADED=true
else
  echo "$TAR_FILE already exists"
fi

grep "$TAR_NAME" "utxo-sets" | tee "utxo-set"
rm "utxo-sets"
if ! sha256sum -c "utxo-set"; then
  echo "$TAR_FILE is not trusted"
  rm "utxo-set"
  cd -
  exit 1
fi
rm "utxo-set"
cd -

NETWORK_DIRECTORY=$NBITCOIN_NETWORK
if [[ $NBITCOIN_NETWORK == "mainnet" ]]; then
  NETWORK_DIRECTORY="."
fi
if [[ $NBITCOIN_NETWORK == "testnet" ]]; then
  NETWORK_DIRECTORY="testnet3"
fi

NETWORK_DIRECTORY="$BITCOIN_DATA_DIR/$NETWORK_DIRECTORY"
[ -d "$NETWORK_DIRECTORY/blocks" ] && ( rm -rf "$NETWORK_DIRECTORY/blocks" || rm -rf $NETWORK_DIRECTORY/blocks/* )
[ -d "$NETWORK_DIRECTORY/chainstate" ] && rm -rf "$NETWORK_DIRECTORY/chainstate"
[ ! -d "$NETWORK_DIRECTORY" ] && mkdir "$NETWORK_DIRECTORY"

echo "Extracting..."
if ! tar -xf "$TAR_FILE" -C "$BITCOIN_DATA_DIR"; then
  echo "Failed extracting, did you turned bitcoin off? (btcpay-down.sh)"
  exit 1
fi
$IS_DOWNLOADED && rm -f "$TAR_FILE"

BTCPAY_DATA_DIR="$(docker volume inspect generated_btcpay_datadir -f "{{.Mountpoint}}" 2>/dev/null)" || \
BTCPAY_DATA_DIR="/var/lib/docker/volumes/generated_btcpay_datadir/_data"

[ ! -d "$BTCPAY_DATA_DIR" ] && mkdir -p "$BTCPAY_DATA_DIR"
echo "$TAR_NAME" > "$BTCPAY_DATA_DIR/FastSynced"

echo "Successfully downloaded and extracted."

if docker volume inspect generated_bitcoin_wallet_datadir &>/dev/null; then
  echo -e '\033[33mWARNING: You need to delete your Bitcoin Core wallet before restarting with "btcpay-up.sh", or bitcoin core will fail to start.\033[0m'
  echo -e '\033[33mDo not delete the wallet if you have any funds on it. (For example, this may be the case if you use Eclair or FullyNoded to receive funds)\033[0m'
  echo -e '\033[33mHow to proceed: If you agree to delete your Bitcoin Core wallet, run "docker volume rm generated_bitcoin_wallet_datadir"\033[0m'
else
  echo "You can now run btcpay again (btcpay-up.sh)"
fi
