# shellcheck    shell=dash
# ape run
___x_cmd_cosmo___ape(){
    [ $# -gt 0 ] ||  set -   --help
    local op="$1";  shift
    case "$op" in
        register)   ___x_cmd_cosmo___ape_register     "$@" ;;
        run|--)     ___x_cmd_cosmo___ape_run          "$@" ;;
        -h|--help)  ___x_cmd help -m cosmo --ape; return   ;;
        *)          ___x_cmd_cosmo___ape_run "$op"    "$@" ;;
    esac
}

# Only works for linux/{x64,arm64}
___x_cmd_cosmo___ape_register(){
    local x_=""
    ___x_cmd os name_
    ___x_cmd os arch_
    local platform="$___X_CMD_OS_NAME_/$___X_CMD_OS_ARCH_"
    case "$platform" in
        linux/x64)      x_="ape-x8664.elf"   ;;
        linux/arm64)    x_="ape-aarch64.elf" ;;
        # darwin/x64)     x_=ape-x8664.macho ;;
        # *)              ___x_cmd_cmds cp "$___X_CMD_COSMO_BIN_PATH/$bin" "$tgt" ;;
    esac

    [ -n "$x_" ] || {
        cosmo:info "Current OS/ARCH is $platform. APE register is to fix problem in platform linux/{x64,arm64}."
        return 0
    }

    local apebinpath="$___X_CMD_COSMO_BIN_PATH/${___X_CMD_COSMO_VERSION}/$x_"
    [ -f "$apebinpath" ] || {
        ___x_cmd_cosmo___add "$x_" || return $?
    }

    ___x_cmd_shq1_ "$apebinpath"
    cosmo:warn "using sudo update [file=/proc/sys/fs/binfmt_misc/register]"
    ___x_cmd sudo sh -c '
        cp '"$x_"' /usr/bin/ape && {
            echo ':APE:M::MZqFpD::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register
            echo ':APE-jart:M::jartsr::/usr/bin/ape:' >/proc/sys/fs/binfmt_misc/register
        }
    '
}

___x_cmd_cosmo___ape_run(){
    local bin="$1";     shift
    ___x_cmd_cosmo___hasbin "$bin" || {
        N=cosmo M="Not found bin => $bin " log:ret:1
        return
    }

    local x_;   ___x_cmd_cosmo___binpath_ "$bin";   local tgt="$x_"

    [ -f "$tgt" ] || {
        ___x_cmd_cosmo___add "$bin" || return $?
    }

    local ___X_CMD_OS_NAME_=
    local ___X_CMD_OS_ARCH_=
    ___x_cmd os name_
    ___x_cmd os arch_
    case "$___X_CMD_OS_NAME_/$___X_CMD_OS_ARCH_" in
        linux/x64)      ___x_cmd_cosmo___rrun   "ape-x8664.elf"   "$tgt" "$@" ;;
        linux/arm64)    ___x_cmd_cosmo___rrun   "ape-arm64.elf"   "$tgt" "$@" ;;
        darwin/x64)     ___x_cmd_cosmo___rrun   "ape-x8664.macho" "$tgt" "$@" ;;
        *)              ___x_cmd_cosmo___rrun   "$bin" "$@"                   ;;
    esac
}

