# Author:       Li Junhao           l@x-cmd.com
# shellcheck    shell=sh            disable=SC3043,SC2164     # xrc

# license:      GPLv3

___X_CMD_TMPL_B="${___X_CMD_UNSEENCHAR_001}"
___X_CMD_TMPL_E="${___X_CMD_UNSEENCHAR_002}"

___X_CMD_T="${___X_CMD_TMPL_B}"

___X_CMD_TX="${___X_CMD_TMPL_B}X${___X_CMD_TMPL_E}"
___X_CMD_T1="${___X_CMD_TMPL_B}1${___X_CMD_TMPL_E}"
___X_CMD_T2="${___X_CMD_TMPL_B}2${___X_CMD_TMPL_E}"
___X_CMD_T3="${___X_CMD_TMPL_B}3${___X_CMD_TMPL_E}"
___X_CMD_T4="${___X_CMD_TMPL_B}4${___X_CMD_TMPL_E}"
___X_CMD_T5="${___X_CMD_TMPL_B}5${___X_CMD_TMPL_E}"
___X_CMD_T6="${___X_CMD_TMPL_B}6${___X_CMD_TMPL_E}"
___X_CMD_T7="${___X_CMD_TMPL_B}7${___X_CMD_TMPL_E}"
___X_CMD_T8="${___X_CMD_TMPL_B}8${___X_CMD_TMPL_E}"
___X_CMD_T9="${___X_CMD_TMPL_B}9${___X_CMD_TMPL_E}"


___x_cmd_tmpl(){
    local ___X_CMD_TMPL_
    ___x_cmd_tmpl_ "$@" || return
    printf "%s\n" "$___X_CMD_TMPL_"
}

___x_cmd_tmpl_(){
    local ___X_CMD_TMPL_TEMPLATE="${1:?Provide template string}";   shift
    case "$1" in
        :*:)                        ___x_cmd_tmpl_sub_ "$@" ;;
        :*:=*)                      ___x_cmd_tmpl_sub_eq_ "$@" ;;

        [*])                        ___x_cmd_tmpl_sub_ "$@" ;;
        [*]=*)                      ___x_cmd_tmpl_sub_eq_ "$@" ;;

        *)                          ___x_cmd_tmpl_1by1_ "$@" ;
    esac
}

___x_cmd_tmpl_sub_(){
    ___X_CMD_TMPL_=

    ___x_cmd_str_replace_ "$___X_CMD_TMPL_TEMPLATE" "${___X_CMD_TMPL_B}${1:?Provide name}" "${2:?Provide name}" || return 1
    ___X_CMD_TMPL_="$___X_CMD_STR_REPLACE_"
}

___x_cmd_tmpl_sub_eq_(){
    ___X_CMD_TMPL_=

    local key
    local val
    local ___X_CMD_STR_REPLACE_
    local code=0
    local arg; for arg in "$@"; do
        key="${arg%%=*}"
        val="${arg#"$key"=}"
        ___x_cmd_str_replace_ "$___X_CMD_TMPL_TEMPLATE" "${___X_CMD_TMPL_B}${key}" "$val" || code=1
        ___X_CMD_TMPL_TEMPLATE="$___X_CMD_STR_REPLACE_"
    done
    ___X_CMD_TMPL_="$___X_CMD_TMPL_TEMPLATE"
    return "$code"
}

___x_cmd_tmpl_1by1_(){
    ___X_CMD_TMPL_=

    local ___X_CMD_STR_REPLACE_="$___X_CMD_TMPL_TEMPLATE"
    local arg; for arg in "$@"; do
        if ! ___x_cmd_str_replace_ "$___X_CMD_STR_REPLACE_" "${___X_CMD_TX}" "$arg"; then
            ___X_CMD_TMPL_="$___X_CMD_STR_REPLACE_"
            x:error "x tmpl: Fail to proceed in [$arg]"
            return 1
        fi
    done
    ___X_CMD_TMPL_="$___X_CMD_STR_REPLACE_"
}

# Move to str
___x_cmd_str_replace(){
    local ___X_CMD_STR_REPLACE_
    ___x_cmd_str_replace_ "$@"
    printf "%s\n" "$___X_CMD_STR_REPLACE_"
}

___x_cmd_str_replace_(){
    local org="${1:?Original string}"
    local src="${2:?Source substring}"
    local tgt="${3:?Target string}"

    local rest=${org#*"${src}"}
    [ "$rest" != "$org" ] || { ___X_CMD_STR_REPLACE_="$org"; return 1; }
    ___X_CMD_STR_REPLACE_="${org%%"${src}"*}${tgt}${rest}"
}

# Not used
___x_cmd_tmpl_name_(){
    ___X_CMD_TMPL_NAME_="${___X_CMD_TMPL_B}${1:?Provide name}${___X_CMD_TMPL_E}"
}

___x_cmd_tmpl_name(){
    local ___X_CMD_TMPL_NAME_
    ___x_cmd_tmpl_name_ "$@"
    printf "%s\n" "$___X_CMD_TMPL_NAME_"
}


# x tmpl "${___X_CMD_TX}, ${___X_CMD_TX}" hello world

# x tmpl "${___X_CMD_T}:abc:, ${___X_CMD_T}:cde:" :cde:=world :abc:=hello
# x tmpl "${___X_CMD_T}[abc], ${___X_CMD_T}[cde]" [cde]=world [abc]=hello
# x tmpl "${___X_CMD_T}[2], ${___X_CMD_T}[1]" [1]=world [2]=hello

# ___X_CMD_TMPL_="${___X_CMD_T}:abc:, ${___X_CMD_T}:cde:"
# x tmpl_ "$___X_CMD_TMPL_" :cde:  world
# x tmpl_ "$___X_CMD_TMPL_" :abc:  hello
# printf "%s\n" "$___X_CMD_TMPL_"


xrc setmain ___x_cmd_tmpl
