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

mkit_import build
mkit_import target

pystuff__main() {
    #
    # Build setup.py and mkvenv.sh
    #
    local ModName           # Python module name
    local ProjVersion       # MKit project version
    local Skel              # setup.py skeleton
    local MkvenvDir         # venv maker: target venv directory
    local MkvenvScript      # venv maker: script name
    local MkvenvPost        # venv maker: post commands
    target__run build || die
    Skel="$(ini 1value "dist:pystuff")"
    MkvenvDir=$(__pystuff__load_mkvenv_dir)
    MkvenvScript=$(__pystuff__load_mkvenv_script)
    MkvenvPost=$(__pystuff__load_mkvenv_post)
    ProjVersion=$(build__cached semver)
    ModName=$(ini 1value macros:__VDK_PYLIB_MODNAME__)
    build__fact "pystuff/mkvenv_dir" <<<"$MkvenvDir"
    build__fact "pystuff/mkvenv_script" <<<"$MkvenvScript"
    test -n "$Skel" || die "dist:pystuff not specified"
    test -f "$Skel" || die "setup.py template not found: $Skel"
    __pystuff__make_setup_py
    __pystuff__make_mkvenv
}

__pystuff__find_dist() {
    local candidate
    candidate=$(
        find "dist" -maxdepth 1 -mindepth 1 -printf '%P\n' \
          | grep -m1 -e "$ModName-.*tar.gz"
    )
    test -f "dist/$candidate" && echo "dist/$candidate" && return 0
    #shellcheck disable=SC2016
    warn "could not find dist package in: dist" \
         " .. hint: looking for $ModName-*.tar.gz" \
         ' .. hint: did you run `make pystuff` first?'
    return 3
}

__pystuff__make_setup_py() {
    build__file "$Skel" "setup.py" pystuff
    build__recordr dist
    build__recordr "$ModName.egg-info"
    python3 -m build
}

__pystuff__load_mkvenv_dir() {
    #
    # Safely load directory for the venv
    #
    util__loadenv PYSTUFF__VENV_DIR && return 0
    plugin__option_single "dir" && return 0
    echo venv
}

__pystuff__load_mkvenv_script() {
    #
    # Safely load command for the venv
    #
    util__loadenv PYSTUFF__VENV_SCRIPT && return 0
    plugin__option_single "mkvenv_script" && return 0
    echo mkvenv.sh
}

__pystuff__load_mkvenv_post() {
    #
    # Safely load command for the venv
    #
    util__loadenv PYSTUFF__VENV_POST && return 0
    plugin__option_multi "mkvenv_post" && return 0
}

__pystuff__q() {
    #
    # Quote command $@
    #
    printf '%q ' "$@";
    echo
}

__pystuff__make_mkvenv() {
    #
    # Create the mkvenv.sh script
    #
    local dist
    local req
    dist=$(__pystuff__find_dist) \
     || die "could not find dist"
    build__record "$MkvenvScript"
    {
        echo "#!/bin/sh -e"
        echo "#"
        echo "# created by MKit $MKIT_VERSION pystuff for $ModName-$ProjVersion"
        echo "#"
        echo ""
        __pystuff__q python3 -m venv "$MkvenvDir"
        __pystuff__q . "$MkvenvDir/bin/activate"
        python3 "setup.py" --requires \
          | grep . \
          | while read -r req; do
                __pystuff__q python3 -m pip install --force-reinstall "$req"
            done
        __pystuff__q python3 -m pip install --force-reinstall "$dist"
        echo ""
        echo "echo >&2 'Virtual environment should be ready. run following command:'"
        echo "echo >&2 ''"
        echo "echo >&2 '    source venv/bin/activate'"
        echo "echo >&2 ''"
        echo "echo >&2 'to activate it.'"
        test -n "$MkvenvPost" && {
            echo
            echo "#"
            echo "# user POST action ([options:pystuff:mkvenv_post]"
            echo "#"
            echo "$MkvenvPost"
        }
    } | sed 's/ *$//' >"$MkvenvScript"
    bash -n "$MkvenvScript" || die "script has syntax errors"
    chmod +x "$MkvenvScript"
}
