#!/usr/bin/python3

import os
import sys
import shutil
import subprocess
import time

BUILD_DQLITE = "go build -tags libsqlite3 .".split(" ")
BUILD_DEMO = "go build -tags libsqlite3 testdata/demo.go".split(" ")
BASE_PORT = 9980


def spawnNode(n, purge=False):
    data = "/tmp/dqlite-demo-%d" % n
    port = BASE_PORT + n

    if purge and os.path.exists(data):
        shutil.rmtree(data)
    if not os.path.exists(data):
        os.mkdir(data)

    args = ["./demo", "-data", data, "-addr", "127.0.0.1:%d" % port]
    if n > 0:
        args.extend(["-join", "127.0.0.1:%d" % BASE_PORT])

    env = os.environ.copy()
    env.update({
        "LD_LIBRARY_PATH": os.path.join(os.getcwd(), ".sqlite"),
    })

    fd = open(os.path.join(data, "log"), "a+")
    return subprocess.Popen(args, env=env, stdout=fd, stderr=fd)

def spawnTail():
    args = ["tail", "-f"]
    for i in range(3):
        args.append("/tmp/dqlite-demo-%d/log" % i)
    return subprocess.Popen(args, stderr=subprocess.STDOUT)

if __name__ == "__main__":
    subprocess.check_call(BUILD_DQLITE)
    subprocess.check_call(BUILD_DEMO)

    processes = []
    for i in range(3):
        processes.append(spawnNode(i, purge=True))
    spawnTail()

    while True:
        for i, process in enumerate(processes):
            rc = process.poll()
            if rc is not None:
                if rc != 0:
                    print("ERROR node %d exited with return code %d" % (i, rc))
                    for j, process in enumerate(processes):
                        if j != i:
                            process.kill()
                    sys.exit(1)
                # respawn
                processes[i] = spawnNode(i)
        time.sleep(0.5)
