# shellcheck shell=dash

___x_cmd_pkg_sphere_depend(){
    local op="$1"
    case "$op" in
        file|path_|prepare|remove|dependent|dependency)
            shift; ___x_cmd_pkg_sphere_depend_"$op" "$@" ;;
        *)  N=pkg M="sphere depend not such option '$op'" log:ret:64 ;;
    esac
}

___x_cmd_pkg_sphere_depend_dependent(){
    pkg:sphere:parse:args
    pkg:info "Find the dependencies of [pkg=$name] [version=$version] [osarch=$osarch]"
    ___x_cmd_pkg___list "${name}" "${version}" "${osarch}" dep | ___x_cmd_pkg_ls___show_info "="
}

___x_cmd_pkg_sphere_depend_dependency(){
    # local X_help_cmd='___x_cmd help -m pkg sphere depend dependency';
    pkg:sphere:parse:args
    local dependency_dir="$___X_CMD_PKG_ROOT_SPHERE/$sphere_name/.x-cmd/dependency/$osarch"
    [ -d "$dependency_dir" ] || return 1

    pkg:info "Find who depends on [pkg=$name] [version=$version] [osarch=$osarch]"
    local pkg=; local file=; local x_name=; local x_version=
    while ___x_cmd_readr pkg; do
        file="$dependency_dir/$pkg"
        [ -f "$file" ] || continue
        ___x_cmd_pkg_sphere_depend_file___exist___record "$file" "$name" "$version" || continue
        ___x_cmd_pkg___split_name_version_ "$pkg"
        printf "%s=%s\n" "$x_name" "$x_version"  | ___x_cmd_pkg_ls___show_info "="
    done <<A
$( ___x_cmd fsiter "$dependency_dir" )
A
}

___x_cmd_pkg_sphere_depend_path_(){
    pkg:sphere:parse:args
    local binpath=; local line=; local dep_name=; local dep_version=; local dep_binpath=
    x_=
    while ___x_cmd_readr line; do
        [ -n "$line" ] || continue
        dep_name="${line%%=*}"
        dep_version="${line#*=}"
        x_treename=; ___x_cmd_pkg_treename_ "$dep_name" "$dep_version" "$osarch" || return $?
        dep_binpath="$(___x_cmd_pkg___list "$dep_name" "$dep_version" "$osarch" path.bin)" || return $?
        [ -n "$dep_binpath" ] || continue
        dep_binpath="$___X_CMD_PKG_ROOT_SPHERE/$sphere_name/$x_treename/$dep_name/$dep_version/$dep_binpath"
        binpath="${binpath}:${dep_binpath}"
    done <<A
$( ___x_cmd_pkg___list "${name}" "${version}" "${osarch}" dep )
A
    [ -n "$binpath" ] || return $?
    x_="${binpath#:}"
}

___x_cmd_pkg_sphere_depend_prepare(){
    pkg:sphere:parse:args

    local line=;        local dep_name=;        local dep_version=
    ___x_cmd_pkg___list "${name}" "${version}" "${osarch}" dep | while ___x_cmd_readr line; do
        [ -n "$line" ] || continue
        dep_version="${line#*=}"
        dep_name="${line%%=*}"
        # trap 'x pkg remove $dep_name $dep_version "$___X_CMD_PKG_OSARCH" "$sphere_name"; printf "\r\n";  pkg:error "Download interrupted"; return 1;' INT
        log:sub:init -i "$dep_name" pkg "Downloading ${osarch} ${name} ${version} dependency"
        ___x_cmd_pkg_sphere_add --prebuild --protection dependency --sphere "$sphere_name" --sphereroot "$___X_CMD_PKG_ROOT_SPHERE" --osarch "$osarch" "$dep_name" "$dep_version" || return $?
        log:sub:fini
    done
}

___x_cmd_pkg_sphere_depend_remove(){
    pkg:sphere:parse:args

    local line=;        local dep_name=;        local dep_version=
    ___x_cmd_pkg___list "${name}" "${version}" "${osarch}" dep | while ___x_cmd_readr line; do
        [ -n "$line" ] || continue
        dep_version="${line#*=}"
        dep_name="${line%%=*}"
        log:sub:init -i "$dep_name" pkg "Removing ${osarch} ${name} ${version} dependency"
        ___x_cmd_pkg_sphere_remove --sphere "$sphere_name" --sphereroot "$___X_CMD_PKG_ROOT_SPHERE" --osarch "$osarch" "$dep_name" "$dep_version" || return $?
        log:sub:fini
    done
}

# Section: dependency file
___x_cmd_pkg_sphere_depend_file(){
    local op="$1"
    case "$op" in
        ls|add|rm|exist)
            shift; ___x_cmd_pkg_sphere_depend_file___"$op" "$@" ;;
        *)  N=pkg M="sphere depend file not such option '$op'" log:ret:64 ;;
    esac
}

___x_cmd_pkg_sphere_depend_file___ls(){
    pkg:sphere:parse:option
    sphere_name="${sphere_name:-"X"}"
    local dependency_dir="$___X_CMD_PKG_ROOT_SPHERE/$sphere_name/.x-cmd/dependency/$osarch"
    [ -d "$dependency_dir" ] || return 0
    ___x_cmd fsiter "$dependency_dir"
}

___x_cmd_pkg_sphere_depend_file___exist(){
    pkg:sphere:parse:args
    local dependency_dir="$___X_CMD_PKG_ROOT_SPHERE/$sphere_name/.x-cmd/dependency/$osarch"
    [ -d "$dependency_dir" ] || return 1

    local file=;
    while ___x_cmd_readr file; do
        file="$dependency_dir/$file"
        [ -f "$file" ] || continue
        ___x_cmd_pkg_sphere_depend_file___exist___record "$file" "$name" "$version" || continue
        return 0
    done <<A
$( ___x_cmd fsiter "$dependency_dir" )
A
    return 1
}

___x_cmd_pkg_sphere_depend_file___exist___record(){
    local file="$1"
    local name="$2"
    local version="$3"
    local line=;
    while ___x_cmd_readr line; do
        [ -n "$line" ] || continue
        [ "${line}" = "${name}=${version}" ] || continue
        return 0
    done < "$file"
    return 1
}

___x_cmd_pkg_sphere_depend_file___add(){
    pkg:sphere:parse:args
    local dependency_file="$___X_CMD_PKG_ROOT_SPHERE/$sphere_name/.x-cmd/dependency/$osarch/${name}_${version}"
    local deplist=; deplist="$(___x_cmd_pkg___list "${name}" "${version}" "${osarch}" dep)" || return $?
    [ -n "$deplist" ] || return 0
    pkg:debug "Add $name $version dependent file"
    ___x_cmd ensurefp "$dependency_file"
    printf "%s\n" "$deplist" > "$dependency_file"
}

___x_cmd_pkg_sphere_depend_file___rm(){
    pkg:sphere:parse:args
    local dependency_file="$___X_CMD_PKG_ROOT_SPHERE/$sphere_name/.x-cmd/dependency/$osarch/${name}_${version}"
    [ -f "$dependency_file" ] || return 0
    pkg:debug "Remove $name $version dependent file"
    ___x_cmd rmrf "$dependency_file"
}
# EndSection
