#!/bin/bash

set -e

NETWORKENTRYPOINT=$1

DEBUGLEVEL=${DEBUGLEVEL-1}

RESULTSFOLDER="udresults"
CLIENTOPTS="--password hello --ndf results/ndf.json --verify-sends --sendDelay 100 --waitTimeout 360 --unsafe-channel-creation -v $DEBUGLEVEL"
CLIENTUDOPTS="--password hello --ndf results/ndf.json -v $DEBUGLEVEL"
CLIENTOUT=$RESULTSFOLDER

rm -fr "$RESULTSFOLDER.bak" || true
cp -ra "$RESULTSFOLDER" "$RESULTSFOLDER.bak" || true
mkdir -p "$RESULTSFOLDER" || true

if [ "$NETWORKENTRYPOINT" == "betanet" ]
then
    NETWORKENTRYPOINT=$(sort -R betanet.txt | head -1)
elif [ "$NETWORKENTRYPOINT" == "mainnet" ]
then
    NETWORKENTRYPOINT=$(sort -R mainnet.txt | head -1)
elif [ "$NETWORKENTRYPOINT" == "release" ]
then
    NETWORKENTRYPOINT=$(sort -R release.txt | head -1)
elif [ "$NETWORKENTRYPOINT" == "devnet" ]
then
    NETWORKENTRYPOINT=$(sort -R devnet.txt | head -1)
elif [ "$NETWORKENTRYPOINT" == "" ]
then
    echo "NO NETWORK SPECIFIED, USING mainnet"
    NETWORKENTRYPOINT=$(sort -R mainnet.txt | head -1)
fi

echo "NETWORK: $NETWORKENTRYPOINT"

echo "Connecting to network defined at $NETWORKENTRYPOINT"
echo $NETWORKENTRYPOINT > "$RESULTSFOLDER/startgwserver.txt"

echo "DOWNLOADING TLS Cert..."
CMD="openssl s_client -showcerts -connect $(cat $RESULTSFOLDER/startgwserver.txt)"
echo $CMD
eval $CMD < /dev/null 2>&1 > "$RESULTSFOLDER/startgwcert.bin"
CMD="cat $RESULTSFOLDER/startgwcert.bin | openssl x509 -outform PEM"
echo $CMD
eval $CMD > "$RESULTSFOLDER/startgwcert.pem"
head "$RESULTSFOLDER/startgwcert.pem"

echo "DOWNLOADING NDF..."
CLIENTCMD="../bin/client getndf --gwhost $(cat $RESULTSFOLDER/startgwserver.txt) --cert $RESULTSFOLDER/startgwcert.pem"
eval $CLIENTCMD >> $RESULTSFOLDER/ndf.json 2>&1 &
PIDVAL=$!
echo "$CLIENTCMD -- $PIDVAL"
wait $PIDVAL

cat $RESULTSFOLDER/ndf.json | jq . | head -5

file $RESULTSFOLDER/ndf.json

if [ ! -s $RESULTSFOLDER/ndf.json ]
then
    echo "$RESULTSFOLDER/ndf.json is empty, cannot proceed"
    exit -1
fi

# Create session
if [ ! -s $RESULTSFOLDER/blob13 ]; then
    echo "CREATING NEW CLIENT..."
    CLIENTCMD="timeout 360s ../bin/client $CLIENTOPTS -l $CLIENTOUT/client13.log -s $CLIENTOUT/blob13 --writeContact $CLIENTOUT/client13-contact.bin --unsafe -m \"Hello from Client13 to myself, without E2E Encryption\""
    eval $CLIENTCMD >> $CLIENTOUT/client13.txt &
    PIDVAL=$!
    echo "$CLIENTCMD -- $PIDVAL"
    wait $PIDVAL
    echo "DONE!"
else
    echo "REUSING EXISTING CLIENT..."
    mv $RESULTSFOLDER/client13.txt $RESULTSFOLDER/client13.txt.bak
    mv $RESULTSFOLDER/client13.log $RESULTSFOLDER/client13.log.bak
    CLIENTCMD="timeout 360s ../bin/client $CLIENTOPTS -l $CLIENTOUT/client13.log -s $CLIENTOUT/blob13 --writeContact $CLIENTOUT/client13-contact.bin --unsafe -m \"Hello from Client13 to myself, without E2E Encryption\""
    eval $CLIENTCMD >> $CLIENTOUT/client13.txt &
    PIDVAL=$!
    echo "$CLIENTCMD -- $PIDVAL"
    wait $PIDVAL
    echo "DONE!"
fi

# The following attempts to register a username, not normally needed to be tested...
# CLIENTCMD="timeout 240s ../bin/client ud $CLIENTUDOPTS -l $CLIENTOUT/client13.log -s $CLIENTOUT/blob13 --register josh13"
# eval $CLIENTCMD >> $CLIENTOUT/client13.txt &
# PIDVAL=$!
# echo "$CLIENTCMD -- $PIDVAL"
# wait $PIDVAL


# Test forever
while [ true ]; do
    echo "SEARCHING..."
    CLIENTCMD="time timeout 240s ../bin/client ud $CLIENTUDOPTS -l $CLIENTOUT/client13.log -s $CLIENTOUT/blob13 --searchusername Jake"
    eval $CLIENTCMD > $CLIENTOUT/josh31.bin &
    PIDVAL1=$!
    echo "$CLIENTCMD -- $PIDVAL1"
    wait $PIDVAL1
    echo "SUCCESS!"
done