#!/bin/sh

bindir="$(dirname "$0")"

ZMB="${bindir}/zmb"
JQ="$(which jq)"

usage () {
    status="$1"
    message="$2"
    [ -n "$message" ] && printf "%s\n" "${message}" >&2
    echo "Usage: zmtest [OPTIONS] DOMAIN" >&2
    echo >&2
    echo "Options:" >&2
    echo "  -h --help             Show usage (this documentation)." >&2
    echo "  -s URL --server URL   Zonemaster Backend to query. Default is http://localhost:5000/" >&2
    echo "  --noipv4              Run the test with IPv4 disabled." >&2
    echo "  --noipv6              Run the test with IPv6 disabled." >&2
    echo "                        IPv4 and IPv6 follow the profile setting unless disabled by option." >&2
    echo "  --lang LANG           A language tag. Default is \"en\"." >&2
    echo "                        Valid values are determined by backend_config.ini." >&2
    echo "  --profile PROFILE     The name of a profile. Default is \"default\"." >&2
    echo "                        Valid values are determined by backend_config.ini except that" >&2
    echo "                        \"default\" is always a valid value." >&2
    exit "${status}"
}

error () {
    status="$1"
    message="$2"
    printf "error: %s\n" "${message}" >&2
    exit "${status}"
}

zmb () {
    server_url="$1"; shift
    output="$("${ZMB}" --server="${server_url}" "$@" 2>&1)" || error 1 "method $1: ${output}"
    json="$(printf "%s" "${output}" | "${JQ}" -S . 2>/dev/null)" || error 1 "method $1 did not return valid JSON output: ${output}"
    error="$(printf "%s" "${json}" | "${JQ}" -e .error 2>/dev/null)" && error 1 "method $1: ${error}"
    printf "%s" "${json}"
}

[ -n "${JQ}" ] || error 2 "Dependency not found: jq"

domain=""
server_url="http://localhost:5000/"
ipv4=""
ipv6=""
lang="en"
profile="default"
while [ $# -gt 0 ] ; do
    case "$1" in
        -h|--help) usage 2; shift 1;;
        -s|--server) server_url="$2"; shift 2;;
        --noipv4) ipv4='--ipv4 false'; shift 1;;
        --noipv6) ipv6='--ipv6 false'; shift 1;;
        --lang) lang="$2"; shift 2;;
        --profile) profile="$2"; shift 2;;
        *) domain="$1" ; shift 1;;
    esac
done
[ -n "${domain}" ] || usage 2 "No domain specified"

# Start test
output="$(zmb "${server_url}" start_domain_test --domain "${domain}" ${ipv4} ${ipv6} --profile "${profile}")" || exit $?
testid="$(printf "%s" "${output}" | "${JQ}" -r .result)" || exit $?
printf "testid: %s\n" "${testid}" >&2

if echo "${testid}" | grep -qE '[^0-9a-fA-F]' ; then
    error 1 "start_domain_test did not return a testid: ${testid}"
fi

# Wait for test to finish
while true
do
    output="$(zmb "${server_url}" test_progress --test-id "${testid}")" || exit $?
    progress="$(printf "%s" "${output}" | "${JQ}" -r .result)" || exit $?
    printf "\r${progress}%% done" >&2
    if [ "${progress}" -eq 100 ] ; then
        echo >&2
        break
    fi
    sleep 1
done

# Get test results
zmb "${server_url}" get_test_results --test-id "${testid}" --lang "${lang}"
