#! /bin/bash
# vim: shiftwidth=4 tabstop=4 expandtab

declare -ra VIRSH_SUPPORTED_ARGS=(
    --inactive
    --all
    --transient
    --persistent
    --with-snapshot
    --without-snapshot
    --with-checkpoint
    --without-checkpoint
    --state-running
    --state-paused
    --state-shutoff
    --state-other
    --autostart
    --no-autostart
    --with-managed-save
    --without-managed-save
    --table
    --managed-save
    --title
)
declare -ra VIRSH_SHORT_ANSWER_SUPPORTED_ARGS=(
    --uuid
    --name
    --id
)
declare -rA VIRSH_SUPPORTED_ARGS_ALIASES=( ["-i"]="--inactive" ["-a"]="--all" )

# Auto-complete twik: allow sourcing this file from complete command to get supported args & alias
[[ ${IN_AUTOCOMPLETER:-0} -eq 1 ]] && return

if in_array "${COMMAND_ARGS[0]}" --help -h help; then
    echo "$COMMAND [$( implode "|" "${!VIRSH_SUPPORTED_ARGS_ALIASES[@]}" )]"
    if [ "${COMMAND_ARGS[1]}" == "details" ]; then
        echo "  List cluster VMs"
        for ARG in "${VIRSH_SUPPORTED_ARGS[@]}" "${VIRSH_SHORT_ANSWER_SUPPORTED_ARGS[@]}"; do
            ALIAS=()
            for alias in "${!VIRSH_SUPPORTED_ARGS_ALIASES[@]}"; do
                [[ "${VIRSH_SUPPORTED_ARGS_ALIASES[$alias]}" == "$ARG" ]] && ALIAS+=( "$alias" )
            done
            ALIAS+=( "$ARG" )
            echo "    $( implode "|" "${ALIAS[@]}" )"
        done
    fi
    return
fi

VIRSH_ARGS=()
SHORT_ANSWER=0
for ARG in "${COMMAND_ARGS[@]}"; do
    if in_array "$ARG" "${VIRSH_SUPPORTED_ARGS[@]}"; then
        VIRSH_ARGS+=( "$ARG" )
    elif in_array "$ARG" "${VIRSH_SHORT_ANSWER_SUPPORTED_ARGS[@]}"; then
        VIRSH_ARGS+=( "$ARG" )
        SHORT_ANSWER=1
    elif [[ "${VIRSH_SUPPORTED_ARGS_ALIASES[$ARG]:-null}" != "null" ]]; then
        ARG="${VIRSH_SUPPORTED_ARGS_ALIASES[$ARG]}"
        in_array "$ARG" "${VIRSH_SHORT_ANSWER_SUPPORTED_ARGS[@]}" && SHORT_ANSWER=1
        VIRSH_ARGS+=( "$ARG" )
    else
        usage "Unknown parameter '$ARG'"
    fi
done

# Deduplicate and sort virsh args
mapfile -t VIRSH_ARGS < <( implode $'\n' "${VIRSH_ARGS[@]}" | sort -u )

# Generate cache file path
get_cache_file_path \
    "vm_ls.$( echo "$HYPS|$( implode " " "${VIRSH_ARGS[@]}" )" | md5sum | awk '{print $1}' )" \
    CACHE_FILE

if [[ -n "$GENERATE_SCRIPT" ]]; then
    for HYP in $HYPS; do
        # shellcheck disable=SC2028
        echo "'$REAL_VIRSH' -c 'qemu+ssh://$HYP/system' list $( implode " " "${VIRSH_ARGS[@]}" ) |" \
            "grep -E '^\s+[0-9\-]' | sed 's/^/$HYP\t/'" >> "$GENERATE_SCRIPT"
    done
    exit 0
fi

if [[ -e "$CACHE_FILE" ]]; then
    log DEBUG "Retrieve list from cache (path: $CACHE_FILE)."
    cat "$CACHE_FILE"
    exit 0
fi

rm -f "$CACHE_FILE"
for HYP in $HYPS; do
    CMD=( "$REAL_VIRSH" -c "qemu+ssh://$HYP/system" list "${VIRSH_ARGS[@]}" )
    debug "Run '$( implode "', '" "${CMD[@]}" )'"
    if [[ $SHORT_ANSWER -eq 1 ]]; then
        run_external "${CMD[@]}" | grep -vE '^$' | sed "s/^/$HYP\t/" | tee -a "$CACHE_FILE"
    else
        run_external "${CMD[@]}" | \
            grep -E '^\s+[0-9\-]' | \
            sed "s/^/$HYP\t/" | tee -a "$CACHE_FILE"
    fi
done
