#!/bin/bash
# aur-query - interface with AurJson
[[ -v AUR_DEBUG ]] && set -o xtrace
argv0=query
AUR_LOCATION=${AUR_LOCATION:-https://aur.archlinux.org}
AUR_QUERY_PARALLEL=${AUR_QUERY_PARALLEL:-0}
AUR_QUERY_PARALLEL_MAX=${AUR_QUERY_PARALLEL_MAX:-15}
AUR_QUERY_RPC=${AUR_QUERY_RPC:-$AUR_LOCATION/rpc/?v=5}
AUR_QUERY_RPC_SPLITNO=${AUR_QUERY_RPC_SPLITNO:-150}
PS4='+(${BASH_SOURCE}:${LINENO}):${FUNCNAME[0]:+${FUNCNAME[0]}(): }'

# default arguments
curl_args=(-fgLsS --tcp-fastopen)

uri_info() {
    awk -v rpc="$AUR_QUERY_RPC&type=info" -v splitno="$AUR_QUERY_RPC_SPLITNO" '{
        if (NR == 1)
            printf "%s&arg[]=%s", rpc, $0
        else if (NR % splitno == 0)
            printf "\n%s&arg[]=%s", rpc, $0
        else if (NR > 1)
            printf "&arg[]=%s", $0
    } END {
        if (NR != 0)
            printf "\n"
    }'
}

uri_search() {
    awk -v rpc="$AUR_QUERY_RPC&type=search&by=$1&arg" '{
        printf "%s=%s\n", rpc, $0
    }'
}

trap_exit() {
    if [[ ! -v AUR_DEBUG ]]; then
        rm -rf -- "$tmp"
    else
        printf >&2 'AUR_DEBUG: %s: temporary files at %s\n' "$argv0" "$tmp"
    fi
}

usage() {
    printf 'usage: %s [-t [info|search] ] [-b by] <package...>\n' "$argv0" >&2
    exit 1
}

source /usr/share/makepkg/util/parseopts.sh

opt_short='b:t:'
opt_long=('by:' 'type:')
opt_hidden=('dump-options')

if ! parseopts "$opt_short" "${opt_long[@]}" "${opt_hidden[@]}" -- "$@"; then
    usage
fi
set -- "${OPTRET[@]}"

unset arg_by arg_type
while true; do
    case "$1" in
        -b|--by)
            shift; arg_by=$1 ;;
        -t|--type)
            shift; arg_type=$1 ;;
        --dump-options)
            printf -- '--%s\n' "${opt_long[@]}" ${AUR_DEBUG+"${opt_hidden[@]}"}
            printf -- '%s' "${opt_short}" | sed 's/.:\?/-&\n/g'
            exit ;;
        --) shift; break ;;
    esac
    shift
done

# shellcheck disable=SC2174
mkdir -pm 0700 "${TMPDIR:-/tmp}/aurutils-$UID"
tmp=$(mktemp -d --tmpdir "aurutils-$UID/$argv0.XXXXXXXX") || exit
trap 'trap_exit' EXIT

# Single hyphen to denote input taken from stdin
stdin=0
if (( $# == 1 )) && [[ $1 == "-" || $1 == "/dev/stdin" ]]; then
    stdin=1
fi

if (( ! $# )); then
    usage
fi

# set filters
case $arg_type in
      info) uri_write() { uri_info; } ;;
    search) uri_write() { uri_search "${arg_by:-name-desc}"; } ;;
         *) usage ;;
esac

# generate curl config
if (( stdin )); then
    tee # noop
else
    printf '%s\n' "$@"
fi | jq -R -r '@uri' | uri_write | while IFS= read -r uri; do
    printf 'url "%s"\n' "$uri"
done > "$tmp"/config

# exit cleanly on empty input (#706)
if [[ ! -s $tmp/config ]]; then
    exit
fi

# support parallel transfers (curl >7.66.0)
if (( AUR_QUERY_PARALLEL )); then
    # curl 7.77.0: tool_operate: don't discard failed parallel transfer result
    curl_args+=(--parallel --parallel-max "$AUR_QUERY_PARALLEL_MAX")
fi
curl "${curl_args[@]}" -K "$tmp"/config

# vim: set et sw=4 sts=4 ft=sh:
