#!/bin/bash

set -euo pipefail

wait_until() {
    command=$1
    timeout=$2

    i=1
    until eval "$command"; do
        ((i++))
        if [[ $i -gt $timeout ]]; then
            echo "Command '$command' aborted because of timeout"
            exit 1
        fi
        sleep 1
    done
}

setup_containers() {
    for retry in {2..0}; do
        sudo docker compose build && break
        echo "Remaining retries $retry"
    done
    exit_code=""
    sudo MOJO_CLIENT_DEBUG=1 docker compose up -d || exit_code=$?
    if [[ -n $exit_code ]]; then
        echo "docker compose exited with non-zero code $exit_code, showing logs:"
        docker compose logs
        exit "$exit_code"
    fi
    (docker compose ps --services --filter status=stopped | grep "^[[:space:]]*$") || (
        docker compose logs
        sudo docker compose ps
        exit 1
    )
}

test_webui() {
    (
        workspace=$(mktemp -d) \
            && trap 'docker compose down; sudo rm -r "$workspace"' EXIT \
            && cp -r container/webui "$workspace" \
            && cd "$workspace/webui" \
            && sed -i -e "s/method = OpenID/method = Fake/" conf/openqa.ini
        printf "[nginx]\nkey = 1234567890ABCDEF\nsecret = 1234567890ABCDEF\n" > conf/client.conf \
            && setup_containers \
            && docker compose exec -T webui openqa-cli api -X POST jobs ISO=foo.iso DISTRI=my-distri FLAVOR=my-flavor VERSION=42 BUILD=42 TEST=my-test \
                --host http://nginx:9526 || (
            echo "Error executing a job"
            exit 1
        ) \
            && (wait_until 'docker compose logs webui | grep "GET /api/wakeup" >/dev/null' 10) || (
            docker compose logs webui
            exit 1
        )
    ) || exit 1
}

test_worker() {
    (
        workspace=$(mktemp -d) \
            && trap 'docker compose down; sudo rm -r "$workspace"' EXIT \
            && cp -r container/worker "$workspace" \
            && cd "$workspace/worker" \
            && setup_containers
    ) || exit 1
}

test_webui
test_worker
