#!/bin/bash

set -e -u

######## Globals:

# You shouldn't have to change this unless the wiki gets a new host:
declare -r PACKAGE=$(grep ^PACKAGE= "$(dirname $0)/../config.log" |grep -o "apertium-[^']*") # e.g. apertium-sme-nob
declare -r BASEURL="http://wiki.apertium.org/wiki/${PACKAGE}"

# Workarounds for Mac's:
SED=sed
if [[ "$(uname -s)" = Darwin ]]; then
	SED=gsed
fi
declare -r SED


######## Functions:

fetchtests () {
    local -r update=$1
    local -r testtype=$2
    local -r html=$3

    if ${update}; then
	tmp=$(mktemp -t wiki-tests.html.XXXXXXXXXX)
	if wget -O "${tmp}" -q "${BASEURL}/${testtype}" && [[ -s "${tmp}" ]]; then
	    mv "${tmp}" "${html}"
	else
	    rm "${tmp}"
	    echo "Couldn't fetch ${BASEURL}/${testtype}" >&2
	fi
    fi

    if [[ ! -s "${html}" ]]; then
	echo "${html} does not exist or is empty (use '-u' option)" >&2
	exit 1
    fi
}

cleantst () {
    $SED 's/^ *//; s/ *$//; s/\([^,.?!:;]\)$/\1./g; s/   */ /g'
}
cleansrc () {
    local -r srclang=$1
    grep -o "<li> (${srclang})[^→]*" |$SED "s%</*[^>]*>%%g; s% *(${srclang}) *%%" | cleantst
}
cleantrg () {
    local -r srclang=$1
    grep -o "<li> (${srclang}).*" | $SED 's%[^→]*→ *%%; s%::.*%%'  | cleantst
}

summary () {
    local -r mode=$1 srclist=$2 trglist=$3 tstlist=$4 onlyfail=$5 onlypass=$6
    # Output the MT vs ref translations:
    local -i total=0
    local -i correct=0
    local -r sep=''
    while IFS="${sep}" read -r src trg tst; do
	if [[ "${trg}" = "${tst}" ]]; then
	    (( ++correct ))
	    $onlyfail || printf "%s\t  %s\nWORKS\t  %s\n\n\n" "${mode}" "${src}" "${tst}"
	else
	    (( 1 ))
	    $onlypass || printf "%s\t  %s\n\t- %s\n\t+ %s\n\n\n" "${mode}" "${src}" "${trg}" "${tst}"
	fi
	(( ++total ))
    done < <(paste -d "${sep}" "${srclist}" "${trglist}" "${tstlist}")

    # Output the sums:
    pct=
    if command -V calc &>/dev/null; then
        pct=$(calc -p "round(${correct} / ${total}, 4) * 100")
	pct=", ${pct}%"
    fi
    echo "${correct} / ${total}${pct}"
}

echo_revision () {
    if rev=$(svn info 2>/dev/null); then
	echo "${rev}" | grep ^Revision
    elif git config --get svn-remote.svn.fetch &>/dev/null; then
	git svn info | grep -a ^Revision
    else
	echo "(doesn't seem to be a repo)"
    fi
}
showrevisions () {
    echo_revision
    grep ^AP_SRC "$(dirname $0)/../config.log" | while IFS='=' read -r var dir; do
	printf "%s " "${var}"
	( cd "${dir//\'}"; echo_revision )
    done
}

main () {
    # Parse options:
    update=false
    onlypass=false
    onlyfail=false
    while getopts "upf" opt; do
        case "$opt" in
            u) update=true;;
            f) onlyfail=true;;
            p) onlypass=true;;
	    \?) echo "Invalid option" >&2; exit 2;;
	    :) echo "Option requires an argument." >&2; exit 2;;
        esac
    done
    shift "$((OPTIND-1))"
    if [[ $# -ne 2 ]] || ( ${onlypass} && ${onlyfail} ); then
        echo "Usage: $0 [-u] [-p|-f] {Regression,Pending} srclang-trglang"
        echo "-u       Use updated tests"
        echo "-p       Show only passing tests"
        echo "-f       Show only failing tests"
        exit 2
    fi
    declare -r testtype="$1_tests"
    declare -r srclang="${2%%-*}"
    declare -r trglang="${2##*-}"

    # Derived options:
    declare -r mode="${srclang}-${trglang}"
    declare -r html="$(dirname $0)/${testtype}.html"

    srclist=$(mktemp -t "${mode}-src.XXXXXXXXXX")
    trglist=$(mktemp -t "${mode}-trg.XXXXXXXXXX")
    tstlist=$(mktemp -t "${mode}-tst.XXXXXXXXXX")
    trap "rm -f \"${srclist}\" \"${trglist}\" \"${tstlist}\"" EXIT

    showrevisions
    printf "Running $1-tests with mode \"${mode}\" "; ${update} && printf "with updated tests "; echo "..."
    echo
    fetchtests "${update}" "${testtype}" "${html}"
    cleansrc "${srclang}" < "${html}" > "${srclist}"
    cleantrg "${srclang}" < "${html}" > "${trglist}"
    (
        set -o pipefail
        apertium -d . "${mode}" < "${srclist}" | cleantst > "${tstlist}"
    )
    summary "${mode}" "${srclist}" "${trglist}" "${tstlist}" "${onlyfail}" "${onlypass}"
}

main "$@"
