#!/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_VENV__UTILDIR=${VDK_TEST_VENV__UTILDIR:-/usr/share/vdk/utils}

vdk_test_venv__main() {
    #
    # Run tests
    #
    local BinPath="$VDK_TEST_VENV__UTILDIR/vdk_test"
    local ModName
    local ProjVersion
    local ProjLastGitSummary
    local es=0
    local Clean
    local VenvCmd
    test -x "$BinPath" || die "no such executable: $BinPath"
    VenvCmd=$(__vdk_test_venv__load_venv_cmd) || return 3
    Clean=$(__vdk_test_venv__load_clean) || return 3
    PYSTUFF__VENV_POST=true \
        target__route pystuff
    VenvDir=$(build__factr pystuff/mkvenv_dir) || return 3
    VenvScript=$(build__factr pystuff/mkvenv_script) || return 3
    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 VenvCmd Clean
    __vdk_test_venv__runvenv; es=$?
    __vdk_test_venv__clean "$es"
    return $es
}

__vdk_test_venv__clean() {
    #
    # Clean up after venv 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 venv failed with: $es" ;;
        *:always)   target__run clean ;;
        *:never)    true ;;
        *)          warn "bug: invalid option value: clean=$Clean"
                    return 3 ;;
    esac
}

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

__vdk_test_venv__load_venv_cmd() {
    #
    # Safely load command for the venv
    #
    util__loadenv VDK_TEST_VENV__CMD && return 0
    plugin__option_single "cmd" && return 0
    warn "falling back to: cmd = bash" \
         " .. set VDK_TEST_VENV__CMD or [options:vdk_test_venv:cmd]" \
         " .. to venv command name to change it"
    echo bash
}

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