# shellcheck shell=dash

# x-cmd.engine: <python|node|ts-node|java|kotlin|groovy|r|julia|ruby|perl>
# x-cmd.setup:  <code>
# x-cmd.mode: <inplace|ws>
# x-cmd.end:

___x_cmd_solo___parse(){
    local x_engine
    local x_setup
    local x_mode

    ___x_cmd_solo___parse_ "$1" || return
    printf "engine: %s\n" "$x_engine"
    printf "setup: %s\n"  "$x_setup"
    printf "mode: %s\n"   "$x_mode"
}

alias solo:parse:init='
local x_pkg="";
local x_pixi="";
local x_engine="";
local x_setup="";
local x_mode="";
local x_pip="";
local x_magic="";
local x_zig="";
local x_go="";
local x_gop="";
local x_xgo="";
local x_deno="";
local x_bun="";
local x_deno="";
'

alias solo:parse:clear='
x_pkg="";
x_pixi="";
x_engine="";
x_setup="";
x_mode="";
x_pip="";
x_magic="";
x_zig="";
x_go="";
x_gop="";
x_xgo="";
x_deno="";
x_bun="";
x_deno="";
'

___x_cmd_solo___parse_(){
    solo:parse:clear

    x_dependency=
    local filepath="$1"; shift

    case "$filepath" in
        *\.yml|*\.json)
            x_engine="${filepath##*.}"
            return
            ;;
    esac

    local line; local i=0;
    while read -r line; do
        i=$((i+1)); [ "$i" -lt 10 ] || break
        case "$line" in
            ??"x "*:*|*x-cmd.*:*)
                { ___x_cmd_solo___parse_main_ || return ;} <<A
$line
$(___x_cmd_cmds_cat)
A
            break
            ;;
            *)  continue
        esac
    done < "$filepath"
    # If there is not engine declaration, the file will run directly.
    return 0
}

___x_cmd_solo___parse_main_(){
    local SEP="  "
    local line
    while read -r line; do
        case "$line" in
            ??"x pixi: "*)      x_pixi="${x_pixi}${SEP}${line#*:" "}"      ;;
            ??"x pkg: "*)       x_pkg="${x_pkg}${SEP}${line#*:" "}"         ;;

            ??"x npm: "*)       x_npm="${x_npm}${SEP}${line#*:" "}"         ;;
            ??"x bun: "*)       x_bun="${x_bun}${SEP}${line#*:" "}"         ;;

            ??"x pip: "*)       x_pip="${x_pip}${SEP}${line#*:" "}"         ;;
            ??"x magic: "*)     x_magic="${x_magic}${SEP}${line#*:" "}"     ;;

            ??"x zig: "*)       x_zig="${x_zig}${SEP}${line#*:" "}"         ;;
            ??"x go: "*)        x_go="${x_go}${SEP}${line#*:" "}"           ;;
            ??"x xgo: "*)       x_xgo="${x_xgo}${SEP}${line#*:" "}"         ;;
            ??"x gop: "*)       x_gop="${x_gop}${SEP}${line#*:" "}"         ;;

            ??"x engine: "*)    x_engine="${line#*:" "}"    ;;
            ??"x mode: "*)      x_mode="${line#*:" "}"      ;;
            ??"x setup: "*)     x_setup="${line#*:" "}"     ;;
            ??"x init: "*)      x_init="${line#*:" "}"      ;;

            *x-cmd.engine:*)
                x_engine=${line##*:*" "}
                x_engine=${x_engine%%" "*}
                case "${x_engine}" in
                    python|\
                    node|deno|ts-node|bun|\
                    java|kotlin|groovy|clojure|scala|\
                    c|cpp|zig|\
                    bash|zsh|fish|ksh|elvish|nu|\
                    r|julia|ruby|\
                    perl|raku|\
                    xrc|source|xsh)
                        ;;
                    *)
                        solo:error "Engine not found ==> $x_engine"
                        return 1
                esac
                ;;
            *x-cmd.mode*:*)
                x_mode=${line#*:*" "}
                x_mode=${x_mode%%" "*}
                case "${x_mode}" in
                    inplace|ws)
                        ;;
                    *)
                        solo:error "Mode not found ==> ${x_mode}"
                        return 1
                esac
                ;;
            *x-cmd.setup*:*)
                line="${line#*:}"
                x_setup="${x_setup}${line}${___X_CMD_UNSEENCHAR_NEWLINE}"

                solo:debug "setup=$line"
                # Put the code into a seperate directory
                ;;
            *x-cmd.end*)
                break
            ;;

            *)  continue
        esac
    done
}

___x_cmd_solo___parse(){
    solo:parse:init
    ___x_cmd_solo___parse_ "$@"

    printf "%s:\t%s\n"  setup   "$x_setup"
    printf "%s:\t%s\n"  mode    "$x_mode"
    printf "%s:\t%s\n"  pkg     "$x_pkg"
    printf "%s:\t%s\n"  pixi    "$x_pixi"
    printf "%s:\t%s\n"  npm     "$x_npm"
    printf "%s:\t%s\n"  bun     "$x_bun"
    printf "%s:\t%s\n"  pip     "$x_pip"
    printf "%s:\t%s\n"  magic   "$x_magic"
    printf "%s:\t%s\n"  zig     "$x_zig"
    printf "%s:\t%s\n"  go      "$x_go"
    printf "%s:\t%s\n"  gop     "$x_gop"
    printf "%s:\t%s\n"  xgo     "$x_xgo"
    printf "%s:\t%s\n"  deno    "$x_deno"
}
