#!/usr/bin/env zsh

emulate zsh -o extended_glob -o no_unset -o warn_create_global

##
# Compares options in `rg --help` output to options in zsh completion function

get_comp_args() {
    # Technically there are many options that the completion system sets that
    # our function may rely on, but we'll trust that we've got it mostly right
    setopt local_options unset

    # Our completion function recognises a special variable which tells it to
    # dump the _arguments specs and then just return. But do this in a sub-shell
    # anyway to avoid any weirdness
    ( _RG_COMPLETE_LIST_ARGS=1 source $1 )
}

main() {
    local diff
    local  rg=${ZSH_ARGZERO:a:h}/../${TARGET_DIR:-target}/release/rg
    local _rg=${ZSH_ARGZERO:a:h}/../crates/core/flags/complete/rg.zsh
    local -a help_args comp_args

    [[ -e $rg ]] || rg=${rg/%\/release\/rg/\/debug\/rg}

     rg=${rg:a}
    _rg=${_rg:a}

    [[ -e $rg ]] || {
        print -ru2 - "${ZSH_ARGZERO:t}: rg not found: $rg"
        return 1
    }
    [[ -e $_rg ]] || {
        print -ru2 - "${ZSH_ARGZERO:t}: _rg not found: $_rg"
        return 1
    }

    print -rl - 'Comparing options:' "-$rg" "+$_rg"

    # 'Parse' options out of the `--help` output. To prevent false positives we
    # only look at lines where the first non-white-space character is `-`, or
    # where a long option starting with certain letters (see `_rg`) is found.
    # Occasionally we may have to handle some manually, however
    help_args=( ${(f)"$(
        $rg --help |
        $rg -i -- '^\s+--?[a-z0-9.]|--[a-z]' |
        $rg -ior '$1' -- $'[\t /\"\'`.,](-[a-z0-9.]|--[a-z0-9-]+)(,|\\b)' |
        $rg -vw -- --print0 # False positives
    )"} )
    help_args=( ${(ou)help_args} )

    # 'Parse' options out of the completion function
    comp_args=( ${(f)"$( get_comp_args $_rg )"} )
    comp_args=( ${comp_args#\!}       ) # Strip hidden indicator
    comp_args=( ${comp_args#\(*\)}    ) # Strip excluded options
    comp_args=( ${comp_args#\*}       ) # Strip repetition indicator
    comp_args=( ${comp_args%%-[:[]*}  ) # Strip everything after -optname-
    comp_args=( ${comp_args%%[:+=[]*} ) # Strip everything after other optspecs
    comp_args=( ${comp_args##[^-]*}   ) # Remove non-options
    comp_args=( ${(ou)comp_args} )

    (( $#help_args )) || {
        print -ru2 - "${ZSH_ARGZERO:t}: Failed to get help_args"
        return 1
    }
    (( $#comp_args )) || {
        print -ru2 - "${ZSH_ARGZERO:t}: Failed to get comp_args"
        return 1
    }

    diff=$(
        diff -U2 \
            -L 'rg --help' \
            -L '_rg' \
            =( print -rl - $help_args ) =( print -rl - $comp_args )
    )

    (( $#diff )) && {
        print -ru2 - "${ZSH_ARGZERO:t}: zsh completion options differ from --help options:"
        print -rlu2 - $diff
        return 1
    }
    print -r - OK
    return 0
}

main "$@"
