#!/bin/bash

pushd () { command pushd "$@" > /dev/null; }
popd () { command popd "$@" > /dev/null; }

function wait_for_server {
    port=$1
    while ! nc -z -w 1 127.0.0.1 $port; do
        sleep 0.1
    done
    sleep 1
}

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$DIR"

# create a temporary directory.
tmpdir=/tmp/memgraph_drivers
if [ -d $tmpdir ]; then
    rm -rf $tmpdir
fi

mkdir -p $tmpdir

# find memgraph binaries.
binary_dir="$DIR/../../build"

# Start instance_1
$binary_dir/memgraph \
    --bolt-port=7687 \
    --data-directory=$tmpdir/instance_1/ \
    --query-execution-timeout-sec=5 \
    --bolt-session-inactivity-timeout=10 \
    --bolt-server-name-for-init="Neo4j/1.1" \
    --bolt-cert-file="" \
    --log-file=$tmpdir/logs/instance1.log \
    --also-log-to-stderr \
    --management-port=10011 \
    --experimental-enabled=high-availability \
    --log-level ERROR &
pid_instance_1=$!
wait_for_server 7687

# Start instance_2
$binary_dir/memgraph \
    --bolt-port=7688 \
    --data-directory=$tmpdir/instance_2 \
    --query-execution-timeout-sec=5 \
    --bolt-session-inactivity-timeout=10 \
    --bolt-server-name-for-init="Neo4j/1.1" \
    --bolt-cert-file="" \
    --log-file=$tmpdir/logs/instance2.log \
    --also-log-to-stderr \
    --management-port=10012 \
    --experimental-enabled=high-availability \
    --log-level ERROR &
pid_instance_2=$!
wait_for_server 7688

# Start instance_3
$binary_dir/memgraph \
    --bolt-port=7689 \
    --data-directory=$tmpdir/instance_3 \
    --query-execution-timeout-sec=5 \
    --bolt-session-inactivity-timeout=10 \
    --bolt-server-name-for-init="Neo4j/1.1" \
    --bolt-cert-file="" \
    --log-file=$tmpdir/logs/instance3.log \
    --also-log-to-stderr \
    --management-port=10013 \
    --experimental-enabled=high-availability \
    --log-level ERROR &
pid_instance_3=$!
wait_for_server 7689


# Start coordinator_1
$binary_dir/memgraph \
    --bolt-port=7690 \
    --data-directory=$tmpdir/coordinator_1 \
    --query-execution-timeout-sec=5 \
    --bolt-session-inactivity-timeout=10 \
    --bolt-server-name-for-init="Neo4j/1.1" \
    --bolt-cert-file="" \
    --log-file=$tmpdir/logs/coordinator1.log \
    --also-log-to-stderr \
    --coordinator-id=1 \
    --coordinator-port=10111 \
    --experimental-enabled=high-availability \
    --log-level ERROR &
pid_coordinator_1=$!
wait_for_server 7690

# Start coordinator_2
$binary_dir/memgraph \
    --bolt-port=7691 \
    --data-directory=$tmpdir/coordinator_2 \
    --query-execution-timeout-sec=5 \
    --bolt-session-inactivity-timeout=10 \
    --bolt-server-name-for-init="Neo4j/1.1" \
    --bolt-cert-file="" \
    --log-file=$tmpdir/logs/coordinator2.log \
    --also-log-to-stderr \
    --coordinator-id=2 \
    --coordinator-port=10112 \
    --experimental-enabled=high-availability \
    --log-level ERROR &
pid_coordinator_2=$!
wait_for_server 7691

# Start coordinator_3
$binary_dir/memgraph \
    --bolt-port=7692 \
    --data-directory=$tmpdir/coordinator_3 \
    --query-execution-timeout-sec=5 \
    --bolt-session-inactivity-timeout=10 \
    --bolt-server-name-for-init="Neo4j/1.1" \
    --bolt-cert-file="" \
    --log-file=$tmpdir/logs/coordinator3.log \
    --also-log-to-stderr \
    --coordinator-id=3 \
    --coordinator-port=10113 \
    --experimental-enabled=high-availability \
    --log-level ERROR &
pid_coordinator_3=$!
wait_for_server 7692

sleep 5

echo 'ADD COORDINATOR 2 WITH CONFIG {"bolt_server": "127.0.0.1:7691", "coordinator_server":  "127.0.0.1:10112"};' | $binary_dir/bin/mgconsole --port 7690
echo 'ADD COORDINATOR 3 WITH CONFIG {"bolt_server": "127.0.0.1:7692", "coordinator_server":  "127.0.0.1:10113"};' | $binary_dir/bin/mgconsole --port 7690
echo 'REGISTER INSTANCE instance_1 WITH CONFIG {"bolt_server": "127.0.0.1:7687", "management_server": "127.0.0.1:10011", "replication_server": "127.0.0.1:10001"};'  | $binary_dir/bin/mgconsole --port 7690
echo 'REGISTER INSTANCE instance_2 WITH CONFIG {"bolt_server": "127.0.0.1:7688", "management_server": "127.0.0.1:10012", "replication_server": "127.0.0.1:10002"};'  | $binary_dir/bin/mgconsole --port 7690
echo 'REGISTER INSTANCE instance_3 WITH CONFIG {"bolt_server": "127.0.0.1:7689", "management_server": "127.0.0.1:10013", "replication_server": "127.0.0.1:10003"};'  | $binary_dir/bin/mgconsole --port 7690
echo 'SET INSTANCE instance_1 TO MAIN;' | $binary_dir/bin/mgconsole --port 7690


code_test=0
for lang in *; do
    if [ ! -d $lang ]; then continue; fi
    pushd $lang
    echo "Running tests for language: $lang"
    for version in *; do
        if [ ! -d $version ]; then continue; fi
        pushd $version
        if [ -f "run_cluster_tests.sh" ]; then
            echo "Running version: $version"
            ./run_cluster_tests.sh
            code_test=$?
            if [ $code_test -ne 0 ]; then
                echo "FAILED: $lang-$version"
                break
            fi
        fi
        popd
    done;
    popd
done


# Function to stop a process by PID and check its exit code
stop_process() {
    local pid=$1 # Capture the PID from the first argument

    # Stop the process
    kill $pid
    wait $pid
    local exit_code=$? # Capture the exit code

    # Check the process's exit code
    if [ $exit_code -ne 0 ]; then
        echo "The process with PID $pid didn't terminate properly!"
        exit $exit_code
    else
        echo "Process with PID $pid terminated successfully."
    fi
}

echo "Stopping coordinator1"
stop_process $pid_coordinator_1
echo "Stopping coordinator2"
stop_process $pid_coordinator_2
echo "Stopping coordinator3"
stop_process $pid_coordinator_3

echo "Stopping instance1"
stop_process $pid_instance_1
echo "Stopping instance2"
stop_process $pid_instance_2
echo "Stopping instance3"
stop_process $pid_instance_3


# Check test exit code.
if [ $code_test -ne 0 ]; then
    echo "One of the tests failed!"
    exit $code_test
fi

# Temporary directory cleanup.
if [ -d $tmpdir ]; then
    rm -rf $tmpdir
fi