# shellcheck shell=dash

##x pip:
##x npm:
##x bun:

___x_cmd_solo___init(){
    local srcfile="$1";     shift
    solo:prepare:path "$srcfile"    || return $?

    local x_=""

    (
        ___x_cmd mkdirp "${wsdp}/.x-cmd"        ||  return $?
        ___x_cmd_cd0 "$wsdp"                    ||  return $?

        solo:info --src "$absfp" "cp to [PWD=$PWD]"
        ___x_cmd_cmds cp "$absfp" ./            ||  return $?

        solo:parse:init
        ___x_cmd_solo___parse_ "$absfp"
        {

            [ -z "$___X_CMD_SOLO_TRYINIT_CODE" ] || {
                printf "%s\n"       "$___X_CMD_SOLO_TRYINIT_CODE"
            }

            printf "%s\n"       '# setup begin' "$x_setup" '# setup end'

            x_="";  ___x_cmd_solo_tryinit___engine_;                x_engine="$x_"
            solo:info "engine is $x_engine"
            x_="";  ___x_cmd_solo_tryinit___code_ "$x_engine";      printf "%s\n" "$x_"

        } >".x-cmd/make"
        ___x_cmd rmrf .x-cmd/make.done

        {
            x_="";  ___x_cmd_solo_tryinit___runcode_  "$x_engine";  printf "%s\n" "$x_"
        } >".x-cmd/run"
    )
}

___x_cmd_solo_tryinit___engine_(){
    x_="$x_engine"
    [ -n "$x_" ] || {
        ___x_cmd_solo___detect_ "$wsfn"
    }
}

___x_cmd_solo_tryinit___code_(){
    local NL="${___X_CMD_UNSEENCHAR_NEWLINE}"
    case "$1" in
        go)
            x_='x go mod init main'
            [ -z "$x_go" ] || x_="${x_}${NL}___x_cmd go get ${x_go}"
            x_="${x_}${NL}___x_cmd go get"
            x_="${x_}${NL}___x_cmd go build \$(___x_cmd wsroot)/${wsfn}"
            ;;
        gop)
            x_='___x_cmd go mod init main'
            [ -z "$x_gop" ] || x_="${x_}${NL}gop get ${x_gop}"
            x_="${x_}${NL}___x_cmd go get"
            x_="${x_}${NL}___x_cmd gop build \$(___x_cmd wsroot)/${wsfn}"
            ;;
        xgo)
            x_='___x_cmd go mod init main'
            [ -z "$x_xgo" ] || x_="${x_}${NL}___x_cmd go get ${x_xgo}"
            x_="${x_}${NL}___x_cmd go get"
            x_="${x_}${NL}___x_cmd xgo build \$(___x_cmd wsroot)/${wsfn}"
            ;;
        zig)
            x_='___x_cmd zig init'
            [ -z "$x_zig" ] || x_="${x_}${NL}zig fetch ${x_zig}"
            x_="${x_}${NL}___x_cmd zig build-exe \$(___x_cmd wsroot)/${wsfn}"
            ;;

        node)
            x_='___x_cmd npm init -y'
            [ -z "$x_npm" ] || x_="${x_}${NL}___x_cmd npm install ${x_npm}"
            ;;

        python)
            if ___x_cmd os is win; then
                x_='___x_cmd python -m venv . && . ./Scripts/activate'
            else
                x_='___x_cmd python -m venv . && . ./bin/activate'
            fi
            [ -z "$x_pip" ] || x_="${x_}${NL}___x_cmd pip install ${x_pip}"
            ;;

        mojo)
            x_='___x_cmd mojo init -y'
            [ -z "$x_pip" ] || x_="${x_}${NL}___x_cmd magic add ${x_pip}"
            ;;

        bun)
            x_='___x_cmd bun init -y'
            [ -z "$x_bun" ] || x_="${x_}${NL}___x_cmd bun install ${x_bun}"
            ;;

        bun-compile)
            x_='___x_cmd bun init -y'
            [ -z "$x_bun" ] || x_="${x_}${NL}___x_cmd bun install ${x_bun}"
            x_="${x_}${NL}___x_cmd bun build \$(___x_cmd wsroot)/${wsfn} --compile --outfile $wsdp/${wsfn%.*}"
            ;;

        deno-compile)
            [ -z "$x_bun" ] || x_="${x_}${NL}___x_cmd deno install ${x_bun}"
            x_="${x_}${NL}___x_cmd deno compile \$(___x_cmd wsroot)/${wsfn}"
            ;;

        deno)
            # Just skip
            ;;

        c)
            x_="___x_cmd zig cc $wsfp -o $wsdp/${wsfn%.*}"
            ;;
        cpp)
            x_="___x_cmd zig c++ $wsfp -o $wsdp/${wsfn%.*}"
            ;;
        *)
            solo:warn "No engine found -> $1"
            x_=""
            ;;
    esac
}

___x_cmd_solo_tryinit___runcode_(){
    local NL="${___X_CMD_UNSEENCHAR_NEWLINE}"
    case "$1" in
        go|zig|c|cpp|bun-compile|deno-compile)
            if ___x_cmd os is win; then
                x_="$wsdp/${wsfn%"."*}.exe \"\$@\""
            else
                x_="$wsdp/${wsfn%"."*} \"\$@\""
            fi
            ;;
        gop|xgo)
            if ___x_cmd os is win; then
                x_="$wsdp/${1}_autogen.exe \"\$@\""
            else
                x_="$wsdp/${1}_autogen \"\$@\""
            fi
            ;;
        pip|deno|ruby|perl|julia|elisp|bun)
            x_="x $1 $wsdp/$wsfn \"\$@\""
            ;;
        python)
            if ___x_cmd os is win; then
                x_=". $wsdp/Scripts/activate"
            else
                x_=". $wsdp/bin/activate"
            fi
            x_="${x_}${NL}___x_cmd $1 $wsdp/$wsfn \"\$@\""
            x_="${x_}${NL}deactivate"
            ;;
        *)
            x_="___x_cmd $1 $wsdp/$wsfn \"\$@\""
            ;;
    esac
}
