# shellcheck shell=dash

___x_cmd_pkg_bootupdate(){
    if [ -f "$___X_CMD_ROOT_EXTMETA_TAR" ]; then
        ___x_cmd_pkg_bootupdate___tar
    elif [ -d "$___X_CMD_ROOT_EXTMETA" ]; then
        ___x_cmd_pkg_bootupdate___folder
    else
        ___x_cmd_pkg_update
    fi
}

___x_cmd_pkg_bootupdate___tar(){
    [ -f "$___X_CMD_ROOT_EXTMETA_TAR" ]             || N=pkg M="Not found pkg extmeta tar file" log:ret:1
    ___x_cmd_pkg_bootupdate___tar_prepare_pkg       || return $?
    ___x_cmd_pkg_bootupdate___tar_prepare_advise    || return $?
    ___x_cmd_pkg_bootupdate___tar_prepare_theme
}

___x_cmd_pkg_bootupdate___tar_prepare_pkg(){
    xrc:mod:lib pkg     envvar

    local metatar="$___X_CMD_ROOT_EXTMETA_TAR"
    [ -f "$metatar" ] || N=pkg M="Not found extmeta tar file -> $metatar" log:ret:1
    local tgtdir="$___X_CMD_METADATA_FOLDER"
    local tmpdir="$___X_CMD_ROOT_TMP/extmeta"
    pkg:info --extmeta_tar "$metatar" --metadata_folder "$tgtdir" "Extracting pkg metadata"

    [ -d "$tmpdir" ] || ___x_cmd mkdirp "$tmpdir"
    ___x_cmd_cmds tar -xf "$metatar" -C "$tmpdir" "./pkg/$___X_CMD_PKG_VERSION" || N=pkg M="Failed to extract extmeta tar file" log:ret:1
    local tmpdetail="$tmpdir/pkg/$___X_CMD_PKG_VERSION"
    [ -d "$tmpdetail" ] || N=pkg M="Not found extracted extmeta pkg folder -> $tmpdetail" log:ret:1

    [ ! -d "$tgtdir" ] || ___x_cmd rmrf "$tgtdir"
    tgtdir="${tgtdir%/*}"
    ___x_cmd mkdirp "$tgtdir"
    ___x_cmd_cmds mv -f "$tmpdetail" "$tgtdir" || return $?
    ___x_cmd rmrf "$tmpdir"

    ___x_cmd ensurefp "$___X_CMD_PKG_FP_UPDATED_DONE"
    printf "%s\n" "" > "$___X_CMD_PKG_FP_UPDATED_DONE"
}

___x_cmd_pkg_bootupdate___tar_prepare_advise(){
    xrc:mod:lib advise env

    local metatar="$___X_CMD_ROOT_EXTMETA_TAR"
    [ -f "$metatar" ] || N=pkg M="Not found extmeta tar file -> $metatar" log:ret:1
    local tgtdir="$___X_CMD_ADVISE_MAN_XCMD_FOLDER"
    local tmpdir="$___X_CMD_ROOT_TMP/extmeta"
    pkg:info --extmeta_tar "$metatar" --metadata_folder "$tgtdir" "Extracting x-cmd/advise metadata"

    [ -d "$tmpdir" ] || ___x_cmd mkdirp "$tmpdir"
    ___x_cmd_cmds tar -xf "$metatar" -C "$tmpdir" "./advise/$___X_CMD_ADVISE_MAN_PKG_XCMD_VERSION" || N=pkg M="Failed to extract extmeta tar file" log:ret:1
    local tmpdetail="$tmpdir/advise/$___X_CMD_ADVISE_MAN_PKG_XCMD_VERSION"
    [ -d "$tmpdetail" ] || N=pkg M="Not found extracted extmeta x-cmd/advise folder -> $tmpdetail" log:ret:1

    [ ! -d "$tgtdir" ] || ___x_cmd rmrf "$tgtdir"
    tgtdir="${tgtdir%/*}"
    ___x_cmd mkdirp "$tgtdir"
    ___x_cmd_cmds mv -f "$tmpdetail" "$tgtdir" || return $?
    ___x_cmd rmrf "$tmpdir"

    ___x_cmd touch "$___X_CMD_ADVISE_MAN_XCMD_FOLDER/timefile"
    ___x_cmd advise __rm_bootcode
}

___x_cmd_pkg_bootupdate___tar_prepare_theme(){
    xrc:mod:lib theme envvar

    local metatar="$___X_CMD_ROOT_EXTMETA_TAR"
    [ -f "$metatar" ] || N=pkg M="Not found extmeta tar file -> $metatar" log:ret:1
    local tgtdir="$___X_CMD_THEME_DATA_PATH"
    local tmpdir="$___X_CMD_ROOT_TMP/extmeta"
    pkg:info --extmeta_tar "$metatar" --metadata_folder "$tgtdir" "Extracting theme metadata"

    [ -d "$tmpdir" ] || ___x_cmd mkdirp "$tmpdir"
    ___x_cmd_cmds tar -xf "$metatar" -C "$tmpdir" "./theme/$___X_CMD_THEME_PKG_VERSION" || N=pkg M="Failed to extract extmeta tar file" log:ret:1
    local tmpdetail="$tmpdir/theme/$___X_CMD_THEME_PKG_VERSION"
    [ -d "$tmpdetail" ] || N=pkg M="Not found extracted extmeta theme folder -> $tmpdetail" log:ret:1

    [ ! -d "$tgtdir" ] || ___x_cmd rmrf "$tgtdir"
    tgtdir="${tgtdir%/*}"
    ___x_cmd mkdirp "$tgtdir"
    ___x_cmd_cmds mv -f "$tmpdetail" "$tgtdir" || return $?
    ___x_cmd rmrf "$tmpdir"
}

# Discard
___x_cmd_pkg_bootupdate___folder(){
    [ -d "$___X_CMD_ROOT_EXTMETA" ]                 || N=pkg M="Not found pkg extmeta folder" log:ret:1
    ___x_cmd_pkg_bootupdate___folder_prepare_pkg    || return $?
    ___x_cmd_pkg_bootupdate___folder_prepare_advise || return $?
    ___x_cmd_pkg_bootupdate___folder_prepare_theme
}

___x_cmd_pkg_bootupdate___folder_prepare_pkg(){
    # [ ! -f "$___X_CMD_PKG_FP_UPDATED_DONE" ] || return 0
    # [ ! -d "$___X_CMD_METADATA_FOLDER" ] || return 0

    local metadir="$___X_CMD_ROOT_EXTMETA/pkg/$___X_CMD_PKG_VERSION"
    [ -d "$metadir" ] || N=pkg M="Not found pkg extmeta folder -> $metadir" log:ret:1

    pkg:info --extmeta_pkg "$metadir" --metadata_folder "$___X_CMD_METADATA_FOLDER" "Preparing pkg metadata"
    local tgtdir="$___X_CMD_METADATA_FOLDER"
    [ ! -d "$tgtdir" ] || ___x_cmd rmrf "$tgtdir"
    tgtdir="${tgtdir%/*}"
    ___x_cmd mkdirp "$tgtdir"
    ___x_cmd_cmds cp -r "$metadir" "$tgtdir"

    ___x_cmd ensurefp "$___X_CMD_PKG_FP_UPDATED_DONE"
    printf "%s\n" "" > "$___X_CMD_PKG_FP_UPDATED_DONE"
}

___x_cmd_pkg_bootupdate___folder_prepare_advise(){
    xrc:mod:lib advise env
    # [ ! -d "$___X_CMD_ADVISE_MAN_XCMD_FOLDER" ] || return 0

    local metadir="$___X_CMD_ROOT_EXTMETA/advise/$___X_CMD_ADVISE_MAN_PKG_XCMD_VERSION"
    [ -d "$metadir" ] || N=advise M="Not found advise extmeta folder -> $metadir" log:ret:1

    pkg:info --extmeta_advise "$metadir" --metadata_folder "$___X_CMD_ADVISE_MAN_XCMD_FOLDER" "Preparing x-cmd/advise metadata"
    local tgtdir="$___X_CMD_ADVISE_MAN_XCMD_FOLDER"
    [ ! -d "$tgtdir" ] || ___x_cmd rmrf "$tgtdir"
    tgtdir="${tgtdir%/*}"
    ___x_cmd mkdirp "$tgtdir"
    ___x_cmd_cmds cp -r "$metadir" "$tgtdir"
    ___x_cmd touch "$___X_CMD_ADVISE_MAN_XCMD_FOLDER/timefile"
    ___x_cmd advise __rm_bootcode
}

___x_cmd_pkg_bootupdate___folder_prepare_theme(){
    xrc:mod:lib theme envvar
    # [ ! -d "$___X_CMD_THEME_DATA_PATH" ] || return 0

    local metadir="$___X_CMD_ROOT_EXTMETA/theme/$___X_CMD_THEME_PKG_VERSION"
    [ -d "$metadir" ] || N=theme M="Not found theme extmeta folder -> $metadir" log:ret:1

    pkg:info --extmeta_theme "$metadir" --metadata_folder "$___X_CMD_THEME_DATA_PATH" "Preparing theme metadata"
    local tgtdir="$___X_CMD_THEME_DATA_PATH"
    [ ! -d "$tgtdir" ] || ___x_cmd rmrf "$tgtdir"
    tgtdir="${tgtdir%/*}"
    ___x_cmd mkdirp "$tgtdir"
    ___x_cmd_cmds cp -r "$metadir" "$tgtdir"
}

