# shellcheck shell=dash

___x_cmd_luarocks_src(){
    [ $# -gt 0 ] || set - --help

    local op="$1";  shift
    case "$op" in
        -h|--help)      ___x_cmd help -m lua rocks ;;
        install)        ___x_cmd_luarocks_src_install      "$@" ;;
        # uninstall)      ___x_cmd_luarocks_src_uninstall    "$@" ;;

        exec)           ___x_cmd_luarocks_src_exec         "$@" ;;
    esac
}

# now we just need to freeze one version

___X_CMD_LUA_VERSION="3.11.0"
___X_CMD_LUA_FILE="luarocks-${___X_CMD_LUA_VERSION}.tar.gz"
___X_CMD_LUAROCKS_SRC_URL="https://luarocks.org/releases/${___X_CMD_LUA_FILE}"

___x_cmd_luarocks_TMP="$___X_CMD_ROOT_TMP/lua/luarocks"
# Maybe in windows, it is a little bit different

# Install it into the pkg tree -> Using pkg system to manage
# Install it into a special rock data -> The bin will have a problem
# If we are using pkg tree
# If we are not use pkg tree

# If the lua bin is using
# If the path bin is using

___x_cmd_luarocks_BINDIR="${___X_CMD_ROOT_DATA}/rock"

___x_cmd_luarocks_src_install(){
    ___x_cmd_hascmd luarocks || {
        ___x_cmd env try luarocks="v${___X_CMD_LUA_VERSION}"
    }

    # local sourcepath="$___x_cmd_luarocks_TMP"
    # local installpath="$2"      # ___X_CMD_LUAROCKS_PREFIX
    # local luapath="$3"          # ___X_CMD_LUAROCKS_LUAPATH

    # ___x_cmd_luarocks_src_download "$sourcepath/$___X_CMD_LUA_VERSION.tar.gz"
    # ___x_cmd uz "$sourcepath/$___X_CMD_LUA_VERSION.tar.gz" "$sourcepath"

    # ___x_cmd_luarocks_src_make "$sourcepath/luarocks-${___X_CMD_LUA_VERSION}" "$___X_CMD_LUAROCKS_PREFIX" "$___X_CMD_LUAROCKS_LUAPATH"
}

___x_cmd_luarocks_src_download(){
    local tgtpath="${1:-"$___x_cmd_luarocks_TMP/$___X_CMD_LUA_VERSION.tar.gz"}"
    ___x_cmd ensurefp "$tgtpath"
    luarocks:info \
        -m "Download luarocks source code, thanks to the courtesy of ${___X_CMD_LUAROCKS_SRC_URL%/"${___X_CMD_LUAROCKS_SRC_URL#*//*/}"}" \
        --url "$___X_CMD_LUAROCKS_SRC_URL" --tgtpath "$tgtpath" --version "$___X_CMD_LUA_VERSION"
    ___x_cmd curl -L -o "$tgtpath" "$___X_CMD_LUAROCKS_SRC_URL" || {
        luarocks:info "luarocks source code download failed."
        return 1
    }
}

___x_cmd_luarocks_src_make(){
    local sourcepath="$1"       # luarocks source code path
    local installpath="$2"      # ___X_CMD_LUAROCKS_PREFIX
    local luapath="$3"          # ___X_CMD_LUAROCKS_LUAPATH

    (
        ___x_cmd_cmds_cd "${sourcepath}"
        ___x_cmd_hascmd unzip || ___x_cmd_luarocks_src_prepareunzip

        luarocks:info \
            -m "Make luarocks source code"                                  \
            --source-code "$sourcepath" --version "$___X_CMD_LUA_VERSION"   \
            --install-dir "$installpath" --with-lua "$luapath"
        ./configure \
            --prefix "$installpath"                 \
            --with-lua "$luapath"                   \
            && ___x_cmd cosmo make && DESTDIR="" ___x_cmd cosmo make install

        ___x_cmd touch "$DESTDIR/.x-cmd.install.done"
    )
}

___x_cmd_luarocks_src_remove(){
    local tgtpath="$1"
    (
        ___x_cmd_cd "$tgtpath/.."
        {
            [ -d ".x-cmd/.x-cmd.install.done" ]
        } || {
            luarocks:info "The containing folder has not bin/luarocks."
            return 1
        }
        ___x_cmd rmrf .
    )
}

___X_CMD_LUAROCKS_INSTANCE_PATH=""
___x_cmd_luarocks_src_exec(){
    local bin="$1"; shift
    "${___X_CMD_LUAROCKS_INSTANCE_PATH}/usr/bin/$bin" "$@"
}


# ___x_cmd_luajit_rock___exec(){
#     ___x_cmd_hascmd luarocks || ___x_cmd env try luarocks || return $?

#     ___x_cmd_luajit_rock___exec(){
#         ___x_cmd_cmds luarocks --lua-version 5.1 "$@"
#     }

#     ___x_cmd_luajit_rock___exec "$@"
# }


___x_cmd_luarocks_src_prepareunzip(){
    # TODO: Use ape and bin together
    ___x_cmd cosmo --install unzip "$___X_CMD_ROOT_LUAROCKS/bin"
}
