# shellcheck    shell=dash      disable=1090,2034
# Section: attr
# ___x_cmd_pkg___attr   hook.install,hook.setup

___x_cmd_pkg___attr(){
    local name="$1";    [ -n "$name" ] || N=pkg M="Provide a package name" log:ret:1
    local version="$2"; [ -n "$version" ] || {
        local x_=; ___x_cmd_pkg_default_version_ "$name" "$osarch" || return $?
        version="$x_"
    }
    [ -n "$version" ] || N=pkg M="Not found $name version" log:ret:1
    local osarch="$3"
    [ -n "$osarch" ] || { ___x_cmd_pkg_osarch_ || return 1; osarch="$___X_CMD_PKG_OSARCH"; } || N=pkg M="Not found osarch" log:ret:1
    local QUERY="$4";   [ -n "$QUERY" ] || N=pkg M="Provide package attr" log:ret:1

    local str="$___X_CMD_PKG_METADATA_PATH/$osarch/$___X_CMD_WEBSRC_REGION/$name/$version/${QUERY}"
    local envfp="$___X_CMD_ROOT_TMP/pkg/attr$str"
    pkg:debug "attr envfp => $envfp"

    # TODO: Need to be removed in the future
    ___x_cmd_pkg_update___check # ensure existense of "$___X_CMD_PKG_FP_UPDATED_DONE"
    ___x_cmd depend run "$envfp" -- "$___X_CMD_PKG_FP_UPDATED_DONE" -- ___x_cmd_pkg___attr_code_inner "$name" "$version" "$osarch" "$QUERY" "$envfp"
    [ -f "$envfp" ] || return $?
    . "$envfp"
}

___x_cmd_pkg___attr_code_inner(){
    local name="$1";    local version="$2";     local osarch="$3";
    local QUERY="$4";   local envfp="$5"
    ___x_cmd ensurefp "$envfp"
    {
        local datalist; datalist="$( ___x_cmd_pkg___all_info "$name" "$version" "$osarch" )" || {
            printf "\n%s\n" "pkg:error \"Not found pkg [name=$name] [version=$version] information data\"; false;"
            return 1
        }

        printf "%s\n" "$datalist" | \
        LC_ALL="$___X_CMD_AWK_LANGUAGE" ___x_cmd_cmds_awk \
            -v QUERY="$QUERY" \
            -f "$___X_CMD_ROOT_MOD/awk/lib/core.awk" \
            -f "$___X_CMD_ROOT_MOD/awk/lib/sh.awk" \
            -f "$___X_CMD_ROOT_MOD/awk/lib/j/json.awk"   \
            -f "$___X_CMD_ROOT_MOD/awk/lib/j/jqparse.awk" \
            -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/util.awk" \
            -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg._.awk" \
            -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg.attr.awk" \
            || printf "\n%s\n" "pkg:error \"Not found pkg [name=$name] [version=$version] information data\"; false;"
    } > "$envfp"
}

# EndSection

# Section: script
# Get Script Path
___x_cmd_pkg___get_script_path(){
    local script="${4:?Provide sciprt}"

    local datalist; datalist="$( ___x_cmd_pkg___all_info --non-version "$@" )" || return $?
    printf "%s\n\n" "$datalist" | LC_ALL="$___X_CMD_AWK_LANGUAGE" ___x_cmd_cmds_awk \
        -v SCRIPT="$script" \
        -f "$___X_CMD_ROOT_MOD/awk/lib/core.awk" \
        -f "$___X_CMD_ROOT_MOD/awk/lib/j/json.awk"   \
        -f "$___X_CMD_ROOT_MOD/awk/lib/j/jqparse.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/util.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg._.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg.script.awk"
}
# EndSection

# Section: osarch

# TODO: return x_ in the future ...
___x_cmd_pkg_osarch_(){
    local x_=""
    local tmp=""
    if [ -z "$___X_CMD_PKG_OSARCH" ]; then
        ___x_cmd __osname_ || return 1;     tmp="$x_"
        ___x_cmd __osarch_ || return 1;     ___X_CMD_PKG_OSARCH="$tmp/$x_"
        [ -n "$___X_CMD_PKG_OSARCH" ] || return 1
    fi
}

___x_cmd_pkg_osarch(){
    ___x_cmd_pkg_osarch_ || return $?
    printf "%s\n" "$___X_CMD_PKG_OSARCH"
}

___x_cmd_pkg___isdarwin(){
    local x_=""
    ___x_cmd __osname_
    [ "$x_" = darwin ]
}

# EndSection

# Section: tree name
___x_cmd_pkg_treename_(){
    local name="$1";    local version="$2";     local osarch="$3"
    [ -n "$osarch" ] || { ___x_cmd_pkg_osarch_ || return 1; osarch="$___X_CMD_PKG_OSARCH"; } || N=pkg M="Not found osarch" log:ret:1

    local tree=; ___x_cmd_pkg___attr "$name" "$version" "$osarch" "tree" || return $?
    ___x_cmd_pkg_treename_get_form_tree_ "$osarch" "$tree"
}

___x_cmd_pkg_treename_get_form_tree_(){
    local osarch="$1"
    local tree="$2"
    [ -z "$tree" ]|| {
        x_treename="tree.$tree"
        return
    }

    [ -n "$osarch" ] || { ___x_cmd_pkg_osarch_ || return 1; osarch="$___X_CMD_PKG_OSARCH"; } || N=pkg M="Not found osarch" log:ret:1

    # default
    local os="${osarch%%/*}"
    local arch="${osarch#*/}"
    case "$os" in
        linux)  x_treename="tree.${os}.${arch}.0"    ;;
        win)    x_treename="tree.${os}.${arch}.0"    ;;
        *)      x_treename="tree.${os}.${arch}.0"       ;;
    esac
}

# EndSection

# Section: get raw text from all.7z
___x_cmd_pkg_locate(){
    local tgt="${1:?Provide name}"
    ___x_cmd_pkg_ll_inner | ___x_cmd_cmds_awk -v FS=/ -v RS="\t" -v tgt="$tgt" '$2==tgt{ TGT=1; print $0 } { if(TGT>0){exit(1)}} END{{exit(0)}}'
}

# Default, China
___x_cmd_pkg___all_info(){
    local version_json=
    case "$1" in
        --non-version) version_json="--non-version"; shift ;;
    esac
    local name="$1";    [ -n "$name" ] || N=pkg M="Provide a package name" log:ret:1
    local osarch="$3";  [ -n "$osarch" ] || { ___x_cmd_pkg_osarch_ || return 1; osarch="$___X_CMD_PKG_OSARCH"; } || N=pkg M="Not found osarch" log:ret:1
    local version="${2:-""}"

    if [ "$name" = "$CUSTOMIZE_PKG_NAME" ]; then
        name="$CUSTOMIZE_PKG_PATH"
    else
        name="$(___x_cmd_pkg_locate "$name")" || return $?
        [ -n "$name" ] || N=pkg M="Not found pkg [name=$1] meta information" log:ret:1
    fi

    # pkg:debug --name "$name"  --version "$version" --osarch "$osarch"  --___X_CMD_PKG_METADATA_PATH "$___X_CMD_PKG_METADATA_PATH" --___X_CMD_WEBSRC_REGION "$___X_CMD_WEBSRC_REGION" "all info"
    printf "%s\n%s\n%s\n%s\n%s\n" "$name" "$version" "$osarch" "$___X_CMD_PKG_METADATA_PATH" "$___X_CMD_WEBSRC_REGION"

    ___x_cmd_cmds_cat "$___X_CMD_PKG_METADATA_PATH/$name/meta.tt.json" 2>/dev/null || N=pkg M="Not found pkg [name=$name] meta information" log:ret:1
    printf "\n"

    if [ -z "$version_json" ]; then
        ___x_cmd_cmds_cat "$___X_CMD_PKG_METADATA_PATH/$name/version.tt.json" 2>/dev/null || N=pkg M="Not found pkg [name=$name] version information" log:ret:1
    else
        printf "\n"
    fi
}
# EndSection

___x_cmd_pkg___list(){
    local expr="${4:?Provide EXPR, like bin, url.cn}"

    local datalist; datalist="$( ___x_cmd_pkg___all_info "$@" )" || return $?
    printf "%s\n" "$datalist" | LC_ALL="$___X_CMD_AWK_LANGUAGE" ___x_cmd_cmds_awk \
        -v EXPR="$expr" \
        -f "$___X_CMD_ROOT_MOD/awk/lib/core.awk" \
        -f "$___X_CMD_ROOT_MOD/awk/lib/j/json.awk"   \
        -f "$___X_CMD_ROOT_MOD/awk/lib/j/jqparse.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/util.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg._.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg.list.awk"
}

___x_cmd_pkg_default_version(){
    local x_=; ___x_cmd_pkg_default_version_ "$@" || return $?
    printf "%s\n" "$x_"
}
___x_cmd_pkg_default_version_(){
    local X_help_cmd='___x_cmd help -m pkg default_version'; help:arg:parse
    local name="$1";    [ -n "$name" ] || N=pkg M="Provide a package name" log:ret:1
    local osarch="$2";  [ -n "$osarch" ] || { ___x_cmd_pkg_osarch_ || return 1; osarch="$___X_CMD_PKG_OSARCH"; } || N=pkg M="Not found osarch" log:ret:1

    local str="$___X_CMD_PKG_METADATA_PATH/$osarch/$name"
    local envfp="$___X_CMD_ROOT_TMP/pkg/default_version_$str"
    pkg:debug "default version envfp => $envfp"

    # TODO: Need to be removed in the future
    ___x_cmd_pkg_update___check # ensure existense of "$___X_CMD_PKG_FP_UPDATED_DONE"
    ___x_cmd depend run "$envfp" -- "$___X_CMD_PKG_FP_UPDATED_DONE" -- ___x_cmd_pkg_default_version___inner "$name" "$osarch" "$envfp" || return $?

    [ -f "$envfp" ] || return $?
    . "$envfp"
}

___x_cmd_pkg_default_version___inner(){
    local name="$1";    local osarch="$2";  local envfp="$3"
    ___x_cmd ensurefp "$envfp"
    local datalist; datalist="$( ___x_cmd_pkg___all_info --non-version "$name" "" "$osarch" )" || return $?
    printf "%s\n\n" "$datalist" | LC_ALL="$___X_CMD_AWK_LANGUAGE" ___x_cmd_cmds_awk \
        -f "$___X_CMD_ROOT_MOD/awk/lib/core.awk" \
        -f "$___X_CMD_ROOT_MOD/awk/lib/j/json.awk"   \
        -f "$___X_CMD_ROOT_MOD/awk/lib/j/jqparse.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/util.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg._.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg.default_version.awk" > "$envfp"
}

___x_cmd_pkg_latest_version(){
    local x_=; ___x_cmd_pkg_latest_version_ "$@" || return $?
    printf "%s\n" "$x_"
}

___x_cmd_pkg_latest_version_(){
    local X_help_cmd='___x_cmd help -m pkg latest_version'; help:arg:parse
    local name="$1";    [ -n "$name" ] || N=pkg M="Provide a package name" log:ret:1
    local osarch="$2";  [ -n "$osarch" ] || { ___x_cmd_pkg_osarch_ || return 1; osarch="$___X_CMD_PKG_OSARCH"; } || N=pkg M="Not found osarch" log:ret:1

    local str="$___X_CMD_PKG_METADATA_PATH/$osarch/$name"
    local envfp="$___X_CMD_ROOT_TMP/pkg/latest_version_$str"
    pkg:debug "latest version envfp => $envfp"

    ___x_cmd_pkg_update___check
    ___x_cmd depend run "$envfp" -- "$___X_CMD_PKG_FP_UPDATED_DONE" -- ___x_cmd_pkg_latest_version___inner "$name" "$osarch" "$envfp" || return $?

    [ -f "$envfp" ] || return $?
    . "$envfp"
}
___x_cmd_pkg_latest_version___inner(){
    local name="$1";    local osarch="$2";  local envfp="$3"
    local QUERY="latest_version"
    local datalist; datalist="$( ___x_cmd_pkg___all_info --non-version "$name" "" "$osarch" )" || return $?
    local latest_version=
    eval "$(
        printf "%s\n\n" "$datalist" | \
            LC_ALL="$___X_CMD_AWK_LANGUAGE" ___x_cmd_cmds_awk \
                -v QUERY="$QUERY" \
                -f "$___X_CMD_ROOT_MOD/awk/lib/core.awk" \
                -f "$___X_CMD_ROOT_MOD/awk/lib/sh.awk" \
                -f "$___X_CMD_ROOT_MOD/awk/lib/j/json.awk"   \
                -f "$___X_CMD_ROOT_MOD/awk/lib/j/jqparse.awk" \
                -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/util.awk" \
                -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg._.awk" \
                -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg.attr.awk"
    )"
    [ -n "$latest_version" ] || return $?
    ___x_cmd ensurefp "$envfp"
    printf "%s\n" "x_=$latest_version" > "$envfp"
}


___x_cmd_pkg___get_dep_name(){
    local expr="${4:?Provide EXPR, like path}"

    local datalist; datalist="$( ___x_cmd_pkg___all_info --non-version "$@" )" || return $?
    printf "%s\n\n" "$datalist" | LC_ALL="$___X_CMD_AWK_LANGUAGE" ___x_cmd_cmds_awk \
        -v EXPR="$expr" \
        -f "$___X_CMD_ROOT_MOD/awk/lib/core.awk" \
        -f "$___X_CMD_ROOT_MOD/awk/lib/j/json.awk"   \
        -f "$___X_CMD_ROOT_MOD/awk/lib/j/jqparse.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/util.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg._.awk" \
        -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/pkg.link_content.awk"
}

___x_cmd_pkg___is_support(){
    [ "$#" -eq 1 ] || return $?
    local i; for i in "$___X_CMD_PKG_METADATA_PATH/"*; do
        [ ! -d "$i/$1" ] || return 0
    done
    return 1
}

___x_cmd_pkg___is_support_version(){
    local name="$1";        [ -n "$name" ] || N=pkg M="Provide a package name" log:ret:64
    local version="$2";     [ -n "$version" ] || N=pkg M="Provide the package version" log:ret:64
    local jsonfp

    case "$name" in
        */*)    jsonfp="$___X_CMD_PKG_METADATA_PATH/$name/version.tt.json" ;;
        *)      jsonfp="$(___x_cmd_cmds find "$___X_CMD_PKG_METADATA_PATH"/*/"$name/version.tt.json")" 2>/dev/null ;;
    esac

    [ -f "$jsonfp" ] || {
        pkg:error "Not found version.tt.json of [pkg=$name]"
        return 1
    }

    local l=""
    ___x_cmd_pkg_ls___all_version "$jsonfp" | {
        while ___x_cmd_readr l; do
            [ "$l" = "$version" ] || continue
            return 0
        done
        return 1
    }
}


___x_cmd_pkg___is_support_use(){
    local op="$1"
    case "$op" in
        bash-preexec) return 1 ;;
        *)            return 0 ;;
    esac
}

___x_cmd_pkg___recorrect_name(){
    local name="$1"
    ___x_cmd_pkg_ll | ___x_cmd_cmds_awk -v pkg_name="$name" -v FS="/" -f "$___X_CMD_ROOT_MOD/pkg/lib/awk/recorrect_name.awk"
}

# Section: env
___x_cmd_pkg___pasre_pkg_version_set(){
    name=; version=
    [ -n "$1" ] || M='Please provide pkg name and its version in form of <pkg>=<version>' N=pkg log:ret:1
    case "${1}" in
        *=*)
            name="${1%=*}"
            version="${1#*=}"
            ;;
        *)
            name="${1}"
            local x_=; ___x_cmd_pkg_default_version_ "$1" || return $?
            version="$x_"
    esac
}

___x_cmd_pkg___current_version_(){
    ___x_cmd_pkg_sphere_use get_version_ "$@"
    [ -n "$x_" ] || ___x_cmd_pkg_sphere_try get_version_ "$@"
}

# EndSection
