#!/usr/bin/bash
# MKit - simple install helper
# See LICENSE file for copyright and license details.

mkit_import build
mkit_import ini
mkit_import target
mkit_import util

VDK_TEST_PDB__UTILDIR=${VDK_TEST_PDB__UTILDIR:-/usr/share/vdk/utils}

vdk_test_pdb__main() {
    #
    # Run tests
    #
    local BinPath="$VDK_TEST_PDB__UTILDIR/vdk_test"
    local ModName
    local ProjVersion
    local ProjLastGitSummary
    local es=0
    local Clean
    local PdbCmd
    local PdbScript
    test -x "$BinPath" || die "no such executable: $BinPath"
    PdbScript=$(__vdk_test_pdb__load_pdb_script) || return 3
    PdbCmd=$(__vdk_test_pdb__load_pdb_cmd) || return 3
    Clean=$(__vdk_test_pdb__load_clean) || return 3
    target__run build
    target__run _mkit_metadata
    ProjVersion=$(build__cached semver)
    ProjLastGitSummary=$(build__cached git_lastsummary)
    warn " .. __MKIT_PROJ_VERSION__ = $ProjVersion" \
         " .. __MKIT_PROJ_GIT_LASTSUMMARY__ = $ProjLastGitSummary"
    ModName=$(ini 1value macros:__VDK_PYLIB_MODNAME__)
    build__recordr vdk_test
    debug_var PdbCmd PdbScript Clean
    __vdk_test_pdb__runpdb; es=$?
    __vdk_test_pdb__clean "$es"
    return $es
}

__vdk_test_pdb__clean() {
    #
    # Clean up after pdb if exit status $1 is OK
    #
    # We've registered our sub-dir to MKit so its
    # native cleanup will suffice.
    #
    local es=$1
    case $es:$Clean in
        0:onpass)   target__run clean ;;
        *:onpass)   warn "skipping clean; vdk_test pdb failed with: $es" ;;
        *:always)   target__run clean ;;
        *:never)    true ;;
        *)          warn "bug: invalid option value: clean=$Clean"
                    return 3 ;;
    esac
}

__vdk_test_pdb__load_clean() {
    #
    # Safely load 'clean' option
    #
    local allowed=(onpass always never)
    util__loadenv_enum VDK_TEST_PDB__CLEAN "${allowed[@]}" && return 0
    plugin__option_enum clean "${allowed[@]}" && return 0
    warn "falling back to: clean = onpass" \
         " .. set VDK_TEST_PDB__CLEAN or [options:vdk_test_pdb:clean]" \
         " .. to onpass|always|never to change it"
    echo onpass
}

__vdk_test_pdb__load_pdb_cmd() {
    #
    # Safely load command for the pdb
    #
    util__loadenv VDK_TEST_PDB__CMD && return 0
    plugin__option_single "cmd" && return 0
    warn "falling back to: cmd = pdb3" \
         " .. set VDK_TEST_PDB__CMD or [options:vdk_test_pdb:cmd]" \
         " .. to pdb command name to change it"
    echo pdb3
}

__vdk_test_pdb__load_pdb_script() {
    #
    # Safely load script for the pdb
    #
    util__loadenv VDK_TEST_PDB__SCRIPT && return 0
    plugin__option_single "script" && return 0
    warn "no script specified" \
         " .. set VDK_TEST_PDB__SCRIPT or [options:vdk_test_pdb:script]" \
         " .. to script name"
    return 3
}

__vdk_test_pdb__runpdb() {
    #
    # Run the pdb
    #
    local es
    util__warnbox "→" "running the pdb"
    (
        export VDK_TEST__BUILDDIR="src/$ModName"
        "$BinPath" "$ModName" pdb "$PdbCmd" "$PdbScript"
    ); es=$?
    test "$es" -eq 0 && return 0
    util__warnbox "↑" \
        "pdb exited with non-zero exit status: $es" \
        "at $ProjVersion" \
        ".. ($ProjLastGitSummary)"
    return "$es"
}
