#! /usr/bin/env bash

set -e

node_dirs=()
node_pids=()

start_sandboxed_node() {

    id=$1
    max_peer_id=${max_peer_id:-9}
    shift 1

    port=$((19730 + id))
    rpc=$((18730 + id))
    expected_pow="${expected_pow:-0.0}"
    expected_connections="${expected_connections:-3}"
    node_dir="$(mktemp -d -t tezos-node.XXXXXXXX)"
    peers=("--no-bootstrap-peers")
    for peer_port in $(seq 19730 $((19730 + max_peer_id))); do
        peers+=("--peer")
        peers+=("127.0.0.1:$peer_port")
    done
    peers+=("--closed")
    node="${local_node:-tezos-node}"
    sandbox_file="${sandbox_file:-$script_dir/sandbox.json}"
    sandbox_param="--sandbox=$sandbox_file"

    node_dirs+=("$node_dir")

    $node config init \
          --data-dir "$node_dir" \
          --net-addr "127.0.0.1:$port" \
          --rpc-addr "127.0.0.1:$rpc" \
          --expected-pow "$expected_pow" \
          --connections "$expected_connections"
    $node identity generate "$expected_pow" --data-dir "$node_dir"
    $node run --data-dir "$node_dir" "${peers[@]}" "$sandbox_param" "$@" &
    node_pids+=("$!")

}

cleanup_nodes() {
    [ -z "${node_pids[0]}" ] || kill "${node_pids[@]}"
    for pid in "${node_pids[@]}" ; do wait "$pid" ; done
    rm -rf "${node_dirs[@]}"
}


main() {

    local bin_dir="$(cd "$(dirname "$0")" && echo "$(pwd -P)/")"
    if [ $(basename "$bin_dir") = "bin_node" ]; then
        local_node="${local_node:-$bin_dir/../_build/default/bin_node/main.exe}"
        sandbox_file="${sandbox_file:-$bin_dir/../scripts/sandbox.json}"
    fi

    if [ $# -lt 1 ] || [ "$1" -le 0 ] || [ 10 -le "$1" ]; then
        echo "Small script to launch local and closed test network with a maximum of 9 nodes."
        echo
        echo "Usage: $0 <id>"
        echo "  where <id> should be an integer between 1 and 9."
        exit 1
    fi

    cleanup () {
        set +e
        echo Cleaning up...
        cleanup_nodes
    }
    trap cleanup EXIT INT

    start_sandboxed_node "$@"
    wait $node_pids

}

if [ "$0" == "$BASH_SOURCE" ]; then
    main "$@"
fi